diff --git a/3rdparty/libe2ap/ANY.c b/3rdparty/E2AP-v01.00.00/ANY.c
similarity index 100%
rename from 3rdparty/libe2ap/ANY.c
rename to 3rdparty/E2AP-v01.00.00/ANY.c
diff --git a/3rdparty/libe2ap/ANY.h b/3rdparty/E2AP-v01.00.00/ANY.h
similarity index 100%
rename from 3rdparty/libe2ap/ANY.h
rename to 3rdparty/E2AP-v01.00.00/ANY.h
diff --git a/3rdparty/libe2ap/BIT_STRING.c b/3rdparty/E2AP-v01.00.00/BIT_STRING.c
similarity index 100%
rename from 3rdparty/libe2ap/BIT_STRING.c
rename to 3rdparty/E2AP-v01.00.00/BIT_STRING.c
diff --git a/3rdparty/libe2ap/BIT_STRING.h b/3rdparty/E2AP-v01.00.00/BIT_STRING.h
similarity index 100%
rename from 3rdparty/libe2ap/BIT_STRING.h
rename to 3rdparty/E2AP-v01.00.00/BIT_STRING.h
diff --git a/3rdparty/E2AP-v01.00.00/Cause.c b/3rdparty/E2AP-v01.00.00/Cause.c
new file mode 100644
index 0000000..2a93400
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/Cause.c
@@ -0,0 +1,92 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "Cause.h"
+
+asn_per_constraints_t asn_PER_type_Cause_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  4 }	/* (0..4,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+asn_TYPE_member_t asn_MBR_Cause_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct Cause, choice.ricRequest),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_CauseRIC,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ricRequest"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct Cause, choice.ricService),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_CauseRICservice,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ricService"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct Cause, choice.transport),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_CauseTransport,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"transport"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct Cause, choice.protocol),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_CauseProtocol,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocol"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct Cause, choice.misc),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_CauseMisc,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"misc"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_Cause_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricRequest */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ricService */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* transport */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* protocol */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* misc */
+};
+asn_CHOICE_specifics_t asn_SPC_Cause_specs_1 = {
+	sizeof(struct Cause),
+	offsetof(struct Cause, _asn_ctx),
+	offsetof(struct Cause, present),
+	sizeof(((struct Cause *)0)->present),
+	asn_MAP_Cause_tag2el_1,
+	5,	/* Count of tags in the map */
+	0, 0,
+	5	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_Cause = {
+	"Cause",
+	"Cause",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_Cause_constr_1, CHOICE_constraint },
+	asn_MBR_Cause_1,
+	5,	/* Elements count */
+	&asn_SPC_Cause_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/Cause.h b/3rdparty/E2AP-v01.00.00/Cause.h
new file mode 100644
index 0000000..a73e9e0
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/Cause.h
@@ -0,0 +1,68 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_Cause_H_
+#define	_Cause_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "CauseRIC.h"
+#include "CauseRICservice.h"
+#include "CauseTransport.h"
+#include "CauseProtocol.h"
+#include "CauseMisc.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Cause_PR {
+	Cause_PR_NOTHING,	/* No components present */
+	Cause_PR_ricRequest,
+	Cause_PR_ricService,
+	Cause_PR_transport,
+	Cause_PR_protocol,
+	Cause_PR_misc
+	/* Extensions may appear below */
+	
+} Cause_PR;
+
+/* Cause */
+typedef struct Cause {
+	Cause_PR present;
+	union Cause_u {
+		CauseRIC_t	 ricRequest;
+		CauseRICservice_t	 ricService;
+		CauseTransport_t	 transport;
+		CauseProtocol_t	 protocol;
+		CauseMisc_t	 misc;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Cause_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Cause;
+extern asn_CHOICE_specifics_t asn_SPC_Cause_specs_1;
+extern asn_TYPE_member_t asn_MBR_Cause_1[5];
+extern asn_per_constraints_t asn_PER_type_Cause_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Cause_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/CauseMisc.c b/3rdparty/E2AP-v01.00.00/CauseMisc.c
new file mode 100644
index 0000000..6158de3
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CauseMisc.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "CauseMisc.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_CauseMisc_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  3 }	/* (0..3,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_CauseMisc_value2enum_1[] = {
+	{ 0,	27,	"control-processing-overload" },
+	{ 1,	16,	"hardware-failure" },
+	{ 2,	15,	"om-intervention" },
+	{ 3,	11,	"unspecified" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_CauseMisc_enum2value_1[] = {
+	0,	/* control-processing-overload(0) */
+	1,	/* hardware-failure(1) */
+	2,	/* om-intervention(2) */
+	3	/* unspecified(3) */
+	/* This list is extensible */
+};
+const asn_INTEGER_specifics_t asn_SPC_CauseMisc_specs_1 = {
+	asn_MAP_CauseMisc_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_CauseMisc_enum2value_1,	/* N => "tag"; sorted by N */
+	4,	/* Number of elements in the maps */
+	5,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_CauseMisc_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_CauseMisc = {
+	"CauseMisc",
+	"CauseMisc",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_CauseMisc_tags_1,
+	sizeof(asn_DEF_CauseMisc_tags_1)
+		/sizeof(asn_DEF_CauseMisc_tags_1[0]), /* 1 */
+	asn_DEF_CauseMisc_tags_1,	/* Same as above */
+	sizeof(asn_DEF_CauseMisc_tags_1)
+		/sizeof(asn_DEF_CauseMisc_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_CauseMisc_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_CauseMisc_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/CauseMisc.h b/3rdparty/E2AP-v01.00.00/CauseMisc.h
new file mode 100644
index 0000000..f952ecb
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CauseMisc.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_CauseMisc_H_
+#define	_CauseMisc_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CauseMisc {
+	CauseMisc_control_processing_overload	= 0,
+	CauseMisc_hardware_failure	= 1,
+	CauseMisc_om_intervention	= 2,
+	CauseMisc_unspecified	= 3
+	/*
+	 * Enumeration is extensible
+	 */
+} e_CauseMisc;
+
+/* CauseMisc */
+typedef long	 CauseMisc_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CauseMisc_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CauseMisc;
+extern const asn_INTEGER_specifics_t asn_SPC_CauseMisc_specs_1;
+asn_struct_free_f CauseMisc_free;
+asn_struct_print_f CauseMisc_print;
+asn_constr_check_f CauseMisc_constraint;
+ber_type_decoder_f CauseMisc_decode_ber;
+der_type_encoder_f CauseMisc_encode_der;
+xer_type_decoder_f CauseMisc_decode_xer;
+xer_type_encoder_f CauseMisc_encode_xer;
+per_type_decoder_f CauseMisc_decode_uper;
+per_type_encoder_f CauseMisc_encode_uper;
+per_type_decoder_f CauseMisc_decode_aper;
+per_type_encoder_f CauseMisc_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CauseMisc_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/CauseProtocol.c b/3rdparty/E2AP-v01.00.00/CauseProtocol.c
new file mode 100644
index 0000000..8928c43
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CauseProtocol.c
@@ -0,0 +1,65 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "CauseProtocol.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_CauseProtocol_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  6 }	/* (0..6,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_CauseProtocol_value2enum_1[] = {
+	{ 0,	21,	"transfer-syntax-error" },
+	{ 1,	28,	"abstract-syntax-error-reject" },
+	{ 2,	39,	"abstract-syntax-error-ignore-and-notify" },
+	{ 3,	42,	"message-not-compatible-with-receiver-state" },
+	{ 4,	14,	"semantic-error" },
+	{ 5,	49,	"abstract-syntax-error-falsely-constructed-message" },
+	{ 6,	11,	"unspecified" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_CauseProtocol_enum2value_1[] = {
+	5,	/* abstract-syntax-error-falsely-constructed-message(5) */
+	2,	/* abstract-syntax-error-ignore-and-notify(2) */
+	1,	/* abstract-syntax-error-reject(1) */
+	3,	/* message-not-compatible-with-receiver-state(3) */
+	4,	/* semantic-error(4) */
+	0,	/* transfer-syntax-error(0) */
+	6	/* unspecified(6) */
+	/* This list is extensible */
+};
+const asn_INTEGER_specifics_t asn_SPC_CauseProtocol_specs_1 = {
+	asn_MAP_CauseProtocol_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_CauseProtocol_enum2value_1,	/* N => "tag"; sorted by N */
+	7,	/* Number of elements in the maps */
+	8,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_CauseProtocol_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_CauseProtocol = {
+	"CauseProtocol",
+	"CauseProtocol",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_CauseProtocol_tags_1,
+	sizeof(asn_DEF_CauseProtocol_tags_1)
+		/sizeof(asn_DEF_CauseProtocol_tags_1[0]), /* 1 */
+	asn_DEF_CauseProtocol_tags_1,	/* Same as above */
+	sizeof(asn_DEF_CauseProtocol_tags_1)
+		/sizeof(asn_DEF_CauseProtocol_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_CauseProtocol_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_CauseProtocol_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/CauseProtocol.h b/3rdparty/E2AP-v01.00.00/CauseProtocol.h
new file mode 100644
index 0000000..e15b683
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CauseProtocol.h
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_CauseProtocol_H_
+#define	_CauseProtocol_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CauseProtocol {
+	CauseProtocol_transfer_syntax_error	= 0,
+	CauseProtocol_abstract_syntax_error_reject	= 1,
+	CauseProtocol_abstract_syntax_error_ignore_and_notify	= 2,
+	CauseProtocol_message_not_compatible_with_receiver_state	= 3,
+	CauseProtocol_semantic_error	= 4,
+	CauseProtocol_abstract_syntax_error_falsely_constructed_message	= 5,
+	CauseProtocol_unspecified	= 6
+	/*
+	 * Enumeration is extensible
+	 */
+} e_CauseProtocol;
+
+/* CauseProtocol */
+typedef long	 CauseProtocol_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CauseProtocol_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CauseProtocol;
+extern const asn_INTEGER_specifics_t asn_SPC_CauseProtocol_specs_1;
+asn_struct_free_f CauseProtocol_free;
+asn_struct_print_f CauseProtocol_print;
+asn_constr_check_f CauseProtocol_constraint;
+ber_type_decoder_f CauseProtocol_decode_ber;
+der_type_encoder_f CauseProtocol_encode_der;
+xer_type_decoder_f CauseProtocol_decode_xer;
+xer_type_encoder_f CauseProtocol_encode_xer;
+per_type_decoder_f CauseProtocol_decode_uper;
+per_type_encoder_f CauseProtocol_encode_uper;
+per_type_decoder_f CauseProtocol_decode_aper;
+per_type_encoder_f CauseProtocol_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CauseProtocol_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/CauseRIC.c b/3rdparty/E2AP-v01.00.00/CauseRIC.c
new file mode 100644
index 0000000..a9f9787
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CauseRIC.c
@@ -0,0 +1,73 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "CauseRIC.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_CauseRIC_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  4,  4,  0,  10 }	/* (0..10,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_CauseRIC_value2enum_1[] = {
+	{ 0,	23,	"ran-function-id-Invalid" },
+	{ 1,	20,	"action-not-supported" },
+	{ 2,	17,	"excessive-actions" },
+	{ 3,	16,	"duplicate-action" },
+	{ 4,	15,	"duplicate-event" },
+	{ 5,	23,	"function-resource-limit" },
+	{ 6,	18,	"request-id-unknown" },
+	{ 7,	46,	"inconsistent-action-subsequent-action-sequence" },
+	{ 8,	23,	"control-message-invalid" },
+	{ 9,	23,	"call-process-id-invalid" },
+	{ 10,	11,	"unspecified" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_CauseRIC_enum2value_1[] = {
+	1,	/* action-not-supported(1) */
+	9,	/* call-process-id-invalid(9) */
+	8,	/* control-message-invalid(8) */
+	3,	/* duplicate-action(3) */
+	4,	/* duplicate-event(4) */
+	2,	/* excessive-actions(2) */
+	5,	/* function-resource-limit(5) */
+	7,	/* inconsistent-action-subsequent-action-sequence(7) */
+	0,	/* ran-function-id-Invalid(0) */
+	6,	/* request-id-unknown(6) */
+	10	/* unspecified(10) */
+	/* This list is extensible */
+};
+const asn_INTEGER_specifics_t asn_SPC_CauseRIC_specs_1 = {
+	asn_MAP_CauseRIC_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_CauseRIC_enum2value_1,	/* N => "tag"; sorted by N */
+	11,	/* Number of elements in the maps */
+	12,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_CauseRIC_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_CauseRIC = {
+	"CauseRIC",
+	"CauseRIC",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_CauseRIC_tags_1,
+	sizeof(asn_DEF_CauseRIC_tags_1)
+		/sizeof(asn_DEF_CauseRIC_tags_1[0]), /* 1 */
+	asn_DEF_CauseRIC_tags_1,	/* Same as above */
+	sizeof(asn_DEF_CauseRIC_tags_1)
+		/sizeof(asn_DEF_CauseRIC_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_CauseRIC_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_CauseRIC_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/CauseRIC.h b/3rdparty/E2AP-v01.00.00/CauseRIC.h
new file mode 100644
index 0000000..769a603
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CauseRIC.h
@@ -0,0 +1,63 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_CauseRIC_H_
+#define	_CauseRIC_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CauseRIC {
+	CauseRIC_ran_function_id_Invalid	= 0,
+	CauseRIC_action_not_supported	= 1,
+	CauseRIC_excessive_actions	= 2,
+	CauseRIC_duplicate_action	= 3,
+	CauseRIC_duplicate_event	= 4,
+	CauseRIC_function_resource_limit	= 5,
+	CauseRIC_request_id_unknown	= 6,
+	CauseRIC_inconsistent_action_subsequent_action_sequence	= 7,
+	CauseRIC_control_message_invalid	= 8,
+	CauseRIC_call_process_id_invalid	= 9,
+	CauseRIC_unspecified	= 10
+	/*
+	 * Enumeration is extensible
+	 */
+} e_CauseRIC;
+
+/* CauseRIC */
+typedef long	 CauseRIC_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CauseRIC_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CauseRIC;
+extern const asn_INTEGER_specifics_t asn_SPC_CauseRIC_specs_1;
+asn_struct_free_f CauseRIC_free;
+asn_struct_print_f CauseRIC_print;
+asn_constr_check_f CauseRIC_constraint;
+ber_type_decoder_f CauseRIC_decode_ber;
+der_type_encoder_f CauseRIC_encode_der;
+xer_type_decoder_f CauseRIC_decode_xer;
+xer_type_encoder_f CauseRIC_encode_xer;
+per_type_decoder_f CauseRIC_decode_uper;
+per_type_encoder_f CauseRIC_encode_uper;
+per_type_decoder_f CauseRIC_decode_aper;
+per_type_encoder_f CauseRIC_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CauseRIC_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/CauseRICservice.c b/3rdparty/E2AP-v01.00.00/CauseRICservice.c
new file mode 100644
index 0000000..1c8bf4a
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CauseRICservice.c
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "CauseRICservice.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_CauseRICservice_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_CauseRICservice_value2enum_1[] = {
+	{ 0,	21,	"function-not-required" },
+	{ 1,	19,	"excessive-functions" },
+	{ 2,	18,	"ric-resource-limit" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_CauseRICservice_enum2value_1[] = {
+	1,	/* excessive-functions(1) */
+	0,	/* function-not-required(0) */
+	2	/* ric-resource-limit(2) */
+	/* This list is extensible */
+};
+const asn_INTEGER_specifics_t asn_SPC_CauseRICservice_specs_1 = {
+	asn_MAP_CauseRICservice_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_CauseRICservice_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	4,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_CauseRICservice_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_CauseRICservice = {
+	"CauseRICservice",
+	"CauseRICservice",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_CauseRICservice_tags_1,
+	sizeof(asn_DEF_CauseRICservice_tags_1)
+		/sizeof(asn_DEF_CauseRICservice_tags_1[0]), /* 1 */
+	asn_DEF_CauseRICservice_tags_1,	/* Same as above */
+	sizeof(asn_DEF_CauseRICservice_tags_1)
+		/sizeof(asn_DEF_CauseRICservice_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_CauseRICservice_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_CauseRICservice_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/CauseRICservice.h b/3rdparty/E2AP-v01.00.00/CauseRICservice.h
new file mode 100644
index 0000000..73bd675
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CauseRICservice.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_CauseRICservice_H_
+#define	_CauseRICservice_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CauseRICservice {
+	CauseRICservice_function_not_required	= 0,
+	CauseRICservice_excessive_functions	= 1,
+	CauseRICservice_ric_resource_limit	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_CauseRICservice;
+
+/* CauseRICservice */
+typedef long	 CauseRICservice_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CauseRICservice_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CauseRICservice;
+extern const asn_INTEGER_specifics_t asn_SPC_CauseRICservice_specs_1;
+asn_struct_free_f CauseRICservice_free;
+asn_struct_print_f CauseRICservice_print;
+asn_constr_check_f CauseRICservice_constraint;
+ber_type_decoder_f CauseRICservice_decode_ber;
+der_type_encoder_f CauseRICservice_encode_der;
+xer_type_decoder_f CauseRICservice_decode_xer;
+xer_type_encoder_f CauseRICservice_encode_xer;
+per_type_decoder_f CauseRICservice_decode_uper;
+per_type_encoder_f CauseRICservice_encode_uper;
+per_type_decoder_f CauseRICservice_decode_aper;
+per_type_encoder_f CauseRICservice_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CauseRICservice_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/CauseTransport.c b/3rdparty/E2AP-v01.00.00/CauseTransport.c
new file mode 100644
index 0000000..0f60e30
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CauseTransport.c
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "CauseTransport.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_CauseTransport_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_CauseTransport_value2enum_1[] = {
+	{ 0,	11,	"unspecified" },
+	{ 1,	30,	"transport-resource-unavailable" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_CauseTransport_enum2value_1[] = {
+	1,	/* transport-resource-unavailable(1) */
+	0	/* unspecified(0) */
+	/* This list is extensible */
+};
+const asn_INTEGER_specifics_t asn_SPC_CauseTransport_specs_1 = {
+	asn_MAP_CauseTransport_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_CauseTransport_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_CauseTransport_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_CauseTransport = {
+	"CauseTransport",
+	"CauseTransport",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_CauseTransport_tags_1,
+	sizeof(asn_DEF_CauseTransport_tags_1)
+		/sizeof(asn_DEF_CauseTransport_tags_1[0]), /* 1 */
+	asn_DEF_CauseTransport_tags_1,	/* Same as above */
+	sizeof(asn_DEF_CauseTransport_tags_1)
+		/sizeof(asn_DEF_CauseTransport_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_CauseTransport_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_CauseTransport_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/CauseTransport.h b/3rdparty/E2AP-v01.00.00/CauseTransport.h
new file mode 100644
index 0000000..596d36f
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CauseTransport.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_CauseTransport_H_
+#define	_CauseTransport_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CauseTransport {
+	CauseTransport_unspecified	= 0,
+	CauseTransport_transport_resource_unavailable	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_CauseTransport;
+
+/* CauseTransport */
+typedef long	 CauseTransport_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CauseTransport_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CauseTransport;
+extern const asn_INTEGER_specifics_t asn_SPC_CauseTransport_specs_1;
+asn_struct_free_f CauseTransport_free;
+asn_struct_print_f CauseTransport_print;
+asn_constr_check_f CauseTransport_constraint;
+ber_type_decoder_f CauseTransport_decode_ber;
+der_type_encoder_f CauseTransport_encode_der;
+xer_type_decoder_f CauseTransport_decode_xer;
+xer_type_encoder_f CauseTransport_encode_xer;
+per_type_decoder_f CauseTransport_decode_uper;
+per_type_encoder_f CauseTransport_encode_uper;
+per_type_decoder_f CauseTransport_decode_aper;
+per_type_encoder_f CauseTransport_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CauseTransport_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/Criticality.c b/3rdparty/E2AP-v01.00.00/Criticality.c
new file mode 100644
index 0000000..f017bd7
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/Criticality.c
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-CommonDataTypes"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "Criticality.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_Criticality_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_Criticality_value2enum_1[] = {
+	{ 0,	6,	"reject" },
+	{ 1,	6,	"ignore" },
+	{ 2,	6,	"notify" }
+};
+static const unsigned int asn_MAP_Criticality_enum2value_1[] = {
+	1,	/* ignore(1) */
+	2,	/* notify(2) */
+	0	/* reject(0) */
+};
+const asn_INTEGER_specifics_t asn_SPC_Criticality_specs_1 = {
+	asn_MAP_Criticality_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_Criticality_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_Criticality_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_Criticality = {
+	"Criticality",
+	"Criticality",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_Criticality_tags_1,
+	sizeof(asn_DEF_Criticality_tags_1)
+		/sizeof(asn_DEF_Criticality_tags_1[0]), /* 1 */
+	asn_DEF_Criticality_tags_1,	/* Same as above */
+	sizeof(asn_DEF_Criticality_tags_1)
+		/sizeof(asn_DEF_Criticality_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_Criticality_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_Criticality_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/Criticality.h b/3rdparty/E2AP-v01.00.00/Criticality.h
new file mode 100644
index 0000000..d4ef2d0
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/Criticality.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-CommonDataTypes"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_Criticality_H_
+#define	_Criticality_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Criticality {
+	Criticality_reject	= 0,
+	Criticality_ignore	= 1,
+	Criticality_notify	= 2
+} e_Criticality;
+
+/* Criticality */
+typedef long	 Criticality_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Criticality_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Criticality;
+extern const asn_INTEGER_specifics_t asn_SPC_Criticality_specs_1;
+asn_struct_free_f Criticality_free;
+asn_struct_print_f Criticality_print;
+asn_constr_check_f Criticality_constraint;
+ber_type_decoder_f Criticality_decode_ber;
+der_type_encoder_f Criticality_encode_der;
+xer_type_decoder_f Criticality_decode_xer;
+xer_type_encoder_f Criticality_encode_xer;
+per_type_decoder_f Criticality_decode_uper;
+per_type_encoder_f Criticality_encode_uper;
+per_type_decoder_f Criticality_decode_aper;
+per_type_encoder_f Criticality_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Criticality_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics-IE-Item.c b/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics-IE-Item.c
new file mode 100644
index 0000000..b5901a5
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics-IE-Item.c
@@ -0,0 +1,70 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "CriticalityDiagnostics-IE-Item.h"
+
+asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_Item, iECriticality),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"iECriticality"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_Item, iE_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"iE-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_Item, typeOfError),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_TypeOfError,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"typeOfError"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_CriticalityDiagnostics_IE_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_CriticalityDiagnostics_IE_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* iECriticality */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iE-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* typeOfError */
+};
+asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_IE_Item_specs_1 = {
+	sizeof(struct CriticalityDiagnostics_IE_Item),
+	offsetof(struct CriticalityDiagnostics_IE_Item, _asn_ctx),
+	asn_MAP_CriticalityDiagnostics_IE_Item_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	3,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_Item = {
+	"CriticalityDiagnostics-IE-Item",
+	"CriticalityDiagnostics-IE-Item",
+	&asn_OP_SEQUENCE,
+	asn_DEF_CriticalityDiagnostics_IE_Item_tags_1,
+	sizeof(asn_DEF_CriticalityDiagnostics_IE_Item_tags_1)
+		/sizeof(asn_DEF_CriticalityDiagnostics_IE_Item_tags_1[0]), /* 1 */
+	asn_DEF_CriticalityDiagnostics_IE_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_CriticalityDiagnostics_IE_Item_tags_1)
+		/sizeof(asn_DEF_CriticalityDiagnostics_IE_Item_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_CriticalityDiagnostics_IE_Item_1,
+	3,	/* Elements count */
+	&asn_SPC_CriticalityDiagnostics_IE_Item_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics-IE-Item.h b/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics-IE-Item.h
new file mode 100644
index 0000000..9717de6
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics-IE-Item.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_CriticalityDiagnostics_IE_Item_H_
+#define	_CriticalityDiagnostics_IE_Item_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "Criticality.h"
+#include "ProtocolIE-ID.h"
+#include "TypeOfError.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* CriticalityDiagnostics-IE-Item */
+typedef struct CriticalityDiagnostics_IE_Item {
+	Criticality_t	 iECriticality;
+	ProtocolIE_ID_t	 iE_ID;
+	TypeOfError_t	 typeOfError;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CriticalityDiagnostics_IE_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_IE_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_Item_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CriticalityDiagnostics_IE_Item_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics-IE-List.c b/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics-IE-List.c
new file mode 100644
index 0000000..c500ec2
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics-IE-List.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "CriticalityDiagnostics-IE-List.h"
+
+#include "CriticalityDiagnostics-IE-Item.h"
+asn_per_constraints_t asn_PER_type_CriticalityDiagnostics_IE_List_constr_1 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
+	0, 0	/* No PER value map */
+};
+asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_CriticalityDiagnostics_IE_Item,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_CriticalityDiagnostics_IE_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_CriticalityDiagnostics_IE_List_specs_1 = {
+	sizeof(struct CriticalityDiagnostics_IE_List),
+	offsetof(struct CriticalityDiagnostics_IE_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_List = {
+	"CriticalityDiagnostics-IE-List",
+	"CriticalityDiagnostics-IE-List",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_CriticalityDiagnostics_IE_List_tags_1,
+	sizeof(asn_DEF_CriticalityDiagnostics_IE_List_tags_1)
+		/sizeof(asn_DEF_CriticalityDiagnostics_IE_List_tags_1[0]), /* 1 */
+	asn_DEF_CriticalityDiagnostics_IE_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_CriticalityDiagnostics_IE_List_tags_1)
+		/sizeof(asn_DEF_CriticalityDiagnostics_IE_List_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_CriticalityDiagnostics_IE_List_constr_1, SEQUENCE_OF_constraint },
+	asn_MBR_CriticalityDiagnostics_IE_List_1,
+	1,	/* Single element */
+	&asn_SPC_CriticalityDiagnostics_IE_List_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics-IE-List.h b/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics-IE-List.h
new file mode 100644
index 0000000..c5faa7a
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics-IE-List.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_CriticalityDiagnostics_IE_List_H_
+#define	_CriticalityDiagnostics_IE_List_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "asn_SEQUENCE_OF.h"
+#include "constr_SEQUENCE_OF.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct CriticalityDiagnostics_IE_Item;
+
+/* CriticalityDiagnostics-IE-List */
+typedef struct CriticalityDiagnostics_IE_List {
+	A_SEQUENCE_OF(struct CriticalityDiagnostics_IE_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CriticalityDiagnostics_IE_List_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_List;
+extern asn_SET_OF_specifics_t asn_SPC_CriticalityDiagnostics_IE_List_specs_1;
+extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_List_1[1];
+extern asn_per_constraints_t asn_PER_type_CriticalityDiagnostics_IE_List_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CriticalityDiagnostics_IE_List_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics.c b/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics.c
new file mode 100644
index 0000000..02792e0
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics.c
@@ -0,0 +1,94 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "CriticalityDiagnostics.h"
+
+#include "RICrequestID.h"
+#include "CriticalityDiagnostics-IE-List.h"
+static asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_1[] = {
+	{ ATF_POINTER, 5, offsetof(struct CriticalityDiagnostics, procedureCode),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProcedureCode,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"procedureCode"
+		},
+	{ ATF_POINTER, 4, offsetof(struct CriticalityDiagnostics, triggeringMessage),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_TriggeringMessage,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"triggeringMessage"
+		},
+	{ ATF_POINTER, 3, offsetof(struct CriticalityDiagnostics, procedureCriticality),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"procedureCriticality"
+		},
+	{ ATF_POINTER, 2, offsetof(struct CriticalityDiagnostics, ricRequestorID),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RICrequestID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ricRequestorID"
+		},
+	{ ATF_POINTER, 1, offsetof(struct CriticalityDiagnostics, iEsCriticalityDiagnostics),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_CriticalityDiagnostics_IE_List,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"iEsCriticalityDiagnostics"
+		},
+};
+static const int asn_MAP_CriticalityDiagnostics_oms_1[] = { 0, 1, 2, 3, 4 };
+static const ber_tlv_tag_t asn_DEF_CriticalityDiagnostics_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_CriticalityDiagnostics_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* triggeringMessage */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* procedureCriticality */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* ricRequestorID */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iEsCriticalityDiagnostics */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_specs_1 = {
+	sizeof(struct CriticalityDiagnostics),
+	offsetof(struct CriticalityDiagnostics, _asn_ctx),
+	asn_MAP_CriticalityDiagnostics_tag2el_1,
+	5,	/* Count of tags in the map */
+	asn_MAP_CriticalityDiagnostics_oms_1,	/* Optional members */
+	5, 0,	/* Root/Additions */
+	5,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics = {
+	"CriticalityDiagnostics",
+	"CriticalityDiagnostics",
+	&asn_OP_SEQUENCE,
+	asn_DEF_CriticalityDiagnostics_tags_1,
+	sizeof(asn_DEF_CriticalityDiagnostics_tags_1)
+		/sizeof(asn_DEF_CriticalityDiagnostics_tags_1[0]), /* 1 */
+	asn_DEF_CriticalityDiagnostics_tags_1,	/* Same as above */
+	sizeof(asn_DEF_CriticalityDiagnostics_tags_1)
+		/sizeof(asn_DEF_CriticalityDiagnostics_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_CriticalityDiagnostics_1,
+	5,	/* Elements count */
+	&asn_SPC_CriticalityDiagnostics_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics.h b/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics.h
new file mode 100644
index 0000000..e5bda5e
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/CriticalityDiagnostics.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_CriticalityDiagnostics_H_
+#define	_CriticalityDiagnostics_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProcedureCode.h"
+#include "TriggeringMessage.h"
+#include "Criticality.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct RICrequestID;
+struct CriticalityDiagnostics_IE_List;
+
+/* CriticalityDiagnostics */
+typedef struct CriticalityDiagnostics {
+	ProcedureCode_t	*procedureCode;	/* OPTIONAL */
+	TriggeringMessage_t	*triggeringMessage;	/* OPTIONAL */
+	Criticality_t	*procedureCriticality;	/* OPTIONAL */
+	struct RICrequestID	*ricRequestorID;	/* OPTIONAL */
+	struct CriticalityDiagnostics_IE_List	*iEsCriticalityDiagnostics;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CriticalityDiagnostics_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CriticalityDiagnostics_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/E2AP-PDU.c b/3rdparty/E2AP-v01.00.00/E2AP-PDU.c
new file mode 100644
index 0000000..5abd594
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/E2AP-PDU.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Descriptions"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2AP-PDU.h"
+
+static asn_per_constraints_t asn_PER_type_E2AP_PDU_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_E2AP_PDU_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2AP_PDU, choice.initiatingMessage),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_InitiatingMessage,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"initiatingMessage"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2AP_PDU, choice.successfulOutcome),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SuccessfulOutcome,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"successfulOutcome"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2AP_PDU, choice.unsuccessfulOutcome),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_UnsuccessfulOutcome,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"unsuccessfulOutcome"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2AP_PDU_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* initiatingMessage */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* successfulOutcome */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* unsuccessfulOutcome */
+};
+static asn_CHOICE_specifics_t asn_SPC_E2AP_PDU_specs_1 = {
+	sizeof(struct E2AP_PDU),
+	offsetof(struct E2AP_PDU, _asn_ctx),
+	offsetof(struct E2AP_PDU, present),
+	sizeof(((struct E2AP_PDU *)0)->present),
+	asn_MAP_E2AP_PDU_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0,
+	3	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_E2AP_PDU = {
+	"E2AP-PDU",
+	"E2AP-PDU",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_E2AP_PDU_constr_1, CHOICE_constraint },
+	asn_MBR_E2AP_PDU_1,
+	3,	/* Elements count */
+	&asn_SPC_E2AP_PDU_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/E2AP-PDU.h b/3rdparty/E2AP-v01.00.00/E2AP-PDU.h
new file mode 100644
index 0000000..1ce0237
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/E2AP-PDU.h
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Descriptions"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2AP_PDU_H_
+#define	_E2AP_PDU_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "InitiatingMessage.h"
+#include "SuccessfulOutcome.h"
+#include "UnsuccessfulOutcome.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2AP_PDU_PR {
+	E2AP_PDU_PR_NOTHING,	/* No components present */
+	E2AP_PDU_PR_initiatingMessage,
+	E2AP_PDU_PR_successfulOutcome,
+	E2AP_PDU_PR_unsuccessfulOutcome
+	/* Extensions may appear below */
+	
+} E2AP_PDU_PR;
+
+/* E2AP-PDU */
+typedef struct E2AP_PDU {
+	E2AP_PDU_PR present;
+	union E2AP_PDU_u {
+		InitiatingMessage_t	 initiatingMessage;
+		SuccessfulOutcome_t	 successfulOutcome;
+		UnsuccessfulOutcome_t	 unsuccessfulOutcome;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2AP_PDU_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2AP_PDU;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2AP_PDU_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/E2setupFailure.c b/3rdparty/E2AP-v01.00.00/E2setupFailure.c
new file mode 100644
index 0000000..fec54f6
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/E2setupFailure.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2setupFailure.h"
+
+asn_TYPE_member_t asn_MBR_E2setupFailure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupFailure, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P13,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2setupFailure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2setupFailure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2setupFailure_specs_1 = {
+	sizeof(struct E2setupFailure),
+	offsetof(struct E2setupFailure, _asn_ctx),
+	asn_MAP_E2setupFailure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2setupFailure = {
+	"E2setupFailure",
+	"E2setupFailure",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2setupFailure_tags_1,
+	sizeof(asn_DEF_E2setupFailure_tags_1)
+		/sizeof(asn_DEF_E2setupFailure_tags_1[0]), /* 1 */
+	asn_DEF_E2setupFailure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2setupFailure_tags_1)
+		/sizeof(asn_DEF_E2setupFailure_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2setupFailure_1,
+	1,	/* Elements count */
+	&asn_SPC_E2setupFailure_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/E2setupFailure.h b/3rdparty/E2AP-v01.00.00/E2setupFailure.h
new file mode 100644
index 0000000..a4a38c2
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/E2setupFailure.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2setupFailure_H_
+#define	_E2setupFailure_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2setupFailure */
+typedef struct E2setupFailure {
+	ProtocolIE_Container_1544P13_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2setupFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2setupFailure;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2setupFailure_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2setupFailure_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2setupFailure_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/E2setupRequest.c b/3rdparty/E2AP-v01.00.00/E2setupRequest.c
new file mode 100644
index 0000000..88c1c74
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/E2setupRequest.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2setupRequest.h"
+
+asn_TYPE_member_t asn_MBR_E2setupRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupRequest, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P11,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2setupRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2setupRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2setupRequest_specs_1 = {
+	sizeof(struct E2setupRequest),
+	offsetof(struct E2setupRequest, _asn_ctx),
+	asn_MAP_E2setupRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2setupRequest = {
+	"E2setupRequest",
+	"E2setupRequest",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2setupRequest_tags_1,
+	sizeof(asn_DEF_E2setupRequest_tags_1)
+		/sizeof(asn_DEF_E2setupRequest_tags_1[0]), /* 1 */
+	asn_DEF_E2setupRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2setupRequest_tags_1)
+		/sizeof(asn_DEF_E2setupRequest_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2setupRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_E2setupRequest_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/E2setupRequest.h b/3rdparty/E2AP-v01.00.00/E2setupRequest.h
new file mode 100644
index 0000000..757bbf5
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/E2setupRequest.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2setupRequest_H_
+#define	_E2setupRequest_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2setupRequest */
+typedef struct E2setupRequest {
+	ProtocolIE_Container_1544P11_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2setupRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2setupRequest;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2setupRequest_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2setupRequest_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2setupRequest_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/E2setupResponse.c b/3rdparty/E2AP-v01.00.00/E2setupResponse.c
new file mode 100644
index 0000000..9ed30b5
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/E2setupResponse.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2setupResponse.h"
+
+asn_TYPE_member_t asn_MBR_E2setupResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupResponse, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P12,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2setupResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2setupResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2setupResponse_specs_1 = {
+	sizeof(struct E2setupResponse),
+	offsetof(struct E2setupResponse, _asn_ctx),
+	asn_MAP_E2setupResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2setupResponse = {
+	"E2setupResponse",
+	"E2setupResponse",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2setupResponse_tags_1,
+	sizeof(asn_DEF_E2setupResponse_tags_1)
+		/sizeof(asn_DEF_E2setupResponse_tags_1[0]), /* 1 */
+	asn_DEF_E2setupResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2setupResponse_tags_1)
+		/sizeof(asn_DEF_E2setupResponse_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2setupResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_E2setupResponse_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/E2setupResponse.h b/3rdparty/E2AP-v01.00.00/E2setupResponse.h
new file mode 100644
index 0000000..15992b5
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/E2setupResponse.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2setupResponse_H_
+#define	_E2setupResponse_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2setupResponse */
+typedef struct E2setupResponse {
+	ProtocolIE_Container_1544P12_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2setupResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2setupResponse;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2setupResponse_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2setupResponse_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2setupResponse_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/ENB-ID-Choice.c b/3rdparty/E2AP-v01.00.00/ENB-ID-Choice.c
new file mode 100644
index 0000000..c50cbd4
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ENB-ID-Choice.c
@@ -0,0 +1,180 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "ENB-ID-Choice.h"
+
+static int
+memb_enb_ID_macro_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 20)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_enb_ID_shortmacro_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 18)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_enb_ID_longmacro_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 21)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_enb_ID_macro_constr_2 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  20,  20 }	/* (SIZE(20..20)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_enb_ID_shortmacro_constr_3 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  18,  18 }	/* (SIZE(18..18)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_enb_ID_longmacro_constr_4 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  21,  21 }	/* (SIZE(21..21)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ENB_ID_Choice_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+asn_TYPE_member_t asn_MBR_ENB_ID_Choice_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ID_Choice, choice.enb_ID_macro),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, &asn_PER_memb_enb_ID_macro_constr_2,  memb_enb_ID_macro_constraint_1 },
+		0, 0, /* No default value */
+		"enb-ID-macro"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ID_Choice, choice.enb_ID_shortmacro),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, &asn_PER_memb_enb_ID_shortmacro_constr_3,  memb_enb_ID_shortmacro_constraint_1 },
+		0, 0, /* No default value */
+		"enb-ID-shortmacro"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ID_Choice, choice.enb_ID_longmacro),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, &asn_PER_memb_enb_ID_longmacro_constr_4,  memb_enb_ID_longmacro_constraint_1 },
+		0, 0, /* No default value */
+		"enb-ID-longmacro"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_ENB_ID_Choice_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* enb-ID-macro */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* enb-ID-shortmacro */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* enb-ID-longmacro */
+};
+asn_CHOICE_specifics_t asn_SPC_ENB_ID_Choice_specs_1 = {
+	sizeof(struct ENB_ID_Choice),
+	offsetof(struct ENB_ID_Choice, _asn_ctx),
+	offsetof(struct ENB_ID_Choice, present),
+	sizeof(((struct ENB_ID_Choice *)0)->present),
+	asn_MAP_ENB_ID_Choice_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0,
+	3	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_ENB_ID_Choice = {
+	"ENB-ID-Choice",
+	"ENB-ID-Choice",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_ENB_ID_Choice_constr_1, CHOICE_constraint },
+	asn_MBR_ENB_ID_Choice_1,
+	3,	/* Elements count */
+	&asn_SPC_ENB_ID_Choice_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/ENB-ID-Choice.h b/3rdparty/E2AP-v01.00.00/ENB-ID-Choice.h
new file mode 100644
index 0000000..303deaa
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ENB-ID-Choice.h
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_ENB_ID_Choice_H_
+#define	_ENB_ID_Choice_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "BIT_STRING.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ENB_ID_Choice_PR {
+	ENB_ID_Choice_PR_NOTHING,	/* No components present */
+	ENB_ID_Choice_PR_enb_ID_macro,
+	ENB_ID_Choice_PR_enb_ID_shortmacro,
+	ENB_ID_Choice_PR_enb_ID_longmacro
+	/* Extensions may appear below */
+	
+} ENB_ID_Choice_PR;
+
+/* ENB-ID-Choice */
+typedef struct ENB_ID_Choice {
+	ENB_ID_Choice_PR present;
+	union ENB_ID_Choice_u {
+		BIT_STRING_t	 enb_ID_macro;
+		BIT_STRING_t	 enb_ID_shortmacro;
+		BIT_STRING_t	 enb_ID_longmacro;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENB_ID_Choice_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENB_ID_Choice;
+extern asn_CHOICE_specifics_t asn_SPC_ENB_ID_Choice_specs_1;
+extern asn_TYPE_member_t asn_MBR_ENB_ID_Choice_1[3];
+extern asn_per_constraints_t asn_PER_type_ENB_ID_Choice_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENB_ID_Choice_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/ENB-ID.c b/3rdparty/E2AP-v01.00.00/ENB-ID.c
new file mode 100644
index 0000000..7c7f5e2
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ENB-ID.c
@@ -0,0 +1,226 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "ENB-ID.h"
+
+static int
+memb_macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 20)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_home_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 28)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_short_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 18)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_long_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 21)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_macro_eNB_ID_constr_2 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  20,  20 }	/* (SIZE(20..20)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_home_eNB_ID_constr_3 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  28,  28 }	/* (SIZE(28..28)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_short_Macro_eNB_ID_constr_5 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  18,  18 }	/* (SIZE(18..18)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_long_Macro_eNB_ID_constr_6 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  21,  21 }	/* (SIZE(21..21)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ENB_ID_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+asn_TYPE_member_t asn_MBR_ENB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.macro_eNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, &asn_PER_memb_macro_eNB_ID_constr_2,  memb_macro_eNB_ID_constraint_1 },
+		0, 0, /* No default value */
+		"macro-eNB-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.home_eNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, &asn_PER_memb_home_eNB_ID_constr_3,  memb_home_eNB_ID_constraint_1 },
+		0, 0, /* No default value */
+		"home-eNB-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.short_Macro_eNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, &asn_PER_memb_short_Macro_eNB_ID_constr_5,  memb_short_Macro_eNB_ID_constraint_1 },
+		0, 0, /* No default value */
+		"short-Macro-eNB-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.long_Macro_eNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, &asn_PER_memb_long_Macro_eNB_ID_constr_6,  memb_long_Macro_eNB_ID_constraint_1 },
+		0, 0, /* No default value */
+		"long-Macro-eNB-ID"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_ENB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* macro-eNB-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* home-eNB-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* short-Macro-eNB-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* long-Macro-eNB-ID */
+};
+asn_CHOICE_specifics_t asn_SPC_ENB_ID_specs_1 = {
+	sizeof(struct ENB_ID),
+	offsetof(struct ENB_ID, _asn_ctx),
+	offsetof(struct ENB_ID, present),
+	sizeof(((struct ENB_ID *)0)->present),
+	asn_MAP_ENB_ID_tag2el_1,
+	4,	/* Count of tags in the map */
+	0, 0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_ENB_ID = {
+	"ENB-ID",
+	"ENB-ID",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_ENB_ID_constr_1, CHOICE_constraint },
+	asn_MBR_ENB_ID_1,
+	4,	/* Elements count */
+	&asn_SPC_ENB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/ENB-ID.h b/3rdparty/E2AP-v01.00.00/ENB-ID.h
new file mode 100644
index 0000000..dae02c0
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ENB-ID.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_ENB_ID_H_
+#define	_ENB_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "BIT_STRING.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ENB_ID_PR {
+	ENB_ID_PR_NOTHING,	/* No components present */
+	ENB_ID_PR_macro_eNB_ID,
+	ENB_ID_PR_home_eNB_ID,
+	/* Extensions may appear below */
+	ENB_ID_PR_short_Macro_eNB_ID,
+	ENB_ID_PR_long_Macro_eNB_ID
+} ENB_ID_PR;
+
+/* ENB-ID */
+typedef struct ENB_ID {
+	ENB_ID_PR present;
+	union ENB_ID_u {
+		BIT_STRING_t	 macro_eNB_ID;
+		BIT_STRING_t	 home_eNB_ID;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		BIT_STRING_t	 short_Macro_eNB_ID;
+		BIT_STRING_t	 long_Macro_eNB_ID;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENB_ID;
+extern asn_CHOICE_specifics_t asn_SPC_ENB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_ENB_ID_1[4];
+extern asn_per_constraints_t asn_PER_type_ENB_ID_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENB_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/ENGNB-ID.c b/3rdparty/E2AP-v01.00.00/ENGNB-ID.c
new file mode 100644
index 0000000..6068ad3
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ENGNB-ID.c
@@ -0,0 +1,88 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "ENGNB-ID.h"
+
+static int
+memb_gNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size >= 22 && size <= 32)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_gNB_ID_constr_2 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  22,  32 }	/* (SIZE(22..32)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ENGNB_ID_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+asn_TYPE_member_t asn_MBR_ENGNB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct ENGNB_ID, choice.gNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, &asn_PER_memb_gNB_ID_constr_2,  memb_gNB_ID_constraint_1 },
+		0, 0, /* No default value */
+		"gNB-ID"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_ENGNB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* gNB-ID */
+};
+asn_CHOICE_specifics_t asn_SPC_ENGNB_ID_specs_1 = {
+	sizeof(struct ENGNB_ID),
+	offsetof(struct ENGNB_ID, _asn_ctx),
+	offsetof(struct ENGNB_ID, present),
+	sizeof(((struct ENGNB_ID *)0)->present),
+	asn_MAP_ENGNB_ID_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0,
+	1	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_ENGNB_ID = {
+	"ENGNB-ID",
+	"ENGNB-ID",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_ENGNB_ID_constr_1, CHOICE_constraint },
+	asn_MBR_ENGNB_ID_1,
+	1,	/* Elements count */
+	&asn_SPC_ENGNB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/ENGNB-ID.h b/3rdparty/E2AP-v01.00.00/ENGNB-ID.h
new file mode 100644
index 0000000..8baac95
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ENGNB-ID.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_ENGNB_ID_H_
+#define	_ENGNB_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "BIT_STRING.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ENGNB_ID_PR {
+	ENGNB_ID_PR_NOTHING,	/* No components present */
+	ENGNB_ID_PR_gNB_ID
+	/* Extensions may appear below */
+	
+} ENGNB_ID_PR;
+
+/* ENGNB-ID */
+typedef struct ENGNB_ID {
+	ENGNB_ID_PR present;
+	union ENGNB_ID_u {
+		BIT_STRING_t	 gNB_ID;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENGNB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENGNB_ID;
+extern asn_CHOICE_specifics_t asn_SPC_ENGNB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_ENGNB_ID_1[1];
+extern asn_per_constraints_t asn_PER_type_ENGNB_ID_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENGNB_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/ErrorIndication.c b/3rdparty/E2AP-v01.00.00/ErrorIndication.c
new file mode 100644
index 0000000..6950ab5
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ErrorIndication.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "ErrorIndication.h"
+
+asn_TYPE_member_t asn_MBR_ErrorIndication_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct ErrorIndication, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P10,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ErrorIndication_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_ErrorIndication_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_ErrorIndication_specs_1 = {
+	sizeof(struct ErrorIndication),
+	offsetof(struct ErrorIndication, _asn_ctx),
+	asn_MAP_ErrorIndication_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_ErrorIndication = {
+	"ErrorIndication",
+	"ErrorIndication",
+	&asn_OP_SEQUENCE,
+	asn_DEF_ErrorIndication_tags_1,
+	sizeof(asn_DEF_ErrorIndication_tags_1)
+		/sizeof(asn_DEF_ErrorIndication_tags_1[0]), /* 1 */
+	asn_DEF_ErrorIndication_tags_1,	/* Same as above */
+	sizeof(asn_DEF_ErrorIndication_tags_1)
+		/sizeof(asn_DEF_ErrorIndication_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_ErrorIndication_1,
+	1,	/* Elements count */
+	&asn_SPC_ErrorIndication_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/ErrorIndication.h b/3rdparty/E2AP-v01.00.00/ErrorIndication.h
new file mode 100644
index 0000000..26a38ad
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ErrorIndication.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_ErrorIndication_H_
+#define	_ErrorIndication_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ErrorIndication */
+typedef struct ErrorIndication {
+	ProtocolIE_Container_1544P10_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ErrorIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ErrorIndication;
+extern asn_SEQUENCE_specifics_t asn_SPC_ErrorIndication_specs_1;
+extern asn_TYPE_member_t asn_MBR_ErrorIndication_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ErrorIndication_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/GNB-CU-UP-ID.c b/3rdparty/E2AP-v01.00.00/GNB-CU-UP-ID.c
new file mode 100644
index 0000000..d662243
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GNB-CU-UP-ID.c
@@ -0,0 +1,67 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "GNB-CU-UP-ID.h"
+
+int
+GNB_CU_UP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const INTEGER_t *st = (const INTEGER_t *)sptr;
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(asn_INTEGER2long(st, &value)) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value too large (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if((value >= 0 && value <= 68719476735)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using INTEGER,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_GNB_CU_UP_ID_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 36, -1,  0,  68719476735 }	/* (0..68719476735) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_GNB_CU_UP_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_GNB_CU_UP_ID = {
+	"GNB-CU-UP-ID",
+	"GNB-CU-UP-ID",
+	&asn_OP_INTEGER,
+	asn_DEF_GNB_CU_UP_ID_tags_1,
+	sizeof(asn_DEF_GNB_CU_UP_ID_tags_1)
+		/sizeof(asn_DEF_GNB_CU_UP_ID_tags_1[0]), /* 1 */
+	asn_DEF_GNB_CU_UP_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_GNB_CU_UP_ID_tags_1)
+		/sizeof(asn_DEF_GNB_CU_UP_ID_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_GNB_CU_UP_ID_constr_1, GNB_CU_UP_ID_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/GNB-CU-UP-ID.h b/3rdparty/E2AP-v01.00.00/GNB-CU-UP-ID.h
new file mode 100644
index 0000000..ed3c20c
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GNB-CU-UP-ID.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_GNB_CU_UP_ID_H_
+#define	_GNB_CU_UP_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "INTEGER.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* GNB-CU-UP-ID */
+typedef INTEGER_t	 GNB_CU_UP_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_GNB_CU_UP_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_GNB_CU_UP_ID;
+asn_struct_free_f GNB_CU_UP_ID_free;
+asn_struct_print_f GNB_CU_UP_ID_print;
+asn_constr_check_f GNB_CU_UP_ID_constraint;
+ber_type_decoder_f GNB_CU_UP_ID_decode_ber;
+der_type_encoder_f GNB_CU_UP_ID_encode_der;
+xer_type_decoder_f GNB_CU_UP_ID_decode_xer;
+xer_type_encoder_f GNB_CU_UP_ID_encode_xer;
+per_type_decoder_f GNB_CU_UP_ID_decode_uper;
+per_type_encoder_f GNB_CU_UP_ID_encode_uper;
+per_type_decoder_f GNB_CU_UP_ID_decode_aper;
+per_type_encoder_f GNB_CU_UP_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GNB_CU_UP_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/GNB-DU-ID.c b/3rdparty/E2AP-v01.00.00/GNB-DU-ID.c
new file mode 100644
index 0000000..8012289
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GNB-DU-ID.c
@@ -0,0 +1,67 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "GNB-DU-ID.h"
+
+int
+GNB_DU_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const INTEGER_t *st = (const INTEGER_t *)sptr;
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(asn_INTEGER2long(st, &value)) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value too large (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if((value >= 0 && value <= 68719476735)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using INTEGER,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_GNB_DU_ID_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 36, -1,  0,  68719476735 }	/* (0..68719476735) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_GNB_DU_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_GNB_DU_ID = {
+	"GNB-DU-ID",
+	"GNB-DU-ID",
+	&asn_OP_INTEGER,
+	asn_DEF_GNB_DU_ID_tags_1,
+	sizeof(asn_DEF_GNB_DU_ID_tags_1)
+		/sizeof(asn_DEF_GNB_DU_ID_tags_1[0]), /* 1 */
+	asn_DEF_GNB_DU_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_GNB_DU_ID_tags_1)
+		/sizeof(asn_DEF_GNB_DU_ID_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_GNB_DU_ID_constr_1, GNB_DU_ID_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/GNB-DU-ID.h b/3rdparty/E2AP-v01.00.00/GNB-DU-ID.h
new file mode 100644
index 0000000..8f0a8fd
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GNB-DU-ID.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_GNB_DU_ID_H_
+#define	_GNB_DU_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "INTEGER.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* GNB-DU-ID */
+typedef INTEGER_t	 GNB_DU_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_GNB_DU_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_GNB_DU_ID;
+asn_struct_free_f GNB_DU_ID_free;
+asn_struct_print_f GNB_DU_ID_print;
+asn_constr_check_f GNB_DU_ID_constraint;
+ber_type_decoder_f GNB_DU_ID_decode_ber;
+der_type_encoder_f GNB_DU_ID_encode_der;
+xer_type_decoder_f GNB_DU_ID_decode_xer;
+xer_type_encoder_f GNB_DU_ID_encode_xer;
+per_type_decoder_f GNB_DU_ID_decode_uper;
+per_type_encoder_f GNB_DU_ID_encode_uper;
+per_type_decoder_f GNB_DU_ID_decode_aper;
+per_type_encoder_f GNB_DU_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GNB_DU_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/GNB-ID-Choice.c b/3rdparty/E2AP-v01.00.00/GNB-ID-Choice.c
new file mode 100644
index 0000000..f591998
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GNB-ID-Choice.c
@@ -0,0 +1,88 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "GNB-ID-Choice.h"
+
+static int
+memb_gnb_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size >= 22 && size <= 32)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_gnb_ID_constr_2 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  22,  32 }	/* (SIZE(22..32)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_GNB_ID_Choice_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+asn_TYPE_member_t asn_MBR_GNB_ID_Choice_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct GNB_ID_Choice, choice.gnb_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, &asn_PER_memb_gnb_ID_constr_2,  memb_gnb_ID_constraint_1 },
+		0, 0, /* No default value */
+		"gnb-ID"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_GNB_ID_Choice_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* gnb-ID */
+};
+asn_CHOICE_specifics_t asn_SPC_GNB_ID_Choice_specs_1 = {
+	sizeof(struct GNB_ID_Choice),
+	offsetof(struct GNB_ID_Choice, _asn_ctx),
+	offsetof(struct GNB_ID_Choice, present),
+	sizeof(((struct GNB_ID_Choice *)0)->present),
+	asn_MAP_GNB_ID_Choice_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0,
+	1	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_GNB_ID_Choice = {
+	"GNB-ID-Choice",
+	"GNB-ID-Choice",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_GNB_ID_Choice_constr_1, CHOICE_constraint },
+	asn_MBR_GNB_ID_Choice_1,
+	1,	/* Elements count */
+	&asn_SPC_GNB_ID_Choice_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/GNB-ID-Choice.h b/3rdparty/E2AP-v01.00.00/GNB-ID-Choice.h
new file mode 100644
index 0000000..ffef401
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GNB-ID-Choice.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_GNB_ID_Choice_H_
+#define	_GNB_ID_Choice_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "BIT_STRING.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum GNB_ID_Choice_PR {
+	GNB_ID_Choice_PR_NOTHING,	/* No components present */
+	GNB_ID_Choice_PR_gnb_ID
+	/* Extensions may appear below */
+	
+} GNB_ID_Choice_PR;
+
+/* GNB-ID-Choice */
+typedef struct GNB_ID_Choice {
+	GNB_ID_Choice_PR present;
+	union GNB_ID_Choice_u {
+		BIT_STRING_t	 gnb_ID;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GNB_ID_Choice_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GNB_ID_Choice;
+extern asn_CHOICE_specifics_t asn_SPC_GNB_ID_Choice_specs_1;
+extern asn_TYPE_member_t asn_MBR_GNB_ID_Choice_1[1];
+extern asn_per_constraints_t asn_PER_type_GNB_ID_Choice_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GNB_ID_Choice_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/GlobalE2node-ID.c b/3rdparty/E2AP-v01.00.00/GlobalE2node-ID.c
new file mode 100644
index 0000000..aa79179
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalE2node-ID.c
@@ -0,0 +1,82 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "GlobalE2node-ID.h"
+
+static asn_per_constraints_t asn_PER_type_GlobalE2node_ID_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  3 }	/* (0..3,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_GlobalE2node_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_ID, choice.gNB),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_GlobalE2node_gNB_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"gNB"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_ID, choice.en_gNB),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_GlobalE2node_en_gNB_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"en-gNB"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_ID, choice.ng_eNB),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_GlobalE2node_ng_eNB_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ng-eNB"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_ID, choice.eNB),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_GlobalE2node_eNB_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"eNB"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_GlobalE2node_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gNB */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* en-gNB */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ng-eNB */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* eNB */
+};
+static asn_CHOICE_specifics_t asn_SPC_GlobalE2node_ID_specs_1 = {
+	sizeof(struct GlobalE2node_ID),
+	offsetof(struct GlobalE2node_ID, _asn_ctx),
+	offsetof(struct GlobalE2node_ID, present),
+	sizeof(((struct GlobalE2node_ID *)0)->present),
+	asn_MAP_GlobalE2node_ID_tag2el_1,
+	4,	/* Count of tags in the map */
+	0, 0,
+	4	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_GlobalE2node_ID = {
+	"GlobalE2node-ID",
+	"GlobalE2node-ID",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_GlobalE2node_ID_constr_1, CHOICE_constraint },
+	asn_MBR_GlobalE2node_ID_1,
+	4,	/* Elements count */
+	&asn_SPC_GlobalE2node_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/GlobalE2node-ID.h b/3rdparty/E2AP-v01.00.00/GlobalE2node-ID.h
new file mode 100644
index 0000000..1ade167
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalE2node-ID.h
@@ -0,0 +1,62 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_GlobalE2node_ID_H_
+#define	_GlobalE2node_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "GlobalE2node-gNB-ID.h"
+#include "GlobalE2node-en-gNB-ID.h"
+#include "GlobalE2node-ng-eNB-ID.h"
+#include "GlobalE2node-eNB-ID.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum GlobalE2node_ID_PR {
+	GlobalE2node_ID_PR_NOTHING,	/* No components present */
+	GlobalE2node_ID_PR_gNB,
+	GlobalE2node_ID_PR_en_gNB,
+	GlobalE2node_ID_PR_ng_eNB,
+	GlobalE2node_ID_PR_eNB
+	/* Extensions may appear below */
+	
+} GlobalE2node_ID_PR;
+
+/* GlobalE2node-ID */
+typedef struct GlobalE2node_ID {
+	GlobalE2node_ID_PR present;
+	union GlobalE2node_ID_u {
+		GlobalE2node_gNB_ID_t	 gNB;
+		GlobalE2node_en_gNB_ID_t	 en_gNB;
+		GlobalE2node_ng_eNB_ID_t	 ng_eNB;
+		GlobalE2node_eNB_ID_t	 eNB;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GlobalE2node_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GlobalE2node_ID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GlobalE2node_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/GlobalE2node-eNB-ID.c b/3rdparty/E2AP-v01.00.00/GlobalE2node-eNB-ID.c
new file mode 100644
index 0000000..554c213
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalE2node-eNB-ID.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "GlobalE2node-eNB-ID.h"
+
+asn_TYPE_member_t asn_MBR_GlobalE2node_eNB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_eNB_ID, global_eNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_GlobalENB_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"global-eNB-ID"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_GlobalE2node_eNB_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_GlobalE2node_eNB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* global-eNB-ID */
+};
+asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_eNB_ID_specs_1 = {
+	sizeof(struct GlobalE2node_eNB_ID),
+	offsetof(struct GlobalE2node_eNB_ID, _asn_ctx),
+	asn_MAP_GlobalE2node_eNB_ID_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_GlobalE2node_eNB_ID = {
+	"GlobalE2node-eNB-ID",
+	"GlobalE2node-eNB-ID",
+	&asn_OP_SEQUENCE,
+	asn_DEF_GlobalE2node_eNB_ID_tags_1,
+	sizeof(asn_DEF_GlobalE2node_eNB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalE2node_eNB_ID_tags_1[0]), /* 1 */
+	asn_DEF_GlobalE2node_eNB_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_GlobalE2node_eNB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalE2node_eNB_ID_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_GlobalE2node_eNB_ID_1,
+	1,	/* Elements count */
+	&asn_SPC_GlobalE2node_eNB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/GlobalE2node-eNB-ID.h b/3rdparty/E2AP-v01.00.00/GlobalE2node-eNB-ID.h
new file mode 100644
index 0000000..23a065d
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalE2node-eNB-ID.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_GlobalE2node_eNB_ID_H_
+#define	_GlobalE2node_eNB_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "GlobalENB-ID.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* GlobalE2node-eNB-ID */
+typedef struct GlobalE2node_eNB_ID {
+	GlobalENB_ID_t	 global_eNB_ID;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GlobalE2node_eNB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GlobalE2node_eNB_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_eNB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_GlobalE2node_eNB_ID_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GlobalE2node_eNB_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/GlobalE2node-en-gNB-ID.c b/3rdparty/E2AP-v01.00.00/GlobalE2node-en-gNB-ID.c
new file mode 100644
index 0000000..3482bc7
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalE2node-en-gNB-ID.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "GlobalE2node-en-gNB-ID.h"
+
+asn_TYPE_member_t asn_MBR_GlobalE2node_en_gNB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_en_gNB_ID, global_gNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_GlobalenGNB_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"global-gNB-ID"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_GlobalE2node_en_gNB_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_GlobalE2node_en_gNB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* global-gNB-ID */
+};
+asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_en_gNB_ID_specs_1 = {
+	sizeof(struct GlobalE2node_en_gNB_ID),
+	offsetof(struct GlobalE2node_en_gNB_ID, _asn_ctx),
+	asn_MAP_GlobalE2node_en_gNB_ID_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_GlobalE2node_en_gNB_ID = {
+	"GlobalE2node-en-gNB-ID",
+	"GlobalE2node-en-gNB-ID",
+	&asn_OP_SEQUENCE,
+	asn_DEF_GlobalE2node_en_gNB_ID_tags_1,
+	sizeof(asn_DEF_GlobalE2node_en_gNB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalE2node_en_gNB_ID_tags_1[0]), /* 1 */
+	asn_DEF_GlobalE2node_en_gNB_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_GlobalE2node_en_gNB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalE2node_en_gNB_ID_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_GlobalE2node_en_gNB_ID_1,
+	1,	/* Elements count */
+	&asn_SPC_GlobalE2node_en_gNB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/GlobalE2node-en-gNB-ID.h b/3rdparty/E2AP-v01.00.00/GlobalE2node-en-gNB-ID.h
new file mode 100644
index 0000000..9446258
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalE2node-en-gNB-ID.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_GlobalE2node_en_gNB_ID_H_
+#define	_GlobalE2node_en_gNB_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "GlobalenGNB-ID.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* GlobalE2node-en-gNB-ID */
+typedef struct GlobalE2node_en_gNB_ID {
+	GlobalenGNB_ID_t	 global_gNB_ID;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GlobalE2node_en_gNB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GlobalE2node_en_gNB_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_en_gNB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_GlobalE2node_en_gNB_ID_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GlobalE2node_en_gNB_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/GlobalE2node-gNB-ID.c b/3rdparty/E2AP-v01.00.00/GlobalE2node-gNB-ID.c
new file mode 100644
index 0000000..1223833
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalE2node-gNB-ID.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "GlobalE2node-gNB-ID.h"
+
+asn_TYPE_member_t asn_MBR_GlobalE2node_gNB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_gNB_ID, global_gNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_GlobalgNB_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"global-gNB-ID"
+		},
+	{ ATF_POINTER, 2, offsetof(struct GlobalE2node_gNB_ID, gNB_CU_UP_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_GNB_CU_UP_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"gNB-CU-UP-ID"
+		},
+	{ ATF_POINTER, 1, offsetof(struct GlobalE2node_gNB_ID, gNB_DU_ID),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_GNB_DU_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"gNB-DU-ID"
+		},
+};
+static const int asn_MAP_GlobalE2node_gNB_ID_oms_1[] = { 1, 2 };
+static const ber_tlv_tag_t asn_DEF_GlobalE2node_gNB_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_GlobalE2node_gNB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* global-gNB-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* gNB-CU-UP-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* gNB-DU-ID */
+};
+asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_gNB_ID_specs_1 = {
+	sizeof(struct GlobalE2node_gNB_ID),
+	offsetof(struct GlobalE2node_gNB_ID, _asn_ctx),
+	asn_MAP_GlobalE2node_gNB_ID_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_GlobalE2node_gNB_ID_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	3,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_GlobalE2node_gNB_ID = {
+	"GlobalE2node-gNB-ID",
+	"GlobalE2node-gNB-ID",
+	&asn_OP_SEQUENCE,
+	asn_DEF_GlobalE2node_gNB_ID_tags_1,
+	sizeof(asn_DEF_GlobalE2node_gNB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalE2node_gNB_ID_tags_1[0]), /* 1 */
+	asn_DEF_GlobalE2node_gNB_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_GlobalE2node_gNB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalE2node_gNB_ID_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_GlobalE2node_gNB_ID_1,
+	3,	/* Elements count */
+	&asn_SPC_GlobalE2node_gNB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/GlobalE2node-gNB-ID.h b/3rdparty/E2AP-v01.00.00/GlobalE2node-gNB-ID.h
new file mode 100644
index 0000000..db8231e
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalE2node-gNB-ID.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_GlobalE2node_gNB_ID_H_
+#define	_GlobalE2node_gNB_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "GlobalgNB-ID.h"
+#include "GNB-CU-UP-ID.h"
+#include "GNB-DU-ID.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* GlobalE2node-gNB-ID */
+typedef struct GlobalE2node_gNB_ID {
+	GlobalgNB_ID_t	 global_gNB_ID;
+	GNB_CU_UP_ID_t	*gNB_CU_UP_ID;	/* OPTIONAL */
+	GNB_DU_ID_t	*gNB_DU_ID;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GlobalE2node_gNB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GlobalE2node_gNB_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_gNB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_GlobalE2node_gNB_ID_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GlobalE2node_gNB_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/GlobalE2node-ng-eNB-ID.c b/3rdparty/E2AP-v01.00.00/GlobalE2node-ng-eNB-ID.c
new file mode 100644
index 0000000..451c1f2
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalE2node-ng-eNB-ID.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "GlobalE2node-ng-eNB-ID.h"
+
+asn_TYPE_member_t asn_MBR_GlobalE2node_ng_eNB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_ng_eNB_ID, global_ng_eNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_GlobalngeNB_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"global-ng-eNB-ID"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_GlobalE2node_ng_eNB_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_GlobalE2node_ng_eNB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* global-ng-eNB-ID */
+};
+asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_ng_eNB_ID_specs_1 = {
+	sizeof(struct GlobalE2node_ng_eNB_ID),
+	offsetof(struct GlobalE2node_ng_eNB_ID, _asn_ctx),
+	asn_MAP_GlobalE2node_ng_eNB_ID_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_GlobalE2node_ng_eNB_ID = {
+	"GlobalE2node-ng-eNB-ID",
+	"GlobalE2node-ng-eNB-ID",
+	&asn_OP_SEQUENCE,
+	asn_DEF_GlobalE2node_ng_eNB_ID_tags_1,
+	sizeof(asn_DEF_GlobalE2node_ng_eNB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalE2node_ng_eNB_ID_tags_1[0]), /* 1 */
+	asn_DEF_GlobalE2node_ng_eNB_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_GlobalE2node_ng_eNB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalE2node_ng_eNB_ID_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_GlobalE2node_ng_eNB_ID_1,
+	1,	/* Elements count */
+	&asn_SPC_GlobalE2node_ng_eNB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/GlobalE2node-ng-eNB-ID.h b/3rdparty/E2AP-v01.00.00/GlobalE2node-ng-eNB-ID.h
new file mode 100644
index 0000000..74298a6
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalE2node-ng-eNB-ID.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_GlobalE2node_ng_eNB_ID_H_
+#define	_GlobalE2node_ng_eNB_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "GlobalngeNB-ID.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* GlobalE2node-ng-eNB-ID */
+typedef struct GlobalE2node_ng_eNB_ID {
+	GlobalngeNB_ID_t	 global_ng_eNB_ID;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GlobalE2node_ng_eNB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GlobalE2node_ng_eNB_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_ng_eNB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_GlobalE2node_ng_eNB_ID_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GlobalE2node_ng_eNB_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/GlobalENB-ID.c b/3rdparty/E2AP-v01.00.00/GlobalENB-ID.c
new file mode 100644
index 0000000..4f2a8cc
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalENB-ID.c
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "GlobalENB-ID.h"
+
+asn_TYPE_member_t asn_MBR_GlobalENB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID, pLMN_Identity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_PLMN_Identity,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"pLMN-Identity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID, eNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_ENB_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"eNB-ID"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_GlobalENB_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_GlobalENB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* eNB-ID */
+};
+asn_SEQUENCE_specifics_t asn_SPC_GlobalENB_ID_specs_1 = {
+	sizeof(struct GlobalENB_ID),
+	offsetof(struct GlobalENB_ID, _asn_ctx),
+	asn_MAP_GlobalENB_ID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID = {
+	"GlobalENB-ID",
+	"GlobalENB-ID",
+	&asn_OP_SEQUENCE,
+	asn_DEF_GlobalENB_ID_tags_1,
+	sizeof(asn_DEF_GlobalENB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalENB_ID_tags_1[0]), /* 1 */
+	asn_DEF_GlobalENB_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_GlobalENB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalENB_ID_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_GlobalENB_ID_1,
+	2,	/* Elements count */
+	&asn_SPC_GlobalENB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/GlobalENB-ID.h b/3rdparty/E2AP-v01.00.00/GlobalENB-ID.h
new file mode 100644
index 0000000..9d53ecb
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalENB-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_GlobalENB_ID_H_
+#define	_GlobalENB_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "PLMN-Identity.h"
+#include "ENB-ID.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* GlobalENB-ID */
+typedef struct GlobalENB_ID {
+	PLMN_Identity_t	 pLMN_Identity;
+	ENB_ID_t	 eNB_ID;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GlobalENB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_GlobalENB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_GlobalENB_ID_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GlobalENB_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/GlobalRIC-ID.c b/3rdparty/E2AP-v01.00.00/GlobalRIC-ID.c
new file mode 100644
index 0000000..681c025
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalRIC-ID.c
@@ -0,0 +1,96 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "GlobalRIC-ID.h"
+
+static int
+memb_ric_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 20)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_ric_ID_constr_3 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  20,  20 }	/* (SIZE(20..20)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_GlobalRIC_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalRIC_ID, pLMN_Identity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_PLMN_Identity,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"pLMN-Identity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalRIC_ID, ric_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, &asn_PER_memb_ric_ID_constr_3,  memb_ric_ID_constraint_1 },
+		0, 0, /* No default value */
+		"ric-ID"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_GlobalRIC_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_GlobalRIC_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ric-ID */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_GlobalRIC_ID_specs_1 = {
+	sizeof(struct GlobalRIC_ID),
+	offsetof(struct GlobalRIC_ID, _asn_ctx),
+	asn_MAP_GlobalRIC_ID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_GlobalRIC_ID = {
+	"GlobalRIC-ID",
+	"GlobalRIC-ID",
+	&asn_OP_SEQUENCE,
+	asn_DEF_GlobalRIC_ID_tags_1,
+	sizeof(asn_DEF_GlobalRIC_ID_tags_1)
+		/sizeof(asn_DEF_GlobalRIC_ID_tags_1[0]), /* 1 */
+	asn_DEF_GlobalRIC_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_GlobalRIC_ID_tags_1)
+		/sizeof(asn_DEF_GlobalRIC_ID_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_GlobalRIC_ID_1,
+	2,	/* Elements count */
+	&asn_SPC_GlobalRIC_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/GlobalRIC-ID.h b/3rdparty/E2AP-v01.00.00/GlobalRIC-ID.h
new file mode 100644
index 0000000..01e4501
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalRIC-ID.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_GlobalRIC_ID_H_
+#define	_GlobalRIC_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "PLMN-Identity.h"
+#include "BIT_STRING.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* GlobalRIC-ID */
+typedef struct GlobalRIC_ID {
+	PLMN_Identity_t	 pLMN_Identity;
+	BIT_STRING_t	 ric_ID;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GlobalRIC_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GlobalRIC_ID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GlobalRIC_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/GlobalenGNB-ID.c b/3rdparty/E2AP-v01.00.00/GlobalenGNB-ID.c
new file mode 100644
index 0000000..31cb1e0
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalenGNB-ID.c
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "GlobalenGNB-ID.h"
+
+asn_TYPE_member_t asn_MBR_GlobalenGNB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalenGNB_ID, pLMN_Identity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_PLMN_Identity,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"pLMN-Identity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalenGNB_ID, gNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_ENGNB_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"gNB-ID"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_GlobalenGNB_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_GlobalenGNB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* gNB-ID */
+};
+asn_SEQUENCE_specifics_t asn_SPC_GlobalenGNB_ID_specs_1 = {
+	sizeof(struct GlobalenGNB_ID),
+	offsetof(struct GlobalenGNB_ID, _asn_ctx),
+	asn_MAP_GlobalenGNB_ID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_GlobalenGNB_ID = {
+	"GlobalenGNB-ID",
+	"GlobalenGNB-ID",
+	&asn_OP_SEQUENCE,
+	asn_DEF_GlobalenGNB_ID_tags_1,
+	sizeof(asn_DEF_GlobalenGNB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalenGNB_ID_tags_1[0]), /* 1 */
+	asn_DEF_GlobalenGNB_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_GlobalenGNB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalenGNB_ID_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_GlobalenGNB_ID_1,
+	2,	/* Elements count */
+	&asn_SPC_GlobalenGNB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/GlobalenGNB-ID.h b/3rdparty/E2AP-v01.00.00/GlobalenGNB-ID.h
new file mode 100644
index 0000000..ad7143a
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalenGNB-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_GlobalenGNB_ID_H_
+#define	_GlobalenGNB_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "PLMN-Identity.h"
+#include "ENGNB-ID.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* GlobalenGNB-ID */
+typedef struct GlobalenGNB_ID {
+	PLMN_Identity_t	 pLMN_Identity;
+	ENGNB_ID_t	 gNB_ID;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GlobalenGNB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GlobalenGNB_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_GlobalenGNB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_GlobalenGNB_ID_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GlobalenGNB_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/GlobalgNB-ID.c b/3rdparty/E2AP-v01.00.00/GlobalgNB-ID.c
new file mode 100644
index 0000000..0a232dc
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalgNB-ID.c
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "GlobalgNB-ID.h"
+
+asn_TYPE_member_t asn_MBR_GlobalgNB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalgNB_ID, plmn_id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_PLMN_Identity,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"plmn-id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalgNB_ID, gnb_id),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_GNB_ID_Choice,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"gnb-id"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_GlobalgNB_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_GlobalgNB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* plmn-id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* gnb-id */
+};
+asn_SEQUENCE_specifics_t asn_SPC_GlobalgNB_ID_specs_1 = {
+	sizeof(struct GlobalgNB_ID),
+	offsetof(struct GlobalgNB_ID, _asn_ctx),
+	asn_MAP_GlobalgNB_ID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_GlobalgNB_ID = {
+	"GlobalgNB-ID",
+	"GlobalgNB-ID",
+	&asn_OP_SEQUENCE,
+	asn_DEF_GlobalgNB_ID_tags_1,
+	sizeof(asn_DEF_GlobalgNB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalgNB_ID_tags_1[0]), /* 1 */
+	asn_DEF_GlobalgNB_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_GlobalgNB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalgNB_ID_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_GlobalgNB_ID_1,
+	2,	/* Elements count */
+	&asn_SPC_GlobalgNB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/GlobalgNB-ID.h b/3rdparty/E2AP-v01.00.00/GlobalgNB-ID.h
new file mode 100644
index 0000000..b7f046b
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalgNB-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_GlobalgNB_ID_H_
+#define	_GlobalgNB_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "PLMN-Identity.h"
+#include "GNB-ID-Choice.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* GlobalgNB-ID */
+typedef struct GlobalgNB_ID {
+	PLMN_Identity_t	 plmn_id;
+	GNB_ID_Choice_t	 gnb_id;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GlobalgNB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GlobalgNB_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_GlobalgNB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_GlobalgNB_ID_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GlobalgNB_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/GlobalngeNB-ID.c b/3rdparty/E2AP-v01.00.00/GlobalngeNB-ID.c
new file mode 100644
index 0000000..230b99d
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalngeNB-ID.c
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "GlobalngeNB-ID.h"
+
+asn_TYPE_member_t asn_MBR_GlobalngeNB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalngeNB_ID, plmn_id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_PLMN_Identity,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"plmn-id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct GlobalngeNB_ID, enb_id),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_ENB_ID_Choice,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"enb-id"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_GlobalngeNB_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_GlobalngeNB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* plmn-id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* enb-id */
+};
+asn_SEQUENCE_specifics_t asn_SPC_GlobalngeNB_ID_specs_1 = {
+	sizeof(struct GlobalngeNB_ID),
+	offsetof(struct GlobalngeNB_ID, _asn_ctx),
+	asn_MAP_GlobalngeNB_ID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_GlobalngeNB_ID = {
+	"GlobalngeNB-ID",
+	"GlobalngeNB-ID",
+	&asn_OP_SEQUENCE,
+	asn_DEF_GlobalngeNB_ID_tags_1,
+	sizeof(asn_DEF_GlobalngeNB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalngeNB_ID_tags_1[0]), /* 1 */
+	asn_DEF_GlobalngeNB_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_GlobalngeNB_ID_tags_1)
+		/sizeof(asn_DEF_GlobalngeNB_ID_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_GlobalngeNB_ID_1,
+	2,	/* Elements count */
+	&asn_SPC_GlobalngeNB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/GlobalngeNB-ID.h b/3rdparty/E2AP-v01.00.00/GlobalngeNB-ID.h
new file mode 100644
index 0000000..cdc3d37
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/GlobalngeNB-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_GlobalngeNB_ID_H_
+#define	_GlobalngeNB_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "PLMN-Identity.h"
+#include "ENB-ID-Choice.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* GlobalngeNB-ID */
+typedef struct GlobalngeNB_ID {
+	PLMN_Identity_t	 plmn_id;
+	ENB_ID_Choice_t	 enb_id;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GlobalngeNB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GlobalngeNB_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_GlobalngeNB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_GlobalngeNB_ID_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GlobalngeNB_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/INTEGER.c b/3rdparty/E2AP-v01.00.00/INTEGER.c
similarity index 100%
rename from 3rdparty/libe2ap/INTEGER.c
rename to 3rdparty/E2AP-v01.00.00/INTEGER.c
diff --git a/3rdparty/libe2ap/INTEGER.h b/3rdparty/E2AP-v01.00.00/INTEGER.h
similarity index 100%
rename from 3rdparty/libe2ap/INTEGER.h
rename to 3rdparty/E2AP-v01.00.00/INTEGER.h
diff --git a/3rdparty/E2AP-v01.00.00/InitiatingMessage.c b/3rdparty/E2AP-v01.00.00/InitiatingMessage.c
new file mode 100644
index 0000000..159c19f
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/InitiatingMessage.c
@@ -0,0 +1,389 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Descriptions"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "InitiatingMessage.h"
+
+static const long asn_VAL_1_id_RICsubscription = 8;
+static const long asn_VAL_1_reject = 0;
+static const long asn_VAL_2_id_RICsubscriptionDelete = 9;
+static const long asn_VAL_2_reject = 0;
+static const long asn_VAL_3_id_RICserviceUpdate = 7;
+static const long asn_VAL_3_reject = 0;
+static const long asn_VAL_4_id_RICcontrol = 4;
+static const long asn_VAL_4_reject = 0;
+static const long asn_VAL_5_id_E2setup = 1;
+static const long asn_VAL_5_reject = 0;
+static const long asn_VAL_6_id_Reset = 3;
+static const long asn_VAL_6_reject = 0;
+static const long asn_VAL_7_id_RICindication = 5;
+static const long asn_VAL_7_ignore = 1;
+static const long asn_VAL_8_id_RICserviceQuery = 6;
+static const long asn_VAL_8_ignore = 1;
+static const long asn_VAL_9_id_ErrorIndication = 2;
+static const long asn_VAL_9_ignore = 1;
+static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = {
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionRequest },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionResponse },
+	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionFailure },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_1_id_RICsubscription },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_1_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionDeleteRequest },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionDeleteResponse },
+	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionDeleteFailure },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_2_id_RICsubscriptionDelete },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_2_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICserviceUpdate },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICserviceUpdateAcknowledge },
+	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICserviceUpdateFailure },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_3_id_RICserviceUpdate },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_3_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICcontrolRequest },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICcontrolAcknowledge },
+	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICcontrolFailure },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_4_id_RICcontrol },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_4_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_E2setupRequest },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_E2setupResponse },
+	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_E2setupFailure },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_5_id_E2setup },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_5_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_ResetRequest },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ResetResponse },
+	{ "&UnsuccessfulOutcome",  },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_6_id_Reset },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICindication },
+	{ "&SuccessfulOutcome",  },
+	{ "&UnsuccessfulOutcome",  },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_7_id_RICindication },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_ignore },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICserviceQuery },
+	{ "&SuccessfulOutcome",  },
+	{ "&UnsuccessfulOutcome",  },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_8_id_RICserviceQuery },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_ignore },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_ErrorIndication },
+	{ "&SuccessfulOutcome",  },
+	{ "&UnsuccessfulOutcome",  },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_9_id_ErrorIndication },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_ignore }
+};
+static const asn_ioc_set_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1[] = {
+	{ 9, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows }
+};
+static int
+memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 255)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_InitiatingMessage_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1;
+	size_t constraining_column = 3; /* &procedureCode */
+	size_t for_column = 4; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct InitiatingMessage, procedureCode));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_InitiatingMessage_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1;
+	size_t constraining_column = 3; /* &procedureCode */
+	size_t for_column = 0; /* &InitiatingMessage */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct InitiatingMessage, procedureCode));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_per_constraints_t asn_PER_memb_procedureCode_constr_2 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0,  255 }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_value_4[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage__value, choice.RICsubscriptionRequest),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICsubscriptionRequest,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICsubscriptionRequest"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage__value, choice.RICsubscriptionDeleteRequest),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICsubscriptionDeleteRequest,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICsubscriptionDeleteRequest"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage__value, choice.RICserviceUpdate),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICserviceUpdate,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICserviceUpdate"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage__value, choice.RICcontrolRequest),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICcontrolRequest,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICcontrolRequest"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage__value, choice.E2setupRequest),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_E2setupRequest,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"E2setupRequest"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage__value, choice.ResetRequest),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_ResetRequest,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ResetRequest"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage__value, choice.RICindication),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICindication,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICindication"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage__value, choice.RICserviceQuery),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICserviceQuery,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICserviceQuery"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage__value, choice.ErrorIndication),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_ErrorIndication,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ErrorIndication"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 8 }, /* RICsubscriptionRequest */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 7 }, /* RICsubscriptionDeleteRequest */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 6 }, /* RICserviceUpdate */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 5 }, /* RICcontrolRequest */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 4 }, /* E2setupRequest */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 5, -5, 3 }, /* ResetRequest */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 6, -6, 2 }, /* RICindication */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 7, -7, 1 }, /* RICserviceQuery */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 8, -8, 0 } /* ErrorIndication */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = {
+	sizeof(struct InitiatingMessage__value),
+	offsetof(struct InitiatingMessage__value, _asn_ctx),
+	offsetof(struct InitiatingMessage__value, present),
+	sizeof(((struct InitiatingMessage__value *)0)->present),
+	asn_MAP_value_tag2el_4,
+	9,	/* Count of tags in the map */
+	0, 0,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_4 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_4,
+	9,	/* Elements count */
+	&asn_SPC_value_specs_4	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_InitiatingMessage_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage, procedureCode),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProcedureCode,
+		0,
+		{ 0, &asn_PER_memb_procedureCode_constr_2,  memb_procedureCode_constraint_1 },
+		0, 0, /* No default value */
+		"procedureCode"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_InitiatingMessage_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_3,  memb_criticality_constraint_1 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct InitiatingMessage, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_4,
+		select_InitiatingMessage_value_type,
+		{ 0, &asn_PER_memb_value_constr_4,  memb_value_constraint_1 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_InitiatingMessage_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_InitiatingMessage_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_InitiatingMessage_specs_1 = {
+	sizeof(struct InitiatingMessage),
+	offsetof(struct InitiatingMessage, _asn_ctx),
+	asn_MAP_InitiatingMessage_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_InitiatingMessage = {
+	"InitiatingMessage",
+	"InitiatingMessage",
+	&asn_OP_SEQUENCE,
+	asn_DEF_InitiatingMessage_tags_1,
+	sizeof(asn_DEF_InitiatingMessage_tags_1)
+		/sizeof(asn_DEF_InitiatingMessage_tags_1[0]), /* 1 */
+	asn_DEF_InitiatingMessage_tags_1,	/* Same as above */
+	sizeof(asn_DEF_InitiatingMessage_tags_1)
+		/sizeof(asn_DEF_InitiatingMessage_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_InitiatingMessage_1,
+	3,	/* Elements count */
+	&asn_SPC_InitiatingMessage_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/InitiatingMessage.h b/3rdparty/E2AP-v01.00.00/InitiatingMessage.h
new file mode 100644
index 0000000..25eac7a
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/InitiatingMessage.h
@@ -0,0 +1,97 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Descriptions"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_InitiatingMessage_H_
+#define	_InitiatingMessage_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProcedureCode.h"
+#include "Criticality.h"
+#include "ANY.h"
+#include "asn_ioc.h"
+#include "RICsubscriptionRequest.h"
+#include "RICsubscriptionResponse.h"
+#include "RICsubscriptionFailure.h"
+#include "RICsubscriptionDeleteRequest.h"
+#include "RICsubscriptionDeleteResponse.h"
+#include "RICsubscriptionDeleteFailure.h"
+#include "RICserviceUpdate.h"
+#include "RICserviceUpdateAcknowledge.h"
+#include "RICserviceUpdateFailure.h"
+#include "RICcontrolRequest.h"
+#include "RICcontrolAcknowledge.h"
+#include "RICcontrolFailure.h"
+#include "E2setupRequest.h"
+#include "E2setupResponse.h"
+#include "E2setupFailure.h"
+#include "ResetRequest.h"
+#include "ResetResponse.h"
+#include "RICindication.h"
+#include "RICserviceQuery.h"
+#include "ErrorIndication.h"
+#include "OPEN_TYPE.h"
+#include "constr_CHOICE.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum InitiatingMessage__value_PR {
+	InitiatingMessage__value_PR_NOTHING,	/* No components present */
+	InitiatingMessage__value_PR_RICsubscriptionRequest,
+	InitiatingMessage__value_PR_RICsubscriptionDeleteRequest,
+	InitiatingMessage__value_PR_RICserviceUpdate,
+	InitiatingMessage__value_PR_RICcontrolRequest,
+	InitiatingMessage__value_PR_E2setupRequest,
+	InitiatingMessage__value_PR_ResetRequest,
+	InitiatingMessage__value_PR_RICindication,
+	InitiatingMessage__value_PR_RICserviceQuery,
+	InitiatingMessage__value_PR_ErrorIndication
+} InitiatingMessage__value_PR;
+
+/* InitiatingMessage */
+typedef struct InitiatingMessage {
+	ProcedureCode_t	 procedureCode;
+	Criticality_t	 criticality;
+	struct InitiatingMessage__value {
+		InitiatingMessage__value_PR present;
+		union InitiatingMessage__value_u {
+			RICsubscriptionRequest_t	 RICsubscriptionRequest;
+			RICsubscriptionDeleteRequest_t	 RICsubscriptionDeleteRequest;
+			RICserviceUpdate_t	 RICserviceUpdate;
+			RICcontrolRequest_t	 RICcontrolRequest;
+			E2setupRequest_t	 E2setupRequest;
+			ResetRequest_t	 ResetRequest;
+			RICindication_t	 RICindication;
+			RICserviceQuery_t	 RICserviceQuery;
+			ErrorIndication_t	 ErrorIndication;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} InitiatingMessage_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_InitiatingMessage;
+extern asn_SEQUENCE_specifics_t asn_SPC_InitiatingMessage_specs_1;
+extern asn_TYPE_member_t asn_MBR_InitiatingMessage_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _InitiatingMessage_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/Makefile.am.libasncodec b/3rdparty/E2AP-v01.00.00/Makefile.am.libasncodec
new file mode 100644
index 0000000..c390b17
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/Makefile.am.libasncodec
@@ -0,0 +1,273 @@
+ASN_MODULE_SRCS=	\
+	E2AP-PDU.c	\
+	InitiatingMessage.c	\
+	SuccessfulOutcome.c	\
+	UnsuccessfulOutcome.c	\
+	RICsubscriptionRequest.c	\
+	RICsubscriptionDetails.c	\
+	RICactions-ToBeSetup-List.c	\
+	RICaction-ToBeSetup-Item.c	\
+	RICsubscriptionResponse.c	\
+	RICaction-Admitted-List.c	\
+	RICaction-Admitted-Item.c	\
+	RICaction-NotAdmitted-List.c	\
+	RICaction-NotAdmitted-Item.c	\
+	RICsubscriptionFailure.c	\
+	RICsubscriptionDeleteRequest.c	\
+	RICsubscriptionDeleteResponse.c	\
+	RICsubscriptionDeleteFailure.c	\
+	RICindication.c	\
+	RICcontrolRequest.c	\
+	RICcontrolAcknowledge.c	\
+	RICcontrolFailure.c	\
+	ErrorIndication.c	\
+	E2setupRequest.c	\
+	E2setupResponse.c	\
+	E2setupFailure.c	\
+	ResetRequest.c	\
+	ResetResponse.c	\
+	RICserviceUpdate.c	\
+	RANfunctions-List.c	\
+	RANfunction-Item.c	\
+	RANfunctionsID-List.c	\
+	RANfunctionID-Item.c	\
+	RICserviceUpdateAcknowledge.c	\
+	RANfunctionsIDcause-List.c	\
+	RANfunctionIDcause-Item.c	\
+	RICserviceUpdateFailure.c	\
+	RICserviceQuery.c	\
+	Cause.c	\
+	CauseMisc.c	\
+	CauseProtocol.c	\
+	CauseRIC.c	\
+	CauseRICservice.c	\
+	CauseTransport.c	\
+	CriticalityDiagnostics.c	\
+	CriticalityDiagnostics-IE-List.c	\
+	CriticalityDiagnostics-IE-Item.c	\
+	ENB-ID.c	\
+	ENB-ID-Choice.c	\
+	ENGNB-ID.c	\
+	GlobalE2node-ID.c	\
+	GlobalE2node-en-gNB-ID.c	\
+	GlobalE2node-eNB-ID.c	\
+	GlobalE2node-gNB-ID.c	\
+	GlobalE2node-ng-eNB-ID.c	\
+	GlobalENB-ID.c	\
+	GlobalenGNB-ID.c	\
+	GlobalgNB-ID.c	\
+	GlobalngeNB-ID.c	\
+	GlobalRIC-ID.c	\
+	GNB-CU-UP-ID.c	\
+	GNB-DU-ID.c	\
+	GNB-ID-Choice.c	\
+	PLMN-Identity.c	\
+	RANfunctionDefinition.c	\
+	RANfunctionID.c	\
+	RANfunctionRevision.c	\
+	RICactionDefinition.c	\
+	RICactionID.c	\
+	RICactionType.c	\
+	RICcallProcessID.c	\
+	RICcontrolAckRequest.c	\
+	RICcontrolHeader.c	\
+	RICcontrolMessage.c	\
+	RICcontrolOutcome.c	\
+	RICcontrolStatus.c	\
+	RICeventTriggerDefinition.c	\
+	RICindicationHeader.c	\
+	RICindicationMessage.c	\
+	RICindicationSN.c	\
+	RICindicationType.c	\
+	RICrequestID.c	\
+	RICsubsequentAction.c	\
+	RICsubsequentActionType.c	\
+	RICtimeToWait.c	\
+	TimeToWait.c	\
+	TypeOfError.c	\
+	Criticality.c	\
+	Presence.c	\
+	ProcedureCode.c	\
+	ProtocolIE-ID.c	\
+	TriggeringMessage.c	\
+	ProtocolIE-Container.c	\
+	ProtocolIE-SingleContainer.c	\
+	ProtocolIE-Field.c	\
+	ProtocolIE-ContainerPair.c	\
+	ProtocolIE-FieldPair.c	\
+	ProtocolIE-ContainerList.c	\
+	ProtocolIE-ContainerPairList.c
+
+ASN_MODULE_HDRS=	\
+	E2AP-PDU.h	\
+	InitiatingMessage.h	\
+	SuccessfulOutcome.h	\
+	UnsuccessfulOutcome.h	\
+	RICsubscriptionRequest.h	\
+	RICsubscriptionDetails.h	\
+	RICactions-ToBeSetup-List.h	\
+	RICaction-ToBeSetup-Item.h	\
+	RICsubscriptionResponse.h	\
+	RICaction-Admitted-List.h	\
+	RICaction-Admitted-Item.h	\
+	RICaction-NotAdmitted-List.h	\
+	RICaction-NotAdmitted-Item.h	\
+	RICsubscriptionFailure.h	\
+	RICsubscriptionDeleteRequest.h	\
+	RICsubscriptionDeleteResponse.h	\
+	RICsubscriptionDeleteFailure.h	\
+	RICindication.h	\
+	RICcontrolRequest.h	\
+	RICcontrolAcknowledge.h	\
+	RICcontrolFailure.h	\
+	ErrorIndication.h	\
+	E2setupRequest.h	\
+	E2setupResponse.h	\
+	E2setupFailure.h	\
+	ResetRequest.h	\
+	ResetResponse.h	\
+	RICserviceUpdate.h	\
+	RANfunctions-List.h	\
+	RANfunction-Item.h	\
+	RANfunctionsID-List.h	\
+	RANfunctionID-Item.h	\
+	RICserviceUpdateAcknowledge.h	\
+	RANfunctionsIDcause-List.h	\
+	RANfunctionIDcause-Item.h	\
+	RICserviceUpdateFailure.h	\
+	RICserviceQuery.h	\
+	Cause.h	\
+	CauseMisc.h	\
+	CauseProtocol.h	\
+	CauseRIC.h	\
+	CauseRICservice.h	\
+	CauseTransport.h	\
+	CriticalityDiagnostics.h	\
+	CriticalityDiagnostics-IE-List.h	\
+	CriticalityDiagnostics-IE-Item.h	\
+	ENB-ID.h	\
+	ENB-ID-Choice.h	\
+	ENGNB-ID.h	\
+	GlobalE2node-ID.h	\
+	GlobalE2node-en-gNB-ID.h	\
+	GlobalE2node-eNB-ID.h	\
+	GlobalE2node-gNB-ID.h	\
+	GlobalE2node-ng-eNB-ID.h	\
+	GlobalENB-ID.h	\
+	GlobalenGNB-ID.h	\
+	GlobalgNB-ID.h	\
+	GlobalngeNB-ID.h	\
+	GlobalRIC-ID.h	\
+	GNB-CU-UP-ID.h	\
+	GNB-DU-ID.h	\
+	GNB-ID-Choice.h	\
+	PLMN-Identity.h	\
+	RANfunctionDefinition.h	\
+	RANfunctionID.h	\
+	RANfunctionRevision.h	\
+	RICactionDefinition.h	\
+	RICactionID.h	\
+	RICactionType.h	\
+	RICcallProcessID.h	\
+	RICcontrolAckRequest.h	\
+	RICcontrolHeader.h	\
+	RICcontrolMessage.h	\
+	RICcontrolOutcome.h	\
+	RICcontrolStatus.h	\
+	RICeventTriggerDefinition.h	\
+	RICindicationHeader.h	\
+	RICindicationMessage.h	\
+	RICindicationSN.h	\
+	RICindicationType.h	\
+	RICrequestID.h	\
+	RICsubsequentAction.h	\
+	RICsubsequentActionType.h	\
+	RICtimeToWait.h	\
+	TimeToWait.h	\
+	TypeOfError.h	\
+	Criticality.h	\
+	Presence.h	\
+	ProcedureCode.h	\
+	ProtocolIE-ID.h	\
+	TriggeringMessage.h	\
+	ProtocolIE-Container.h	\
+	ProtocolIE-SingleContainer.h	\
+	ProtocolIE-Field.h	\
+	ProtocolIE-ContainerPair.h	\
+	ProtocolIE-FieldPair.h	\
+	ProtocolIE-ContainerList.h	\
+	ProtocolIE-ContainerPairList.h
+
+ASN_MODULE_HDRS+=ANY.h
+ASN_MODULE_SRCS+=ANY.c
+ASN_MODULE_HDRS+=OCTET_STRING.h
+ASN_MODULE_HDRS+=OPEN_TYPE.h
+ASN_MODULE_SRCS+=OPEN_TYPE.c
+ASN_MODULE_HDRS+=constr_CHOICE.h
+ASN_MODULE_HDRS+=INTEGER.h
+ASN_MODULE_SRCS+=INTEGER.c
+ASN_MODULE_HDRS+=NativeEnumerated.h
+ASN_MODULE_SRCS+=NativeEnumerated.c
+ASN_MODULE_HDRS+=NativeInteger.h
+ASN_MODULE_SRCS+=NativeInteger.c
+ASN_MODULE_HDRS+=asn_SEQUENCE_OF.h
+ASN_MODULE_SRCS+=asn_SEQUENCE_OF.c
+ASN_MODULE_HDRS+=asn_SET_OF.h
+ASN_MODULE_SRCS+=asn_SET_OF.c
+ASN_MODULE_SRCS+=constr_CHOICE.c
+ASN_MODULE_HDRS+=constr_SEQUENCE.h
+ASN_MODULE_SRCS+=constr_SEQUENCE.c
+ASN_MODULE_HDRS+=constr_SEQUENCE_OF.h
+ASN_MODULE_SRCS+=constr_SEQUENCE_OF.c
+ASN_MODULE_HDRS+=constr_SET_OF.h
+ASN_MODULE_SRCS+=constr_SET_OF.c
+ASN_MODULE_HDRS+=asn_application.h
+ASN_MODULE_SRCS+=asn_application.c
+ASN_MODULE_HDRS+=asn_ioc.h
+ASN_MODULE_HDRS+=asn_system.h
+ASN_MODULE_HDRS+=asn_codecs.h
+ASN_MODULE_HDRS+=asn_internal.h
+ASN_MODULE_SRCS+=asn_internal.c
+ASN_MODULE_HDRS+=asn_random_fill.h
+ASN_MODULE_SRCS+=asn_random_fill.c
+ASN_MODULE_HDRS+=asn_bit_data.h
+ASN_MODULE_SRCS+=asn_bit_data.c
+ASN_MODULE_SRCS+=OCTET_STRING.c
+ASN_MODULE_HDRS+=BIT_STRING.h
+ASN_MODULE_SRCS+=BIT_STRING.c
+ASN_MODULE_SRCS+=asn_codecs_prim.c
+ASN_MODULE_HDRS+=asn_codecs_prim.h
+ASN_MODULE_HDRS+=ber_tlv_length.h
+ASN_MODULE_SRCS+=ber_tlv_length.c
+ASN_MODULE_HDRS+=ber_tlv_tag.h
+ASN_MODULE_SRCS+=ber_tlv_tag.c
+ASN_MODULE_HDRS+=ber_decoder.h
+ASN_MODULE_SRCS+=ber_decoder.c
+ASN_MODULE_HDRS+=der_encoder.h
+ASN_MODULE_SRCS+=der_encoder.c
+ASN_MODULE_HDRS+=constr_TYPE.h
+ASN_MODULE_SRCS+=constr_TYPE.c
+ASN_MODULE_HDRS+=constraints.h
+ASN_MODULE_SRCS+=constraints.c
+ASN_MODULE_HDRS+=xer_support.h
+ASN_MODULE_SRCS+=xer_support.c
+ASN_MODULE_HDRS+=xer_decoder.h
+ASN_MODULE_SRCS+=xer_decoder.c
+ASN_MODULE_HDRS+=xer_encoder.h
+ASN_MODULE_SRCS+=xer_encoder.c
+ASN_MODULE_HDRS+=per_support.h
+ASN_MODULE_SRCS+=per_support.c
+ASN_MODULE_HDRS+=per_decoder.h
+ASN_MODULE_SRCS+=per_decoder.c
+ASN_MODULE_HDRS+=per_encoder.h
+ASN_MODULE_SRCS+=per_encoder.c
+ASN_MODULE_HDRS+=per_opentype.h
+ASN_MODULE_SRCS+=per_opentype.c
+
+ASN_MODULE_CFLAGS=-DASN_DISABLE_OER_SUPPORT 
+
+lib_LTLIBRARIES+=libasncodec.la
+libasncodec_la_SOURCES=$(ASN_MODULE_SRCS) $(ASN_MODULE_HDRS)
+libasncodec_la_CPPFLAGS=-I$(top_srcdir)/
+libasncodec_la_CFLAGS=$(ASN_MODULE_CFLAGS)
+libasncodec_la_LDFLAGS=-lm
diff --git a/3rdparty/libe2ap/NativeEnumerated.c b/3rdparty/E2AP-v01.00.00/NativeEnumerated.c
similarity index 100%
rename from 3rdparty/libe2ap/NativeEnumerated.c
rename to 3rdparty/E2AP-v01.00.00/NativeEnumerated.c
diff --git a/3rdparty/libe2ap/NativeEnumerated.h b/3rdparty/E2AP-v01.00.00/NativeEnumerated.h
similarity index 100%
rename from 3rdparty/libe2ap/NativeEnumerated.h
rename to 3rdparty/E2AP-v01.00.00/NativeEnumerated.h
diff --git a/3rdparty/libe2ap/NativeInteger.c b/3rdparty/E2AP-v01.00.00/NativeInteger.c
similarity index 100%
rename from 3rdparty/libe2ap/NativeInteger.c
rename to 3rdparty/E2AP-v01.00.00/NativeInteger.c
diff --git a/3rdparty/libe2ap/NativeInteger.h b/3rdparty/E2AP-v01.00.00/NativeInteger.h
similarity index 100%
rename from 3rdparty/libe2ap/NativeInteger.h
rename to 3rdparty/E2AP-v01.00.00/NativeInteger.h
diff --git a/3rdparty/E2AP-v01.00.00/OCTET_STRING.c b/3rdparty/E2AP-v01.00.00/OCTET_STRING.c
new file mode 100644
index 0000000..432ce5a
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/OCTET_STRING.c
@@ -0,0 +1,2409 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>.
+ * All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#include <asn_internal.h>
+#include <OCTET_STRING.h>
+#include <BIT_STRING.h>	/* for .bits_unused member */
+#include <errno.h>
+
+/*
+ * OCTET STRING basic type description.
+ */
+static const ber_tlv_tag_t asn_DEF_OCTET_STRING_tags[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_OCTET_STRING_specifics_t asn_SPC_OCTET_STRING_specs = {
+	sizeof(OCTET_STRING_t),
+	offsetof(OCTET_STRING_t, _asn_ctx),
+	ASN_OSUBV_STR
+};
+
+asn_TYPE_operation_t asn_OP_OCTET_STRING = {
+	OCTET_STRING_free,
+	OCTET_STRING_print,	/* OCTET STRING generally means a non-ascii sequence */
+	OCTET_STRING_compare,
+	OCTET_STRING_decode_ber,
+	OCTET_STRING_encode_der,
+	OCTET_STRING_decode_xer_hex,
+	OCTET_STRING_encode_xer,
+#ifdef	ASN_DISABLE_OER_SUPPORT
+	0,
+	0,
+#else
+	OCTET_STRING_decode_oer,
+	OCTET_STRING_encode_oer,
+#endif  /* ASN_DISABLE_OER_SUPPORT */
+#ifdef	ASN_DISABLE_PER_SUPPORT
+	0,
+	0,
+	0,
+	0,
+#else
+	OCTET_STRING_decode_uper,	/* Unaligned PER decoder */
+	OCTET_STRING_encode_uper,	/* Unaligned PER encoder */
+	OCTET_STRING_decode_aper,	/* Aligned PER decoder */
+	OCTET_STRING_encode_aper,	/* Aligned PER encoder */
+#endif	/* ASN_DISABLE_PER_SUPPORT */
+	OCTET_STRING_random_fill,
+	0	/* Use generic outmost tag fetcher */
+};
+asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = {
+	"OCTET STRING",		/* Canonical name */
+	"OCTET_STRING",		/* XML tag name */
+	&asn_OP_OCTET_STRING,
+	asn_DEF_OCTET_STRING_tags,
+	sizeof(asn_DEF_OCTET_STRING_tags)
+	  / sizeof(asn_DEF_OCTET_STRING_tags[0]),
+	asn_DEF_OCTET_STRING_tags,	/* Same as above */
+	sizeof(asn_DEF_OCTET_STRING_tags)
+	  / sizeof(asn_DEF_OCTET_STRING_tags[0]),
+	{ 0, 0, asn_generic_no_constraint },
+	0, 0,	/* No members */
+	&asn_SPC_OCTET_STRING_specs
+};
+
+#undef	_CH_PHASE
+#undef	NEXT_PHASE
+#undef	PREV_PHASE
+#define	_CH_PHASE(ctx, inc) do {					\
+		if(ctx->phase == 0)					\
+			ctx->context = 0;				\
+		ctx->phase += inc;					\
+	} while(0)
+#define	NEXT_PHASE(ctx)	_CH_PHASE(ctx, +1)
+#define	PREV_PHASE(ctx)	_CH_PHASE(ctx, -1)
+
+#undef	ADVANCE
+#define	ADVANCE(num_bytes)	do {					\
+		size_t num = (num_bytes);				\
+		buf_ptr = ((const char *)buf_ptr) + num;		\
+		size -= num;						\
+		consumed_myself += num;					\
+	} while(0)
+
+#undef	RETURN
+#define	RETURN(_code)	do {						\
+		asn_dec_rval_t tmprval;					\
+		tmprval.code = _code;					\
+		tmprval.consumed = consumed_myself;			\
+		return tmprval;						\
+	} while(0)
+
+#undef	APPEND
+#define	APPEND(bufptr, bufsize)	do {					\
+		size_t _bs = (bufsize);		/* Append size */	\
+		size_t _ns = ctx->context;	/* Allocated now */	\
+		size_t _es = st->size + _bs;	/* Expected size */	\
+		/* int is really a typeof(st->size): */			\
+		if((int)_es < 0) RETURN(RC_FAIL);			\
+		if(_ns <= _es) {					\
+			void *ptr;					\
+			/* Be nice and round to the memory allocator */	\
+			do { _ns = _ns ? _ns << 1 : 16; }		\
+			    while(_ns <= _es);				\
+			/* int is really a typeof(st->size): */		\
+			if((int)_ns < 0) RETURN(RC_FAIL);		\
+			ptr = REALLOC(st->buf, _ns);			\
+			if(ptr) {					\
+				st->buf = (uint8_t *)ptr;		\
+				ctx->context = _ns;			\
+			} else {					\
+				RETURN(RC_FAIL);			\
+			}						\
+			ASN_DEBUG("Reallocating into %ld", (long)_ns);	\
+		}							\
+		memcpy(st->buf + st->size, bufptr, _bs);		\
+		/* Convenient nul-termination */			\
+		st->buf[_es] = '\0';					\
+		st->size = _es;						\
+	} while(0)
+
+/*
+ * The main reason why ASN.1 is still alive is that too much time and effort
+ * is necessary for learning it more or less adequately, thus creating a gut
+ * necessity to demonstrate that aquired skill everywhere afterwards.
+ * No, I am not going to explain what the following stuff is.
+ */
+struct _stack_el {
+    ber_tlv_len_t left;     /* What's left to read (or -1) */
+    ber_tlv_len_t got;      /* What was actually processed */
+    unsigned cont_level;    /* Depth of subcontainment */
+    int want_nulls;         /* Want null "end of content" octets? */
+    int bits_chopped;       /* Flag in BIT STRING mode */
+    ber_tlv_tag_t tag;      /* For debugging purposes */
+    struct _stack_el *prev;
+    struct _stack_el *next;
+};
+struct _stack {
+	struct _stack_el *tail;
+	struct _stack_el *cur_ptr;
+};
+
+static struct _stack_el *
+OS__add_stack_el(struct _stack *st) {
+	struct _stack_el *nel;
+
+	/*
+	 * Reuse the old stack frame or allocate a new one.
+	 */
+	if(st->cur_ptr && st->cur_ptr->next) {
+		nel = st->cur_ptr->next;
+		nel->bits_chopped = 0;
+		nel->got = 0;
+		/* Retain the nel->cont_level, it's correct. */
+	} else {
+		nel = (struct _stack_el *)CALLOC(1, sizeof(struct _stack_el));
+		if(nel == NULL)
+			return NULL;
+	
+		if(st->tail) {
+			/* Increase a subcontainment depth */
+			nel->cont_level = st->tail->cont_level + 1;
+			st->tail->next = nel;
+		}
+		nel->prev = st->tail;
+		st->tail = nel;
+	}
+
+	st->cur_ptr = nel;
+
+	return nel;
+}
+
+static struct _stack *
+_new_stack(void) {
+	return (struct _stack *)CALLOC(1, sizeof(struct _stack));
+}
+
+/*
+ * Decode OCTET STRING type.
+ */
+asn_dec_rval_t
+OCTET_STRING_decode_ber(const asn_codec_ctx_t *opt_codec_ctx,
+                        const asn_TYPE_descriptor_t *td, void **sptr,
+                        const void *buf_ptr, size_t size, int tag_mode) {
+    const asn_OCTET_STRING_specifics_t *specs = td->specifics
+				? (const asn_OCTET_STRING_specifics_t *)td->specifics
+				: &asn_SPC_OCTET_STRING_specs;
+	BIT_STRING_t *st = (BIT_STRING_t *)*sptr;
+	asn_dec_rval_t rval;
+	asn_struct_ctx_t *ctx;
+	ssize_t consumed_myself = 0;
+	struct _stack *stck;		/* Expectations stack structure */
+	struct _stack_el *sel = 0;	/* Stack element */
+	int tlv_constr;
+	enum asn_OS_Subvariant type_variant = specs->subvariant;
+
+	ASN_DEBUG("Decoding %s as %s (frame %ld)",
+		td->name,
+		(type_variant == ASN_OSUBV_STR) ?
+			"OCTET STRING" : "OS-SpecialCase",
+		(long)size);
+
+	/*
+	 * Create the string if does not exist.
+	 */
+	if(st == NULL) {
+		st = (BIT_STRING_t *)(*sptr = CALLOC(1, specs->struct_size));
+		if(st == NULL) RETURN(RC_FAIL);
+	}
+
+	/* Restore parsing context */
+	ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
+
+	switch(ctx->phase) {
+	case 0:
+		/*
+		 * Check tags.
+		 */
+		rval = ber_check_tags(opt_codec_ctx, td, ctx,
+			buf_ptr, size, tag_mode, -1,
+			&ctx->left, &tlv_constr);
+		if(rval.code != RC_OK)
+			return rval;
+
+		if(tlv_constr) {
+			/*
+			 * Complex operation, requires stack of expectations.
+			 */
+			ctx->ptr = _new_stack();
+			if(!ctx->ptr) {
+				RETURN(RC_FAIL);
+			}
+		} else {
+			/*
+			 * Jump into stackless primitive decoding.
+			 */
+			_CH_PHASE(ctx, 3);
+			if(type_variant == ASN_OSUBV_ANY && tag_mode != 1)
+				APPEND(buf_ptr, rval.consumed);
+			ADVANCE(rval.consumed);
+			goto phase3;
+		}
+
+		NEXT_PHASE(ctx);
+		/* Fall through */
+	case 1:
+	phase1:
+		/*
+		 * Fill the stack with expectations.
+		 */
+		stck = (struct _stack *)ctx->ptr;
+		sel = stck->cur_ptr;
+	  do {
+		ber_tlv_tag_t tlv_tag;
+		ber_tlv_len_t tlv_len;
+		ber_tlv_tag_t expected_tag;
+		ssize_t tl, ll, tlvl;
+				/* This one works even if (sel->left == -1) */
+		size_t Left = ((!sel||(size_t)sel->left >= size)
+					?size:(size_t)sel->left);
+
+
+		ASN_DEBUG("%p, s->l=%ld, s->wn=%ld, s->g=%ld\n", (void *)sel,
+			(long)(sel?sel->left:0),
+			(long)(sel?sel->want_nulls:0),
+			(long)(sel?sel->got:0)
+		);
+		if(sel && sel->left <= 0 && sel->want_nulls == 0) {
+			if(sel->prev) {
+				struct _stack_el *prev = sel->prev;
+				if(prev->left != -1) {
+					if(prev->left < sel->got)
+						RETURN(RC_FAIL);
+					prev->left -= sel->got;
+				}
+				prev->got += sel->got;
+				sel = stck->cur_ptr = prev;
+				if(!sel) break;
+				tlv_constr = 1;
+				continue;
+			} else {
+				sel = stck->cur_ptr = 0;
+				break;	/* Nothing to wait */
+			}
+		}
+
+		tl = ber_fetch_tag(buf_ptr, Left, &tlv_tag);
+		ASN_DEBUG("fetch tag(size=%ld,L=%ld), %sstack, left=%ld, wn=%ld, tl=%ld",
+			(long)size, (long)Left, sel?"":"!",
+			(long)(sel?sel->left:0),
+			(long)(sel?sel->want_nulls:0),
+			(long)tl);
+		switch(tl) {
+		case -1: RETURN(RC_FAIL);
+		case 0: RETURN(RC_WMORE);
+		}
+
+		tlv_constr = BER_TLV_CONSTRUCTED(buf_ptr);
+
+		ll = ber_fetch_length(tlv_constr,
+				(const char *)buf_ptr + tl,Left - tl,&tlv_len);
+		ASN_DEBUG("Got tag=%s, tc=%d, left=%ld, tl=%ld, len=%ld, ll=%ld",
+			ber_tlv_tag_string(tlv_tag), tlv_constr,
+				(long)Left, (long)tl, (long)tlv_len, (long)ll);
+		switch(ll) {
+		case -1: RETURN(RC_FAIL);
+		case 0: RETURN(RC_WMORE);
+		}
+
+		if(sel && sel->want_nulls
+			&& ((const uint8_t *)buf_ptr)[0] == 0
+			&& ((const uint8_t *)buf_ptr)[1] == 0)
+		{
+
+			ASN_DEBUG("Eat EOC; wn=%d--", sel->want_nulls);
+
+			if(type_variant == ASN_OSUBV_ANY
+			&& (tag_mode != 1 || sel->cont_level))
+				APPEND("\0\0", 2);
+
+			ADVANCE(2);
+			sel->got += 2;
+			if(sel->left != -1) {
+				sel->left -= 2;	/* assert(sel->left >= 2) */
+			}
+
+			sel->want_nulls--;
+			if(sel->want_nulls == 0) {
+				/* Move to the next expectation */
+				sel->left = 0;
+				tlv_constr = 1;
+			}
+
+			continue;
+		}
+
+		/*
+		 * Set up expected tags,
+		 * depending on ASN.1 type being decoded.
+		 */
+		switch(type_variant) {
+		case ASN_OSUBV_BIT:
+			/* X.690: 8.6.4.1, NOTE 2 */
+			/* Fall through */
+		case ASN_OSUBV_STR:
+		default:
+			if(sel) {
+				unsigned level = sel->cont_level;
+				if(level < td->all_tags_count) {
+					expected_tag = td->all_tags[level];
+					break;
+				} else if(td->all_tags_count) {
+					expected_tag = td->all_tags
+						[td->all_tags_count - 1];
+					break;
+				}
+				/* else, Fall through */
+			}
+			/* Fall through */
+		case ASN_OSUBV_ANY:
+			expected_tag = tlv_tag;
+			break;
+		}
+
+
+		if(tlv_tag != expected_tag) {
+			char buf[2][32];
+			ber_tlv_tag_snprint(tlv_tag,
+				buf[0], sizeof(buf[0]));
+			ber_tlv_tag_snprint(td->tags[td->tags_count-1],
+				buf[1], sizeof(buf[1]));
+			ASN_DEBUG("Tag does not match expectation: %s != %s",
+				buf[0], buf[1]);
+			RETURN(RC_FAIL);
+		}
+
+		tlvl = tl + ll;	/* Combined length of T and L encoding */
+		if((tlv_len + tlvl) < 0) {
+			/* tlv_len value is too big */
+			ASN_DEBUG("TLV encoding + length (%ld) is too big",
+				(long)tlv_len);
+			RETURN(RC_FAIL);
+		}
+
+		/*
+		 * Append a new expectation.
+		 */
+		sel = OS__add_stack_el(stck);
+		if(!sel) RETURN(RC_FAIL);
+
+		sel->tag = tlv_tag;
+
+		sel->want_nulls = (tlv_len==-1);
+		if(sel->prev && sel->prev->left != -1) {
+			/* Check that the parent frame is big enough */
+			if(sel->prev->left < tlvl + (tlv_len==-1?0:tlv_len))
+				RETURN(RC_FAIL);
+			if(tlv_len == -1)
+				sel->left = sel->prev->left - tlvl;
+			else
+				sel->left = tlv_len;
+		} else {
+			sel->left = tlv_len;
+		}
+		if(type_variant == ASN_OSUBV_ANY
+		&& (tag_mode != 1 || sel->cont_level))
+			APPEND(buf_ptr, tlvl);
+		sel->got += tlvl;
+		ADVANCE(tlvl);
+
+		ASN_DEBUG("+EXPECT2 got=%ld left=%ld, wn=%d, clvl=%u",
+			(long)sel->got, (long)sel->left,
+			sel->want_nulls, sel->cont_level);
+
+	  } while(tlv_constr);
+		if(sel == NULL) {
+			/* Finished operation, "phase out" */
+			ASN_DEBUG("Phase out");
+			_CH_PHASE(ctx, +3);
+			break;
+		}
+
+		NEXT_PHASE(ctx);
+		/* Fall through */
+	case 2:
+		stck = (struct _stack *)ctx->ptr;
+		sel = stck->cur_ptr;
+		ASN_DEBUG("Phase 2: Need %ld bytes, size=%ld, alrg=%ld, wn=%d",
+			(long)sel->left, (long)size, (long)sel->got,
+				sel->want_nulls);
+	    {
+		ber_tlv_len_t len;
+
+		assert(sel->left >= 0);
+
+		len = ((ber_tlv_len_t)size < sel->left)
+				? (ber_tlv_len_t)size : sel->left;
+		if(len > 0) {
+			if(type_variant == ASN_OSUBV_BIT
+			&& sel->bits_chopped == 0) {
+				/* Put the unused-bits-octet away */
+				st->bits_unused = *(const uint8_t *)buf_ptr;
+				APPEND(((const char *)buf_ptr+1), (len - 1));
+				sel->bits_chopped = 1;
+			} else {
+				APPEND(buf_ptr, len);
+			}
+			ADVANCE(len);
+			sel->left -= len;
+			sel->got += len;
+		}
+
+		if(sel->left) {
+			ASN_DEBUG("OS left %ld, size = %ld, wn=%d\n",
+				(long)sel->left, (long)size, sel->want_nulls);
+			RETURN(RC_WMORE);
+		}
+
+		PREV_PHASE(ctx);
+		goto phase1;
+	    }
+		break;
+	case 3:
+	phase3:
+		/*
+		 * Primitive form, no stack required.
+		 */
+		assert(ctx->left >= 0);
+
+		if(size < (size_t)ctx->left) {
+			if(!size) RETURN(RC_WMORE);
+			if(type_variant == ASN_OSUBV_BIT && !ctx->context) {
+				st->bits_unused = *(const uint8_t *)buf_ptr;
+				ctx->left--;
+				ADVANCE(1);
+			}
+			APPEND(buf_ptr, size);
+			assert(ctx->context > 0);
+			ctx->left -= size;
+			ADVANCE(size);
+			RETURN(RC_WMORE);
+		} else {
+			if(type_variant == ASN_OSUBV_BIT
+			&& !ctx->context && ctx->left) {
+				st->bits_unused = *(const uint8_t *)buf_ptr;
+				ctx->left--;
+				ADVANCE(1);
+			}
+			APPEND(buf_ptr, ctx->left);
+			ADVANCE(ctx->left);
+			ctx->left = 0;
+
+			NEXT_PHASE(ctx);
+		}
+		break;
+	}
+
+	if(sel) {
+		ASN_DEBUG("3sel p=%p, wn=%d, l=%ld, g=%ld, size=%ld",
+			(void *)sel->prev, sel->want_nulls,
+			(long)sel->left, (long)sel->got, (long)size);
+		if(sel->prev || sel->want_nulls > 1 || sel->left > 0) {
+			RETURN(RC_WMORE);
+		}
+	}
+
+	/*
+	 * BIT STRING-specific processing.
+	 */
+	if(type_variant == ASN_OSUBV_BIT) {
+        if(st->size) {
+			if(st->bits_unused < 0 || st->bits_unused > 7) {
+				RETURN(RC_FAIL);
+			}
+			/* Finalize BIT STRING: zero out unused bits. */
+			st->buf[st->size-1] &= 0xff << st->bits_unused;
+		} else {
+			if(st->bits_unused) {
+				RETURN(RC_FAIL);
+			}
+		}
+	}
+
+	ASN_DEBUG("Took %ld bytes to encode %s: [%s]:%ld",
+		(long)consumed_myself, td->name,
+		(type_variant == ASN_OSUBV_STR) ? (char *)st->buf : "<data>",
+		(long)st->size);
+
+
+	RETURN(RC_OK);
+}
+
+/*
+ * Encode OCTET STRING type using DER.
+ */
+asn_enc_rval_t
+OCTET_STRING_encode_der(const asn_TYPE_descriptor_t *td, const void *sptr,
+                        int tag_mode, ber_tlv_tag_t tag,
+                        asn_app_consume_bytes_f *cb, void *app_key) {
+    asn_enc_rval_t er = { 0, 0, 0 };
+	const asn_OCTET_STRING_specifics_t *specs = td->specifics
+				? (const asn_OCTET_STRING_specifics_t *)td->specifics
+				: &asn_SPC_OCTET_STRING_specs;
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	enum asn_OS_Subvariant type_variant = specs->subvariant;
+	int fix_last_byte = 0;
+
+	ASN_DEBUG("%s %s as OCTET STRING",
+		cb?"Estimating":"Encoding", td->name);
+
+	/*
+	 * Write tags.
+	 */
+	if(type_variant != ASN_OSUBV_ANY || tag_mode == 1) {
+		er.encoded = der_write_tags(td,
+				(type_variant == ASN_OSUBV_BIT) + st->size,
+			tag_mode, type_variant == ASN_OSUBV_ANY, tag,
+			cb, app_key);
+		if(er.encoded == -1) {
+			er.failed_type = td;
+			er.structure_ptr = sptr;
+			return er;
+		}
+	} else {
+		/* Disallow: [<tag>] IMPLICIT ANY */
+		assert(type_variant != ASN_OSUBV_ANY || tag_mode != -1);
+		er.encoded = 0;
+	}
+
+	if(!cb) {
+		er.encoded += (type_variant == ASN_OSUBV_BIT) + st->size;
+		ASN__ENCODED_OK(er);
+	}
+
+	/*
+	 * Prepare to deal with the last octet of BIT STRING.
+	 */
+	if(type_variant == ASN_OSUBV_BIT) {
+		uint8_t b = st->bits_unused & 0x07;
+		if(b && st->size) fix_last_byte = 1;
+		ASN__CALLBACK(&b, 1);
+	}
+
+	/* Invoke callback for the main part of the buffer */
+	ASN__CALLBACK(st->buf, st->size - fix_last_byte);
+
+	/* The last octet should be stripped off the unused bits */
+	if(fix_last_byte) {
+		uint8_t b = st->buf[st->size-1] & (0xff << st->bits_unused);
+		ASN__CALLBACK(&b, 1);
+	}
+
+	ASN__ENCODED_OK(er);
+cb_failed:
+	ASN__ENCODE_FAILED;
+}
+
+asn_enc_rval_t
+OCTET_STRING_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr,
+                        int ilevel, enum xer_encoder_flags_e flags,
+                        asn_app_consume_bytes_f *cb, void *app_key) {
+    const char * const h2c = "0123456789ABCDEF";
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	asn_enc_rval_t er = { 0, 0, 0 };
+	char scratch[16 * 3 + 4];
+	char *p = scratch;
+	uint8_t *buf;
+	uint8_t *end;
+	size_t i;
+
+	if(!st || (!st->buf && st->size))
+		ASN__ENCODE_FAILED;
+
+	er.encoded = 0;
+
+	/*
+	 * Dump the contents of the buffer in hexadecimal.
+	 */
+	buf = st->buf;
+	end = buf + st->size;
+	if(flags & XER_F_CANONICAL) {
+		char *scend = scratch + (sizeof(scratch) - 2);
+		for(; buf < end; buf++) {
+			if(p >= scend) {
+				ASN__CALLBACK(scratch, p - scratch);
+				p = scratch;
+			}
+			*p++ = h2c[(*buf >> 4) & 0x0F];
+			*p++ = h2c[*buf & 0x0F];
+		}
+
+		ASN__CALLBACK(scratch, p-scratch);	/* Dump the rest */
+	} else {
+		for(i = 0; buf < end; buf++, i++) {
+			if(!(i % 16) && (i || st->size > 16)) {
+				ASN__CALLBACK(scratch, p-scratch);
+				p = scratch;
+				ASN__TEXT_INDENT(1, ilevel);
+			}
+			*p++ = h2c[(*buf >> 4) & 0x0F];
+			*p++ = h2c[*buf & 0x0F];
+			*p++ = 0x20;
+		}
+		if(p - scratch) {
+			p--;	/* Remove the tail space */
+			ASN__CALLBACK(scratch, p-scratch); /* Dump the rest */
+			if(st->size > 16)
+				ASN__TEXT_INDENT(1, ilevel-1);
+		}
+	}
+
+	ASN__ENCODED_OK(er);
+cb_failed:
+	ASN__ENCODE_FAILED;
+}
+
+static const struct OCTET_STRING__xer_escape_table_s {
+	const char *string;
+	int size;
+} OCTET_STRING__xer_escape_table[] = {
+#define	OSXET(s)	{ s, sizeof(s) - 1 }
+	OSXET("\074\156\165\154\057\076"),	/* <nul/> */
+	OSXET("\074\163\157\150\057\076"),	/* <soh/> */
+	OSXET("\074\163\164\170\057\076"),	/* <stx/> */
+	OSXET("\074\145\164\170\057\076"),	/* <etx/> */
+	OSXET("\074\145\157\164\057\076"),	/* <eot/> */
+	OSXET("\074\145\156\161\057\076"),	/* <enq/> */
+	OSXET("\074\141\143\153\057\076"),	/* <ack/> */
+	OSXET("\074\142\145\154\057\076"),	/* <bel/> */
+	OSXET("\074\142\163\057\076"),		/* <bs/> */
+	OSXET("\011"),				/* \t */
+	OSXET("\012"),				/* \n */
+	OSXET("\074\166\164\057\076"),		/* <vt/> */
+	OSXET("\074\146\146\057\076"),		/* <ff/> */
+	OSXET("\015"),				/* \r */
+	OSXET("\074\163\157\057\076"),		/* <so/> */
+	OSXET("\074\163\151\057\076"),		/* <si/> */
+	OSXET("\074\144\154\145\057\076"),	/* <dle/> */
+	OSXET("\074\144\143\061\057\076"),	/* <de1/> */
+	OSXET("\074\144\143\062\057\076"),	/* <de2/> */
+	OSXET("\074\144\143\063\057\076"),	/* <de3/> */
+	OSXET("\074\144\143\064\057\076"),	/* <de4/> */
+	OSXET("\074\156\141\153\057\076"),	/* <nak/> */
+	OSXET("\074\163\171\156\057\076"),	/* <syn/> */
+	OSXET("\074\145\164\142\057\076"),	/* <etb/> */
+	OSXET("\074\143\141\156\057\076"),	/* <can/> */
+	OSXET("\074\145\155\057\076"),		/* <em/> */
+	OSXET("\074\163\165\142\057\076"),	/* <sub/> */
+	OSXET("\074\145\163\143\057\076"),	/* <esc/> */
+	OSXET("\074\151\163\064\057\076"),	/* <is4/> */
+	OSXET("\074\151\163\063\057\076"),	/* <is3/> */
+	OSXET("\074\151\163\062\057\076"),	/* <is2/> */
+	OSXET("\074\151\163\061\057\076"),	/* <is1/> */
+	{ 0, 0 },	/* " " */
+	{ 0, 0 },	/* ! */
+	{ 0, 0 },	/* \" */
+	{ 0, 0 },	/* # */
+	{ 0, 0 },	/* $ */
+	{ 0, 0 },	/* % */
+	OSXET("\046\141\155\160\073"),	/* &amp; */
+	{ 0, 0 },	/* ' */
+	{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* ()*+,-./ */
+	{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* 01234567 */
+	{0,0},{0,0},{0,0},{0,0},			 /* 89:; */
+	OSXET("\046\154\164\073"),	/* &lt; */
+	{ 0, 0 },	/* = */
+	OSXET("\046\147\164\073"),	/* &gt; */
+};
+
+static int
+OS__check_escaped_control_char(const void *buf, int size) {
+	size_t i;
+	/*
+	 * Inefficient algorithm which translates the escape sequences
+	 * defined above into characters. Returns -1 if not found.
+	 * TODO: replace by a faster algorithm (bsearch(), hash or
+	 * nested table lookups).
+	 */
+	for(i = 0; i < 32 /* Don't spend time on the bottom half */; i++) {
+		const struct OCTET_STRING__xer_escape_table_s *el;
+		el = &OCTET_STRING__xer_escape_table[i];
+		if(el->size == size && memcmp(buf, el->string, size) == 0)
+			return i;
+	}
+	return -1;
+}
+
+static int
+OCTET_STRING__handle_control_chars(void *struct_ptr, const void *chunk_buf, size_t chunk_size) {
+	/*
+	 * This might be one of the escape sequences
+	 * for control characters. Check it out.
+	 * #11.15.5
+	 */
+	int control_char = OS__check_escaped_control_char(chunk_buf,chunk_size);
+	if(control_char >= 0) {
+		OCTET_STRING_t *st = (OCTET_STRING_t *)struct_ptr;
+		void *p = REALLOC(st->buf, st->size + 2);
+		if(p) {
+			st->buf = (uint8_t *)p;
+			st->buf[st->size++] = control_char;
+			st->buf[st->size] = '\0';	/* nul-termination */
+			return 0;
+		}
+	}
+	
+	return -1;	/* No, it's not */
+}
+
+asn_enc_rval_t
+OCTET_STRING_encode_xer_utf8(const asn_TYPE_descriptor_t *td, const void *sptr,
+                             int ilevel, enum xer_encoder_flags_e flags,
+                             asn_app_consume_bytes_f *cb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	asn_enc_rval_t er = { 0, 0, 0 };
+	uint8_t *buf, *end;
+	uint8_t *ss;	/* Sequence start */
+	ssize_t encoded_len = 0;
+
+	(void)ilevel;	/* Unused argument */
+	(void)flags;	/* Unused argument */
+
+	if(!st || (!st->buf && st->size))
+		ASN__ENCODE_FAILED;
+
+	buf = st->buf;
+	end = buf + st->size;
+	for(ss = buf; buf < end; buf++) {
+		unsigned int ch = *buf;
+		int s_len;	/* Special encoding sequence length */
+
+		/*
+		 * Escape certain characters: X.680/11.15
+		 */
+		if(ch < sizeof(OCTET_STRING__xer_escape_table)
+			/sizeof(OCTET_STRING__xer_escape_table[0])
+		&& (s_len = OCTET_STRING__xer_escape_table[ch].size)) {
+			if(((buf - ss) && cb(ss, buf - ss, app_key) < 0)
+			|| cb(OCTET_STRING__xer_escape_table[ch].string, s_len,
+					app_key) < 0)
+				ASN__ENCODE_FAILED;
+			encoded_len += (buf - ss) + s_len;
+			ss = buf + 1;
+		}
+	}
+
+	encoded_len += (buf - ss);
+	if((buf - ss) && cb(ss, buf - ss, app_key) < 0)
+		ASN__ENCODE_FAILED;
+
+	er.encoded = encoded_len;
+	ASN__ENCODED_OK(er);
+}
+
+/*
+ * Convert from hexadecimal format (cstring): "AB CD EF"
+ */
+static ssize_t OCTET_STRING__convert_hexadecimal(void *sptr, const void *chunk_buf, size_t chunk_size, int have_more) {
+	OCTET_STRING_t *st = (OCTET_STRING_t *)sptr;
+	const char *chunk_stop = (const char *)chunk_buf;
+	const char *p = chunk_stop;
+	const char *pend = p + chunk_size;
+	unsigned int clv = 0;
+	int half = 0;	/* Half bit */
+	uint8_t *buf;
+
+	/* Reallocate buffer according to high cap estimation */
+	size_t new_size = st->size + (chunk_size + 1) / 2;
+	void *nptr = REALLOC(st->buf, new_size + 1);
+	if(!nptr) return -1;
+	st->buf = (uint8_t *)nptr;
+	buf = st->buf + st->size;
+
+	/*
+	 * If something like " a b c " appears here, the " a b":3 will be
+	 * converted, and the rest skipped. That is, unless buf_size is greater
+	 * than chunk_size, then it'll be equivalent to "ABC0".
+	 */
+	for(; p < pend; p++) {
+		int ch = *(const unsigned char *)p;
+		switch(ch) {
+		case 0x09: case 0x0a: case 0x0c: case 0x0d:
+		case 0x20:
+			/* Ignore whitespace */
+			continue;
+		case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: /*01234*/
+		case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: /*56789*/
+			clv = (clv << 4) + (ch - 0x30);
+			break;
+		case 0x41: case 0x42: case 0x43:	/* ABC */
+		case 0x44: case 0x45: case 0x46:	/* DEF */
+			clv = (clv << 4) + (ch - 0x41 + 10);
+			break;
+		case 0x61: case 0x62: case 0x63:	/* abc */
+		case 0x64: case 0x65: case 0x66:	/* def */
+			clv = (clv << 4) + (ch - 0x61 + 10);
+			break;
+		default:
+			*buf = 0;	/* JIC */
+			return -1;
+		}
+		if(half++) {
+			half = 0;
+			*buf++ = clv;
+			chunk_stop = p + 1;
+		}
+	}
+
+	/*
+	 * Check partial decoding.
+	 */
+	if(half) {
+		if(have_more) {
+			/*
+			 * Partial specification is fine,
+			 * because no more more PXER_TEXT data is available.
+			 */
+			*buf++ = clv << 4;
+			chunk_stop = p;
+		}
+	} else {
+		chunk_stop = p;
+	}
+
+	st->size = buf - st->buf;	/* Adjust the buffer size */
+	assert(st->size <= new_size);
+	st->buf[st->size] = 0;		/* Courtesy termination */
+
+	return (chunk_stop - (const char *)chunk_buf);	/* Converted size */
+}
+
+/*
+ * Convert from binary format: "00101011101"
+ */
+static ssize_t OCTET_STRING__convert_binary(void *sptr, const void *chunk_buf, size_t chunk_size, int have_more) {
+	BIT_STRING_t *st = (BIT_STRING_t *)sptr;
+	const char *p = (const char *)chunk_buf;
+	const char *pend = p + chunk_size;
+	int bits_unused = st->bits_unused & 0x7;
+	uint8_t *buf;
+
+	/* Reallocate buffer according to high cap estimation */
+	size_t new_size = st->size + (chunk_size + 7) / 8;
+	void *nptr = REALLOC(st->buf, new_size + 1);
+	if(!nptr) return -1;
+	st->buf = (uint8_t *)nptr;
+	buf = st->buf + st->size;
+
+	(void)have_more;
+
+	if(bits_unused == 0)
+		bits_unused = 8;
+	else if(st->size)
+		buf--;
+
+	/*
+	 * Convert series of 0 and 1 into the octet string.
+	 */
+	for(; p < pend; p++) {
+		int ch = *(const unsigned char *)p;
+		switch(ch) {
+		case 0x09: case 0x0a: case 0x0c: case 0x0d:
+		case 0x20:
+			/* Ignore whitespace */
+			break;
+		case 0x30:
+		case 0x31:
+			if(bits_unused-- <= 0) {
+				*++buf = 0;	/* Clean the cell */
+				bits_unused = 7;
+			}
+			*buf |= (ch&1) << bits_unused;
+			break;
+		default:
+			st->bits_unused = bits_unused;
+			return -1;
+		}
+	}
+
+	if(bits_unused == 8) {
+		st->size = buf - st->buf;
+		st->bits_unused = 0;
+	} else {
+		st->size = buf - st->buf + 1;
+		st->bits_unused = bits_unused;
+	}
+
+	assert(st->size <= new_size);
+	st->buf[st->size] = 0;		/* Courtesy termination */
+
+	return chunk_size;	/* Converted in full */
+}
+
+/*
+ * Something like strtod(), but with stricter rules.
+ */
+static int
+OS__strtoent(int base, const char *buf, const char *end, int32_t *ret_value) {
+	const int32_t last_unicode_codepoint = 0x10ffff;
+	int32_t val = 0;
+	const char *p;
+
+	for(p = buf; p < end; p++) {
+		int ch = *p;
+
+		switch(ch) {
+		case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: /*01234*/
+		case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: /*56789*/
+			val = val * base + (ch - 0x30);
+			break;
+		case 0x41: case 0x42: case 0x43:	/* ABC */
+		case 0x44: case 0x45: case 0x46:	/* DEF */
+			val = val * base + (ch - 0x41 + 10);
+			break;
+		case 0x61: case 0x62: case 0x63:	/* abc */
+		case 0x64: case 0x65: case 0x66:	/* def */
+			val = val * base + (ch - 0x61 + 10);
+			break;
+		case 0x3b:	/* ';' */
+			*ret_value = val;
+			return (p - buf) + 1;
+		default:
+			return -1;	/* Character set error */
+		}
+
+		/* Value exceeds the Unicode range. */
+		if(val > last_unicode_codepoint) {
+			return -1;
+		}
+	}
+
+	*ret_value = -1;
+	return (p - buf);
+}
+
+/*
+ * Convert from the plain UTF-8 format, expanding entity references: "2 &lt; 3"
+ */
+static ssize_t
+OCTET_STRING__convert_entrefs(void *sptr, const void *chunk_buf,
+                              size_t chunk_size, int have_more) {
+    OCTET_STRING_t *st = (OCTET_STRING_t *)sptr;
+	const char *p = (const char *)chunk_buf;
+	const char *pend = p + chunk_size;
+	uint8_t *buf;
+
+	/* Reallocate buffer */
+	size_t new_size = st->size + chunk_size;
+	void *nptr = REALLOC(st->buf, new_size + 1);
+	if(!nptr) return -1;
+	st->buf = (uint8_t *)nptr;
+	buf = st->buf + st->size;
+
+	/*
+	 * Convert series of 0 and 1 into the octet string.
+	 */
+	for(; p < pend; p++) {
+		int ch = *(const unsigned char *)p;
+		int len;	/* Length of the rest of the chunk */
+
+		if(ch != 0x26 /* '&' */) {
+			*buf++ = ch;
+			continue;	/* That was easy... */
+		}
+
+		/*
+		 * Process entity reference.
+		 */
+		len = chunk_size - (p - (const char *)chunk_buf);
+		if(len == 1 /* "&" */) goto want_more;
+		if(p[1] == 0x23 /* '#' */) {
+			const char *pval;	/* Pointer to start of digits */
+			int32_t val = 0;	/* Entity reference value */
+			int base;
+
+			if(len == 2 /* "&#" */) goto want_more;
+			if(p[2] == 0x78 /* 'x' */)
+				pval = p + 3, base = 16;
+			else
+				pval = p + 2, base = 10;
+			len = OS__strtoent(base, pval, p + len, &val);
+			if(len == -1) {
+				/* Invalid charset. Just copy verbatim. */
+				*buf++ = ch;
+				continue;
+			}
+			if(!len || pval[len-1] != 0x3b) goto want_more;
+			assert(val > 0);
+			p += (pval - p) + len - 1; /* Advance past entref */
+
+			if(val < 0x80) {
+				*buf++ = (char)val;
+			} else if(val < 0x800) {
+				*buf++ = 0xc0 | ((val >> 6));
+				*buf++ = 0x80 | ((val & 0x3f));
+			} else if(val < 0x10000) {
+				*buf++ = 0xe0 | ((val >> 12));
+				*buf++ = 0x80 | ((val >> 6) & 0x3f);
+				*buf++ = 0x80 | ((val & 0x3f));
+			} else if(val < 0x200000) {
+				*buf++ = 0xf0 | ((val >> 18));
+				*buf++ = 0x80 | ((val >> 12) & 0x3f);
+				*buf++ = 0x80 | ((val >> 6) & 0x3f);
+				*buf++ = 0x80 | ((val & 0x3f));
+			} else if(val < 0x4000000) {
+				*buf++ = 0xf8 | ((val >> 24));
+				*buf++ = 0x80 | ((val >> 18) & 0x3f);
+				*buf++ = 0x80 | ((val >> 12) & 0x3f);
+				*buf++ = 0x80 | ((val >> 6) & 0x3f);
+				*buf++ = 0x80 | ((val & 0x3f));
+			} else {
+				*buf++ = 0xfc | ((val >> 30) & 0x1);
+				*buf++ = 0x80 | ((val >> 24) & 0x3f);
+				*buf++ = 0x80 | ((val >> 18) & 0x3f);
+				*buf++ = 0x80 | ((val >> 12) & 0x3f);
+				*buf++ = 0x80 | ((val >> 6) & 0x3f);
+				*buf++ = 0x80 | ((val & 0x3f));
+			}
+		} else {
+			/*
+			 * Ugly, limited parsing of &amp; &gt; &lt;
+			 */
+			char *sc = (char *)memchr(p, 0x3b, len > 5 ? 5 : len);
+			if(!sc) goto want_more;
+			if((sc - p) == 4
+				&& p[1] == 0x61	/* 'a' */
+				&& p[2] == 0x6d	/* 'm' */
+				&& p[3] == 0x70	/* 'p' */) {
+				*buf++ = 0x26;
+				p = sc;
+				continue;
+			}
+			if((sc - p) == 3) {
+				if(p[1] == 0x6c) {
+					*buf = 0x3c;	/* '<' */
+				} else if(p[1] == 0x67) {
+					*buf = 0x3e;	/* '>' */
+				} else {
+					/* Unsupported entity reference */
+					*buf++ = ch;
+					continue;
+				}
+				if(p[2] != 0x74) {
+					/* Unsupported entity reference */
+					*buf++ = ch;
+					continue;
+				}
+				buf++;
+				p = sc;
+				continue;
+			}
+			/* Unsupported entity reference */
+			*buf++ = ch;
+		}
+
+		continue;
+	want_more:
+		if(have_more) {
+			/*
+			 * We know that no more data (of the same type)
+			 * is coming. Copy the rest verbatim.
+			 */
+			*buf++ = ch;
+			continue;
+		}
+		chunk_size = (p - (const char *)chunk_buf);
+		/* Processing stalled: need more data */
+		break;
+	}
+
+	st->size = buf - st->buf;
+	assert(st->size <= new_size);
+	st->buf[st->size] = 0;		/* Courtesy termination */
+
+	return chunk_size;	/* Converted in full */
+}
+
+/*
+ * Decode OCTET STRING from the XML element's body.
+ */
+static asn_dec_rval_t
+OCTET_STRING__decode_xer(
+    const asn_codec_ctx_t *opt_codec_ctx, const asn_TYPE_descriptor_t *td,
+    void **sptr, const char *opt_mname, const void *buf_ptr, size_t size,
+    int (*opt_unexpected_tag_decoder)(void *struct_ptr, const void *chunk_buf,
+                                      size_t chunk_size),
+    ssize_t (*body_receiver)(void *struct_ptr, const void *chunk_buf,
+                             size_t chunk_size, int have_more)) {
+    OCTET_STRING_t *st = (OCTET_STRING_t *)*sptr;
+	const asn_OCTET_STRING_specifics_t *specs = td->specifics
+				? (const asn_OCTET_STRING_specifics_t *)td->specifics
+				: &asn_SPC_OCTET_STRING_specs;
+	const char *xml_tag = opt_mname ? opt_mname : td->xml_tag;
+	asn_struct_ctx_t *ctx;		/* Per-structure parser context */
+	asn_dec_rval_t rval;		/* Return value from the decoder */
+	int st_allocated;
+
+	/*
+	 * Create the string if does not exist.
+	 */
+	if(!st) {
+		st = (OCTET_STRING_t *)CALLOC(1, specs->struct_size);
+		*sptr = (void *)st;
+		if(!st) goto sta_failed;
+		st_allocated = 1;
+	} else {
+		st_allocated = 0;
+	}
+	if(!st->buf) {
+		/* This is separate from above section */
+		st->buf = (uint8_t *)CALLOC(1, 1);
+		if(!st->buf) {
+			if(st_allocated) {
+				*sptr = 0;
+				goto stb_failed;
+			} else {
+				goto sta_failed;
+			}
+		}
+	}
+
+	/* Restore parsing context */
+	ctx = (asn_struct_ctx_t *)(((char *)*sptr) + specs->ctx_offset);
+
+	return xer_decode_general(opt_codec_ctx, ctx, *sptr, xml_tag,
+		buf_ptr, size, opt_unexpected_tag_decoder, body_receiver);
+
+stb_failed:
+	FREEMEM(st);
+sta_failed:
+	rval.code = RC_FAIL;
+	rval.consumed = 0;
+	return rval;
+}
+
+/*
+ * Decode OCTET STRING from the hexadecimal data.
+ */
+asn_dec_rval_t
+OCTET_STRING_decode_xer_hex(const asn_codec_ctx_t *opt_codec_ctx,
+                            const asn_TYPE_descriptor_t *td, void **sptr,
+                            const char *opt_mname, const void *buf_ptr,
+                            size_t size) {
+    return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname,
+		buf_ptr, size, 0, OCTET_STRING__convert_hexadecimal);
+}
+
+/*
+ * Decode OCTET STRING from the binary (0/1) data.
+ */
+asn_dec_rval_t
+OCTET_STRING_decode_xer_binary(const asn_codec_ctx_t *opt_codec_ctx,
+                               const asn_TYPE_descriptor_t *td, void **sptr,
+                               const char *opt_mname, const void *buf_ptr,
+                               size_t size) {
+    return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname,
+		buf_ptr, size, 0, OCTET_STRING__convert_binary);
+}
+
+/*
+ * Decode OCTET STRING from the string (ASCII/UTF-8) data.
+ */
+asn_dec_rval_t
+OCTET_STRING_decode_xer_utf8(const asn_codec_ctx_t *opt_codec_ctx,
+                             const asn_TYPE_descriptor_t *td, void **sptr,
+                             const char *opt_mname, const void *buf_ptr,
+                             size_t size) {
+    return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname,
+		buf_ptr, size,
+		OCTET_STRING__handle_control_chars,
+		OCTET_STRING__convert_entrefs);
+}
+
+#ifndef  ASN_DISABLE_PER_SUPPORT
+
+static int
+OCTET_STRING_per_get_characters(asn_per_data_t *po, uint8_t *buf,
+		size_t units, unsigned int bpc, unsigned int unit_bits,
+		long lb, long ub, const asn_per_constraints_t *pc) {
+	uint8_t *end = buf + units * bpc;
+
+	ASN_DEBUG("Expanding %d characters into (%ld..%ld):%d",
+		(int)units, lb, ub, unit_bits);
+
+	/* X.691: 27.5.4 */
+	if((unsigned long)ub <= ((unsigned long)2 << (unit_bits - 1))) {
+		/* Decode without translation */
+		lb = 0;
+	} else if(pc && pc->code2value) {
+		if(unit_bits > 16)
+			return 1;	/* FATAL: can't have constrained
+					 * UniversalString with more than
+					 * 16 million code points */
+		for(; buf < end; buf += bpc) {
+			int value;
+			int code = per_get_few_bits(po, unit_bits);
+			if(code < 0) return -1;	/* WMORE */
+			value = pc->code2value(code);
+			if(value < 0) {
+				ASN_DEBUG("Code %d (0x%02x) is"
+					" not in map (%ld..%ld)",
+					code, code, lb, ub);
+				return 1;	/* FATAL */
+			}
+			switch(bpc) {
+			case 1: *buf = value; break;
+			case 2: buf[0] = value >> 8; buf[1] = value; break;
+			case 4: buf[0] = value >> 24; buf[1] = value >> 16;
+				buf[2] = value >> 8; buf[3] = value; break;
+			}
+		}
+		return 0;
+	}
+
+	/* Shortcut the no-op copying to the aligned structure */
+	if(lb == 0 && (unit_bits == 8 * bpc)) {
+		return per_get_many_bits(po, buf, 0, unit_bits * units);
+	}
+
+	for(; buf < end; buf += bpc) {
+		int32_t code = per_get_few_bits(po, unit_bits);
+		int32_t ch = code + lb;
+		if(code < 0) return -1;	/* WMORE */
+		if(ch > ub) {
+			ASN_DEBUG("Code %d is out of range (%ld..%ld)",
+				ch, lb, ub);
+			return 1;	/* FATAL */
+		}
+		switch(bpc) {
+		case 1: *buf = ch; break;
+		case 2: buf[0] = ch >> 8; buf[1] = ch; break;
+		case 4: buf[0] = ch >> 24; buf[1] = ch >> 16;
+			buf[2] = ch >> 8; buf[3] = ch; break;
+		}
+	}
+
+	return 0;
+}
+
+static int
+OCTET_STRING_per_put_characters(asn_per_outp_t *po, const uint8_t *buf,
+		size_t units, unsigned int bpc, unsigned int unit_bits,
+		long lb, long ub, const asn_per_constraints_t *pc) {
+	const uint8_t *end = buf + units * bpc;
+
+	ASN_DEBUG("Squeezing %d characters into (%ld..%ld):%d (%d bpc)",
+		(int)units, lb, ub, unit_bits, bpc);
+
+	/* X.691: 27.5.4 */
+	if((unsigned long)ub <= ((unsigned long)2 << (unit_bits - 1))) {
+		/* Encode as is */
+		lb = 0;
+	} else if(pc && pc->value2code) {
+		for(; buf < end; buf += bpc) {
+			int code;
+			uint32_t value;
+			switch(bpc) {
+			case 1: value = *(const uint8_t *)buf; break;
+			case 2: value = (buf[0] << 8) | buf[1]; break;
+			case 4: value = (buf[0] << 24) | (buf[1] << 16)
+					| (buf[2] << 8) | buf[3]; break;
+			default: return -1;
+			}
+			code = pc->value2code(value);
+			if(code < 0) {
+				ASN_DEBUG("Character %d (0x%02x) is"
+					" not in map (%ld..%ld)",
+					*buf, *buf, lb, ub);
+				return -1;
+			}
+			if(per_put_few_bits(po, code, unit_bits))
+				return -1;
+		}
+	}
+
+	/* Shortcut the no-op copying to the aligned structure */
+	if(lb == 0 && (unit_bits == 8 * bpc)) {
+		return per_put_many_bits(po, buf, unit_bits * units);
+	}
+
+    for(ub -= lb; buf < end; buf += bpc) {
+        int ch;
+        uint32_t value;
+        switch(bpc) {
+        case 1:
+            value = *(const uint8_t *)buf;
+            break;
+        case 2:
+            value = (buf[0] << 8) | buf[1];
+            break;
+        case 4:
+            value = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
+            break;
+        default:
+            return -1;
+        }
+        ch = value - lb;
+        if(ch < 0 || ch > ub) {
+            ASN_DEBUG("Character %d (0x%02x) is out of range (%ld..%ld)", *buf,
+                      value, lb, ub + lb);
+            return -1;
+        }
+        if(per_put_few_bits(po, ch, unit_bits)) return -1;
+    }
+
+    return 0;
+}
+
+static asn_per_constraints_t asn_DEF_OCTET_STRING_constraints = {
+	{ APC_CONSTRAINED, 8, 8, 0, 255 },
+	{ APC_SEMI_CONSTRAINED, -1, -1, 0, 0 },
+	0, 0
+};
+
+asn_dec_rval_t
+OCTET_STRING_decode_uper(const asn_codec_ctx_t *opt_codec_ctx,
+                         const asn_TYPE_descriptor_t *td,
+                         const asn_per_constraints_t *constraints, void **sptr,
+                         asn_per_data_t *pd) {
+    const asn_OCTET_STRING_specifics_t *specs = td->specifics
+		? (const asn_OCTET_STRING_specifics_t *)td->specifics
+		: &asn_SPC_OCTET_STRING_specs;
+    const asn_per_constraints_t *pc =
+        constraints ? constraints : td->encoding_constraints.per_constraints;
+    const asn_per_constraint_t *cval;
+	const asn_per_constraint_t *csiz;
+	asn_dec_rval_t rval = { RC_OK, 0 };
+	OCTET_STRING_t *st = (OCTET_STRING_t *)*sptr;
+	ssize_t consumed_myself = 0;
+	int repeat;
+	enum {
+		OS__BPC_CHAR	= 1,
+		OS__BPC_U16	= 2,
+		OS__BPC_U32	= 4
+	} bpc;	/* Bytes per character */
+	unsigned int unit_bits;
+	unsigned int canonical_unit_bits;
+
+	(void)opt_codec_ctx;
+
+	if(pc) {
+		cval = &pc->value;
+		csiz = &pc->size;
+	} else {
+		cval = &asn_DEF_OCTET_STRING_constraints.value;
+		csiz = &asn_DEF_OCTET_STRING_constraints.size;
+	}
+
+	switch(specs->subvariant) {
+	default:
+	case ASN_OSUBV_ANY:
+	case ASN_OSUBV_BIT:
+		ASN_DEBUG("Unrecognized subvariant %d", specs->subvariant);
+		RETURN(RC_FAIL);
+		break;
+	case ASN_OSUBV_STR:
+		canonical_unit_bits = unit_bits = 8;
+		if(cval->flags & APC_CONSTRAINED)
+			unit_bits = cval->range_bits;
+		bpc = OS__BPC_CHAR;
+		break;
+	case ASN_OSUBV_U16:
+		canonical_unit_bits = unit_bits = 16;
+		if(cval->flags & APC_CONSTRAINED)
+			unit_bits = cval->range_bits;
+		bpc = OS__BPC_U16;
+		break;
+	case ASN_OSUBV_U32:
+		canonical_unit_bits = unit_bits = 32;
+		if(cval->flags & APC_CONSTRAINED)
+			unit_bits = cval->range_bits;
+		bpc = OS__BPC_U32;
+		break;
+	}
+
+	/*
+	 * Allocate the string.
+	 */
+	if(!st) {
+		st = (OCTET_STRING_t *)(*sptr = CALLOC(1, specs->struct_size));
+		if(!st) RETURN(RC_FAIL);
+	}
+
+	ASN_DEBUG("PER Decoding %s size %ld .. %ld bits %d",
+		csiz->flags & APC_EXTENSIBLE ? "extensible" : "non-extensible",
+		csiz->lower_bound, csiz->upper_bound, csiz->effective_bits);
+
+	if(csiz->flags & APC_EXTENSIBLE) {
+		int inext = per_get_few_bits(pd, 1);
+		if(inext < 0) RETURN(RC_WMORE);
+		if(inext) {
+			csiz = &asn_DEF_OCTET_STRING_constraints.size;
+			unit_bits = canonical_unit_bits;
+		}
+	}
+
+	if(csiz->effective_bits >= 0) {
+		FREEMEM(st->buf);
+		if(bpc) {
+			st->size = csiz->upper_bound * bpc;
+		} else {
+			st->size = (csiz->upper_bound + 7) >> 3;
+		}
+		st->buf = (uint8_t *)MALLOC(st->size + 1);
+		if(!st->buf) { st->size = 0; RETURN(RC_FAIL); }
+	}
+
+	/* X.691, #16.5: zero-length encoding */
+	/* X.691, #16.6: short fixed length encoding (up to 2 octets) */
+	/* X.691, #16.7: long fixed length encoding (up to 64K octets) */
+	if(csiz->effective_bits == 0) {
+		int ret;
+		if(bpc) {
+			ASN_DEBUG("Encoding OCTET STRING size %ld",
+				csiz->upper_bound);
+			ret = OCTET_STRING_per_get_characters(pd, st->buf,
+				csiz->upper_bound, bpc, unit_bits,
+				cval->lower_bound, cval->upper_bound, pc);
+			if(ret > 0) RETURN(RC_FAIL);
+		} else {
+			ASN_DEBUG("Encoding BIT STRING size %ld",
+				csiz->upper_bound);
+			ret = per_get_many_bits(pd, st->buf, 0,
+					    unit_bits * csiz->upper_bound);
+		}
+		if(ret < 0) RETURN(RC_WMORE);
+		consumed_myself += unit_bits * csiz->upper_bound;
+		st->buf[st->size] = 0;
+		RETURN(RC_OK);
+	}
+
+	st->size = 0;
+	do {
+		ssize_t raw_len;
+		ssize_t len_bytes;
+		void *p;
+		int ret;
+
+		/* Get the PER length */
+		raw_len = uper_get_length(pd, csiz->effective_bits, csiz->lower_bound,
+		                          &repeat);
+		if(raw_len < 0) RETURN(RC_WMORE);
+		if(raw_len == 0 && st->buf) break;
+
+		ASN_DEBUG("Got PER length eb %ld, len %ld, %s (%s)",
+			(long)csiz->effective_bits, (long)raw_len,
+			repeat ? "repeat" : "once", td->name);
+        len_bytes = raw_len * bpc;
+		p = REALLOC(st->buf, st->size + len_bytes + 1);
+		if(!p) RETURN(RC_FAIL);
+		st->buf = (uint8_t *)p;
+
+        ret = OCTET_STRING_per_get_characters(pd, &st->buf[st->size], raw_len,
+                                              bpc, unit_bits, cval->lower_bound,
+                                              cval->upper_bound, pc);
+        if(ret > 0) RETURN(RC_FAIL);
+		if(ret < 0) RETURN(RC_WMORE);
+		st->size += len_bytes;
+	} while(repeat);
+	st->buf[st->size] = 0;	/* nul-terminate */
+
+	return rval;
+}
+
+asn_enc_rval_t
+OCTET_STRING_encode_uper(const asn_TYPE_descriptor_t *td,
+                         const asn_per_constraints_t *constraints,
+                         const void *sptr, asn_per_outp_t *po) {
+    const asn_OCTET_STRING_specifics_t *specs = td->specifics
+		? (const asn_OCTET_STRING_specifics_t *)td->specifics
+		: &asn_SPC_OCTET_STRING_specs;
+	const asn_per_constraints_t *pc = constraints ? constraints
+				: td->encoding_constraints.per_constraints;
+	const asn_per_constraint_t *cval;
+	const asn_per_constraint_t *csiz;
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	asn_enc_rval_t er = { 0, 0, 0 };
+	int inext = 0;		/* Lies not within extension root */
+	unsigned int unit_bits;
+	unsigned int canonical_unit_bits;
+	size_t size_in_units;
+	const uint8_t *buf;
+	int ret;
+	enum {
+		OS__BPC_CHAR	= 1,
+		OS__BPC_U16	= 2,
+		OS__BPC_U32	= 4
+	} bpc;	/* Bytes per character */
+	int ct_extensible;
+
+	if(!st || (!st->buf && st->size))
+		ASN__ENCODE_FAILED;
+
+	if(pc) {
+		cval = &pc->value;
+		csiz = &pc->size;
+	} else {
+		cval = &asn_DEF_OCTET_STRING_constraints.value;
+		csiz = &asn_DEF_OCTET_STRING_constraints.size;
+	}
+	ct_extensible = csiz->flags & APC_EXTENSIBLE;
+
+	switch(specs->subvariant) {
+	default:
+	case ASN_OSUBV_ANY:
+	case ASN_OSUBV_BIT:
+		ASN__ENCODE_FAILED;
+	case ASN_OSUBV_STR:
+		canonical_unit_bits = unit_bits = 8;
+		if(cval->flags & APC_CONSTRAINED)
+			unit_bits = cval->range_bits;
+		bpc = OS__BPC_CHAR;
+		size_in_units = st->size;
+		break;
+	case ASN_OSUBV_U16:
+		canonical_unit_bits = unit_bits = 16;
+		if(cval->flags & APC_CONSTRAINED)
+			unit_bits = cval->range_bits;
+		bpc = OS__BPC_U16;
+		size_in_units = st->size >> 1;
+		if(st->size & 1) {
+			ASN_DEBUG("%s string size is not modulo 2", td->name);
+			ASN__ENCODE_FAILED;
+		}
+		break;
+	case ASN_OSUBV_U32:
+		canonical_unit_bits = unit_bits = 32;
+		if(cval->flags & APC_CONSTRAINED)
+			unit_bits = cval->range_bits;
+		bpc = OS__BPC_U32;
+		size_in_units = st->size >> 2;
+		if(st->size & 3) {
+			ASN_DEBUG("%s string size is not modulo 4", td->name);
+			ASN__ENCODE_FAILED;
+		}
+		break;
+	}
+
+	ASN_DEBUG("Encoding %s into %" ASN_PRI_SIZE " units of %d bits"
+		" (%ld..%ld, effective %d)%s",
+		td->name, size_in_units, unit_bits,
+		csiz->lower_bound, csiz->upper_bound,
+		csiz->effective_bits, ct_extensible ? " EXT" : "");
+
+	/* Figure out whether size lies within PER visible constraint */
+
+    if(csiz->effective_bits >= 0) {
+        if((ssize_t)size_in_units < csiz->lower_bound
+           || (ssize_t)size_in_units > csiz->upper_bound) {
+            if(ct_extensible) {
+                csiz = &asn_DEF_OCTET_STRING_constraints.size;
+                unit_bits = canonical_unit_bits;
+                inext = 1;
+            } else {
+                ASN__ENCODE_FAILED;
+            }
+        }
+    } else {
+        inext = 0;
+    }
+
+    if(ct_extensible) {
+		/* Declare whether length is [not] within extension root */
+		if(per_put_few_bits(po, inext, 1))
+			ASN__ENCODE_FAILED;
+	}
+
+    if(csiz->effective_bits >= 0 && !inext) {
+        ASN_DEBUG("Encoding %" ASN_PRI_SIZE " bytes (%ld), length in %d bits", st->size,
+                  size_in_units - csiz->lower_bound, csiz->effective_bits);
+        ret = per_put_few_bits(po, size_in_units - csiz->lower_bound,
+                               csiz->effective_bits);
+        if(ret) ASN__ENCODE_FAILED;
+        ret = OCTET_STRING_per_put_characters(po, st->buf, size_in_units, bpc,
+                                              unit_bits, cval->lower_bound,
+                                              cval->upper_bound, pc);
+        if(ret) ASN__ENCODE_FAILED;
+        ASN__ENCODED_OK(er);
+    }
+
+    ASN_DEBUG("Encoding %" ASN_PRI_SIZE " bytes", st->size);
+
+    buf = st->buf;
+    ASN_DEBUG("Encoding %" ASN_PRI_SIZE " in units", size_in_units);
+    do {
+        int need_eom = 0;
+        ssize_t may_save = uper_put_length(po, size_in_units, &need_eom);
+        if(may_save < 0) ASN__ENCODE_FAILED;
+
+        ASN_DEBUG("Encoding %" ASN_PRI_SSIZE " of %" ASN_PRI_SIZE "%s", may_save, size_in_units,
+                  need_eom ? ",+EOM" : "");
+
+        ret = OCTET_STRING_per_put_characters(po, buf, may_save, bpc, unit_bits,
+                                              cval->lower_bound,
+                                              cval->upper_bound, pc);
+        if(ret) ASN__ENCODE_FAILED;
+
+        buf += may_save * bpc;
+        size_in_units -= may_save;
+        assert(!(may_save & 0x07) || !size_in_units);
+        if(need_eom && uper_put_length(po, 0, 0))
+            ASN__ENCODE_FAILED; /* End of Message length */
+    } while(size_in_units);
+
+    ASN__ENCODED_OK(er);
+}
+
+asn_dec_rval_t
+OCTET_STRING_decode_aper(const asn_codec_ctx_t *opt_codec_ctx,
+                         const asn_TYPE_descriptor_t *td,
+                         const asn_per_constraints_t *constraints,
+                         void **sptr, asn_per_data_t *pd) {
+
+	const asn_OCTET_STRING_specifics_t *specs = td->specifics
+		? (const asn_OCTET_STRING_specifics_t *)td->specifics
+		: &asn_SPC_OCTET_STRING_specs;
+	const asn_per_constraints_t *pc = constraints ? constraints
+				: td->encoding_constraints.per_constraints;
+	const asn_per_constraint_t *cval;
+	const asn_per_constraint_t *csiz;
+	asn_dec_rval_t rval = { RC_OK, 0 };
+	BIT_STRING_t *st = (BIT_STRING_t *)*sptr;
+	ssize_t consumed_myself = 0;
+	int repeat;
+	enum {
+		OS__BPC_BIT	= 0,
+		OS__BPC_CHAR	= 1,
+		OS__BPC_U16	= 2,
+		OS__BPC_U32	= 4
+	} bpc;	/* Bytes per character */
+	unsigned int unit_bits;
+	unsigned int canonical_unit_bits;
+
+	(void)opt_codec_ctx;
+
+	if(pc) {
+		cval = &pc->value;
+		csiz = &pc->size;
+	} else {
+		cval = &asn_DEF_OCTET_STRING_constraints.value;
+		csiz = &asn_DEF_OCTET_STRING_constraints.size;
+	}
+
+	switch(specs->subvariant) {
+	default:
+/* 	case ASN_OSUBV_ANY:
+		ASN_DEBUG("Unrecognized subvariant %d", specs->subvariant);
+		RETURN(RC_FAIL);
+*/
+	case ASN_OSUBV_BIT:
+		canonical_unit_bits = unit_bits = 1;
+		bpc = OS__BPC_BIT;
+		break;
+	case ASN_OSUBV_ANY:
+	case ASN_OSUBV_STR:
+		canonical_unit_bits = unit_bits = 8;
+/* 		if(cval->flags & APC_CONSTRAINED)
+			unit_bits = cval->range_bits;
+*/
+		bpc = OS__BPC_CHAR;
+		break;
+	case ASN_OSUBV_U16:
+		canonical_unit_bits = unit_bits = 16;
+		if(cval->flags & APC_CONSTRAINED)
+			unit_bits = cval->range_bits;
+		bpc = OS__BPC_U16;
+		break;
+	case ASN_OSUBV_U32:
+		canonical_unit_bits = unit_bits = 32;
+		if(cval->flags & APC_CONSTRAINED)
+			unit_bits = cval->range_bits;
+		bpc = OS__BPC_U32;
+		break;
+	}
+
+	/*
+	 * Allocate the string.
+	 */
+	if(!st) {
+		st = (BIT_STRING_t *)(*sptr = CALLOC(1, specs->struct_size));
+		if(!st) RETURN(RC_FAIL);
+	}
+
+	ASN_DEBUG("PER Decoding %s size %ld .. %ld bits %d",
+		csiz->flags & APC_EXTENSIBLE ? "extensible" : "non-extensible",
+		csiz->lower_bound, csiz->upper_bound, csiz->effective_bits);
+
+	if(csiz->flags & APC_EXTENSIBLE) {
+		int inext = per_get_few_bits(pd, 1);
+		if(inext < 0) RETURN(RC_WMORE);
+		if(inext) {
+			csiz = &asn_DEF_OCTET_STRING_constraints.size;
+			cval = &asn_DEF_OCTET_STRING_constraints.value;
+			unit_bits = canonical_unit_bits;
+		}
+	}
+
+	if(csiz->effective_bits >= 0) {
+		FREEMEM(st->buf);
+		if(bpc) {
+			st->size = csiz->upper_bound * bpc;
+		} else {
+			st->size = (csiz->upper_bound + 7) >> 3;
+		}
+		st->buf = (uint8_t *)MALLOC(st->size + 1);
+		if(!st->buf) { st->size = 0; RETURN(RC_FAIL); }
+	}
+
+	/* X.691, #16.5: zero-length encoding */
+	/* X.691, #16.6: short fixed length encoding (up to 2 octets) */
+	/* X.691, #16.7: long fixed length encoding (up to 64K octets) */
+	if(csiz->effective_bits == 0) {
+		int ret;
+		if (st->size > 2) { /* X.691 #16 NOTE 1 */
+			if (aper_get_align(pd) < 0)
+				RETURN(RC_FAIL);
+		}
+		if(bpc) {
+			ASN_DEBUG("Decoding OCTET STRING size %ld",
+				csiz->upper_bound);
+			ret = OCTET_STRING_per_get_characters(pd, st->buf,
+				csiz->upper_bound, bpc, unit_bits,
+				cval->lower_bound, cval->upper_bound, pc);
+			if(ret > 0) RETURN(RC_FAIL);
+		} else {
+			ASN_DEBUG("Decoding BIT STRING size %ld",
+				csiz->upper_bound);
+			ret = per_get_many_bits(pd, st->buf, 0,
+					    unit_bits * csiz->upper_bound);
+		}
+		if(ret < 0) RETURN(RC_WMORE);
+		consumed_myself += unit_bits * csiz->upper_bound;
+		st->buf[st->size] = 0;
+		if(bpc == 0) {
+			int ubs = (csiz->upper_bound & 0x7);
+			st->bits_unused = ubs ? 8 - ubs : 0;
+		}
+		RETURN(RC_OK);
+	}
+
+	st->size = 0;
+	do {
+		ssize_t raw_len;
+		ssize_t len_bytes;
+		ssize_t len_bits;
+		void *p;
+		int ret;
+
+		/* Get the PER length */
+		if (csiz->upper_bound - csiz->lower_bound == 0)
+			/* Indefinite length case */
+			raw_len = aper_get_length(pd, -1, csiz->effective_bits, &repeat);
+		else
+			raw_len = aper_get_length(pd, csiz->upper_bound - csiz->lower_bound + 1, csiz->effective_bits, &repeat);
+		repeat = 0;
+		if(raw_len < 0) RETURN(RC_WMORE);
+		raw_len += csiz->lower_bound;
+
+		ASN_DEBUG("Got PER length eb %ld, len %ld, %s (%s)",
+			(long)csiz->effective_bits, (long)raw_len,
+			repeat ? "repeat" : "once", td->name);
+
+		if (raw_len > 2) { /* X.691 #16 NOTE 1 */
+			if (aper_get_align(pd) < 0)
+				RETURN(RC_FAIL);
+		}
+
+		if(bpc) {
+			len_bytes = raw_len * bpc;
+			len_bits = len_bytes * unit_bits;
+		} else {
+			len_bits = raw_len;
+			len_bytes = (len_bits + 7) >> 3;
+			if(len_bits & 0x7)
+				st->bits_unused = 8 - (len_bits & 0x7);
+			/* len_bits be multiple of 16K if repeat is set */
+		}
+		p = REALLOC(st->buf, st->size + len_bytes + 1);
+		if(!p) RETURN(RC_FAIL);
+		st->buf = (uint8_t *)p;
+
+		if(bpc) {
+			ret = OCTET_STRING_per_get_characters(pd,
+				&st->buf[st->size], raw_len, bpc, unit_bits,
+				cval->lower_bound, cval->upper_bound, pc);
+			if(ret > 0) RETURN(RC_FAIL);
+		} else {
+			ret = per_get_many_bits(pd, &st->buf[st->size],
+				0, len_bits);
+		}
+		if(ret < 0) RETURN(RC_WMORE);
+		st->size += len_bytes;
+	} while(repeat);
+	st->buf[st->size] = 0;	/* nul-terminate */
+
+	return rval;
+}
+
+asn_enc_rval_t
+OCTET_STRING_encode_aper(const asn_TYPE_descriptor_t *td,
+                         const asn_per_constraints_t *constraints,
+                         const void *sptr, asn_per_outp_t *po) {
+
+	const asn_OCTET_STRING_specifics_t *specs = td->specifics
+		? (const asn_OCTET_STRING_specifics_t *)td->specifics
+		: &asn_SPC_OCTET_STRING_specs;
+	const asn_per_constraints_t *pc = constraints ? constraints
+	: td->encoding_constraints.per_constraints;
+	const asn_per_constraint_t *cval;
+	const asn_per_constraint_t *csiz;
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	asn_enc_rval_t er = { 0, 0, 0 };
+	int inext = 0;          /* Lies not within extension root */
+	unsigned int unit_bits;
+	unsigned int canonical_unit_bits;
+	unsigned int sizeinunits;
+	const uint8_t *buf;
+	int ret;
+	enum {
+		OS__BPC_BIT     = 0,
+		OS__BPC_CHAR    = 1,
+		OS__BPC_U16     = 2,
+		OS__BPC_U32     = 4
+	} bpc;  /* Bytes per character */
+	int ct_extensible;
+
+	if(!st || (!st->buf && st->size))
+		ASN__ENCODE_FAILED;
+
+	if(pc) {
+		cval = &pc->value;
+		csiz = &pc->size;
+	} else {
+		cval = &asn_DEF_OCTET_STRING_constraints.value;
+		csiz = &asn_DEF_OCTET_STRING_constraints.size;
+	}
+	ct_extensible = csiz->flags & APC_EXTENSIBLE;
+
+	switch(specs->subvariant) {
+		default:
+			/*         case ASN_OSUBV_ANY:
+			                 ASN__ENCODE_FAILED;
+			*/
+		case ASN_OSUBV_BIT:
+			canonical_unit_bits = unit_bits = 1;
+			bpc = OS__BPC_BIT;
+			sizeinunits = st->size * 8 - (st->bits_unused & 0x07);
+			ASN_DEBUG("BIT STRING of %d bytes",
+								sizeinunits);
+		break;
+        case ASN_OSUBV_ANY:
+	case ASN_OSUBV_STR:
+		canonical_unit_bits = unit_bits = 8;
+/* 		if(cval->flags & APC_CONSTRAINED)
+			unit_bits = 8;
+*/
+		bpc = OS__BPC_CHAR;
+		sizeinunits = st->size;
+		break;
+	case ASN_OSUBV_U16:
+		canonical_unit_bits = unit_bits = 16;
+		if(cval->flags & APC_CONSTRAINED)
+			unit_bits = cval->range_bits;
+		bpc = OS__BPC_U16;
+		sizeinunits = st->size / 2;
+		break;
+	case ASN_OSUBV_U32:
+		canonical_unit_bits = unit_bits = 32;
+		if(cval->flags & APC_CONSTRAINED)
+			unit_bits = cval->range_bits;
+		bpc = OS__BPC_U32;
+		sizeinunits = st->size / 4;
+		break;
+	}
+
+	ASN_DEBUG("Encoding %s into %d units of %d bits"
+		" (%ld..%ld, effective %d)%s",
+		td->name, sizeinunits, unit_bits,
+		csiz->lower_bound, csiz->upper_bound,
+		csiz->effective_bits, ct_extensible ? " EXT" : "");
+
+	/* Figure out wheter size lies within PER visible constraint */
+
+	if(csiz->effective_bits >= 0) {
+		if((int)sizeinunits < csiz->lower_bound
+		|| (int)sizeinunits > csiz->upper_bound) {
+			if(ct_extensible) {
+				cval = &asn_DEF_OCTET_STRING_constraints.value;
+				csiz = &asn_DEF_OCTET_STRING_constraints.size;
+				unit_bits = canonical_unit_bits;
+				inext = 1;
+			} else
+				ASN__ENCODE_FAILED;
+		}
+	} else {
+		inext = 0;
+	}
+
+
+	if(ct_extensible) {
+		/* Declare whether length is [not] within extension root */
+		if(per_put_few_bits(po, inext, 1))
+			ASN__ENCODE_FAILED;
+	}
+
+	/* X.691, #16.5: zero-length encoding */
+	/* X.691, #16.6: short fixed length encoding (up to 2 octets) */
+	/* X.691, #16.7: long fixed length encoding (up to 64K octets) */
+	if(csiz->effective_bits >= 0) {
+		ASN_DEBUG("Encoding %lu bytes (%ld), length in %d bits",
+				st->size, sizeinunits - csiz->lower_bound,
+				csiz->effective_bits);
+		if (csiz->effective_bits > 0) {
+		        ret = aper_put_length(po, csiz->upper_bound - csiz->lower_bound + 1, sizeinunits - csiz->lower_bound);
+		        if(ret) ASN__ENCODE_FAILED;
+		}
+		if (st->size > 2) { /* X.691 #16 NOTE 1 */
+			if (aper_put_align(po) < 0)
+				ASN__ENCODE_FAILED;
+		}
+		if(bpc) {
+			ret = OCTET_STRING_per_put_characters(po, st->buf,
+				sizeinunits, bpc, unit_bits,
+				cval->lower_bound, cval->upper_bound, pc);
+		} else {
+			ret = per_put_many_bits(po, st->buf,
+				sizeinunits * unit_bits);
+		}
+		if(ret) ASN__ENCODE_FAILED;
+		ASN__ENCODED_OK(er);
+	}
+
+	ASN_DEBUG("Encoding %lu bytes", st->size);
+
+	if(sizeinunits == 0) {
+		if(aper_put_length(po, -1, 0))
+			ASN__ENCODE_FAILED;
+		ASN__ENCODED_OK(er);
+	}
+
+	buf = st->buf;
+	while(sizeinunits) {
+		ssize_t maySave = aper_put_length(po, -1, sizeinunits);
+
+		if(maySave < 0) ASN__ENCODE_FAILED;
+
+		ASN_DEBUG("Encoding %ld of %ld",
+			(long)maySave, (long)sizeinunits);
+
+		if(bpc) {
+			ret = OCTET_STRING_per_put_characters(po, buf,
+				maySave, bpc, unit_bits,
+				cval->lower_bound, cval->upper_bound, pc);
+		} else {
+			ret = per_put_many_bits(po, buf, maySave * unit_bits);
+		}
+		if(ret) ASN__ENCODE_FAILED;
+
+		if(bpc)
+			buf += maySave * bpc;
+		else
+			buf += maySave >> 3;
+		sizeinunits -= maySave;
+		assert(!(maySave & 0x07) || !sizeinunits);
+	}
+
+	ASN__ENCODED_OK(er);
+}
+
+#endif  /* ASN_DISABLE_PER_SUPPORT */
+
+int
+OCTET_STRING_print(const asn_TYPE_descriptor_t *td, const void *sptr,
+                   int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+    const char * const h2c = "0123456789ABCDEF";
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	char scratch[16 * 3 + 4];
+	char *p = scratch;
+	uint8_t *buf;
+	uint8_t *end;
+	size_t i;
+
+	(void)td;	/* Unused argument */
+
+	if(!st || (!st->buf && st->size))
+		return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
+
+	/*
+	 * Dump the contents of the buffer in hexadecimal.
+	 */
+	buf = st->buf;
+	end = buf + st->size;
+	for(i = 0; buf < end; buf++, i++) {
+		if(!(i % 16) && (i || st->size > 16)) {
+			if(cb(scratch, p - scratch, app_key) < 0)
+				return -1;
+			_i_INDENT(1);
+			p = scratch;
+		}
+		*p++ = h2c[(*buf >> 4) & 0x0F];
+		*p++ = h2c[*buf & 0x0F];
+		*p++ = 0x20;
+	}
+
+	if(p > scratch) {
+		p--;	/* Remove the tail space */
+		if(cb(scratch, p - scratch, app_key) < 0)
+			return -1;
+	}
+
+	return 0;
+}
+
+int
+OCTET_STRING_print_utf8(const asn_TYPE_descriptor_t *td, const void *sptr,
+                        int ilevel, asn_app_consume_bytes_f *cb,
+                        void *app_key) {
+    const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+
+	(void)td;	/* Unused argument */
+	(void)ilevel;	/* Unused argument */
+
+	if(st && (st->buf || !st->size)) {
+		return (cb(st->buf, st->size, app_key) < 0) ? -1 : 0;
+	} else {
+		return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
+	}
+}
+
+void
+OCTET_STRING_free(const asn_TYPE_descriptor_t *td, void *sptr,
+                  enum asn_struct_free_method method) {
+	OCTET_STRING_t *st = (OCTET_STRING_t *)sptr;
+	const asn_OCTET_STRING_specifics_t *specs;
+	asn_struct_ctx_t *ctx;
+	struct _stack *stck;
+
+	if(!td || !st)
+		return;
+
+	specs = td->specifics
+		    ? (const asn_OCTET_STRING_specifics_t *)td->specifics
+		    : &asn_SPC_OCTET_STRING_specs;
+	ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
+
+	ASN_DEBUG("Freeing %s as OCTET STRING", td->name);
+
+	if(st->buf) {
+		FREEMEM(st->buf);
+		st->buf = 0;
+	}
+
+	/*
+	 * Remove decode-time stack.
+	 */
+	stck = (struct _stack *)ctx->ptr;
+	if(stck) {
+		while(stck->tail) {
+			struct _stack_el *sel = stck->tail;
+			stck->tail = sel->prev;
+			FREEMEM(sel);
+		}
+		FREEMEM(stck);
+	}
+
+    switch(method) {
+    case ASFM_FREE_EVERYTHING:
+        FREEMEM(sptr);
+        break;
+    case ASFM_FREE_UNDERLYING:
+        break;
+    case ASFM_FREE_UNDERLYING_AND_RESET:
+        memset(sptr, 0,
+               td->specifics
+                   ? ((const asn_OCTET_STRING_specifics_t *)(td->specifics))
+                         ->struct_size
+                   : sizeof(OCTET_STRING_t));
+        break;
+    }
+}
+
+/*
+ * Conversion routines.
+ */
+int
+OCTET_STRING_fromBuf(OCTET_STRING_t *st, const char *str, int len) {
+	void *buf;
+
+	if(st == 0 || (str == 0 && len)) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	/*
+	 * Clear the OCTET STRING.
+	 */
+	if(str == NULL) {
+		FREEMEM(st->buf);
+		st->buf = 0;
+		st->size = 0;
+		return 0;
+	}
+
+	/* Determine the original string size, if not explicitly given */
+	if(len < 0)
+		len = strlen(str);
+
+	/* Allocate and fill the memory */
+	buf = MALLOC(len + 1);
+	if(buf == NULL)
+		return -1;
+
+	memcpy(buf, str, len);
+	((uint8_t *)buf)[len] = '\0';	/* Couldn't use memcpy(len+1)! */
+	FREEMEM(st->buf);
+	st->buf = (uint8_t *)buf;
+	st->size = len;
+
+	return 0;
+}
+
+OCTET_STRING_t *
+OCTET_STRING_new_fromBuf(const asn_TYPE_descriptor_t *td, const char *str,
+                         int len) {
+    const asn_OCTET_STRING_specifics_t *specs =
+        td->specifics ? (const asn_OCTET_STRING_specifics_t *)td->specifics
+                      : &asn_SPC_OCTET_STRING_specs;
+    OCTET_STRING_t *st;
+
+	st = (OCTET_STRING_t *)CALLOC(1, specs->struct_size);
+	if(st && str && OCTET_STRING_fromBuf(st, str, len)) {
+		FREEMEM(st);
+		st = NULL;
+	}
+
+	return st;
+}
+
+/*
+ * Lexicographically compare the common prefix of both strings,
+ * and if it is the same return -1 for the smallest string.
+ */
+int
+OCTET_STRING_compare(const asn_TYPE_descriptor_t *td, const void *aptr,
+                     const void *bptr) {
+    const asn_OCTET_STRING_specifics_t *specs = td->specifics;
+    const OCTET_STRING_t *a = aptr;
+    const OCTET_STRING_t *b = bptr;
+
+    assert(!specs || specs->subvariant != ASN_OSUBV_BIT);
+
+    if(a && b) {
+        size_t common_prefix_size = a->size <= b->size ? a->size : b->size;
+        int ret = memcmp(a->buf, b->buf, common_prefix_size);
+        if(ret == 0) {
+            /* Figure out which string with equal prefixes is longer. */
+            if(a->size < b->size) {
+                return -1;
+            } else if(a->size > b->size) {
+                return 1;
+            } else {
+                return 0;
+            }
+        } else {
+            return ret < 0 ? -1 : 1;
+        }
+    } else if(!a && !b) {
+        return 0;
+    } else if(!a) {
+        return -1;
+    } else {
+        return 1;
+    }
+
+}
+
+/*
+ * Biased function for randomizing character values around their limits.
+ */
+static uint32_t
+OCTET_STRING__random_char(unsigned long lb, unsigned long ub) {
+    assert(lb <= ub);
+    switch(asn_random_between(0, 16)) {
+    case 0:
+        if(lb < ub) return lb + 1;
+        /* Fall through */
+    case 1:
+        return lb;
+    case 2:
+        if(lb < ub) return ub - 1;
+        /* Fall through */
+    case 3:
+        return ub;
+    default:
+        return asn_random_between(lb, ub);
+    }
+}
+
+
+size_t
+OCTET_STRING_random_length_constrained(
+    const asn_TYPE_descriptor_t *td,
+    const asn_encoding_constraints_t *constraints, size_t max_length) {
+    const unsigned lengths[] = {0,     1,     2,     3,     4,     8,
+                                126,   127,   128,   16383, 16384, 16385,
+                                65534, 65535, 65536, 65537};
+    size_t rnd_len;
+
+    /* Figure out how far we should go */
+    rnd_len = lengths[asn_random_between(
+        0, sizeof(lengths) / sizeof(lengths[0]) - 1)];
+
+    if(!constraints || !constraints->per_constraints)
+        constraints = &td->encoding_constraints;
+    if(constraints->per_constraints) {
+        const asn_per_constraint_t *pc = &constraints->per_constraints->size;
+        if(pc->flags & APC_CONSTRAINED) {
+            long suggested_upper_bound = pc->upper_bound < (ssize_t)max_length
+                                             ? pc->upper_bound
+                                             : (ssize_t)max_length;
+            if(max_length <= (size_t)pc->lower_bound) {
+                return pc->lower_bound;
+            }
+            if(pc->flags & APC_EXTENSIBLE) {
+                switch(asn_random_between(0, 5)) {
+                case 0:
+                    if(pc->lower_bound > 0) {
+                        rnd_len = pc->lower_bound - 1;
+                        break;
+                    }
+                    /* Fall through */
+                case 1:
+                    rnd_len = pc->upper_bound + 1;
+                    break;
+                case 2:
+                    /* Keep rnd_len from the table */
+                    if(rnd_len <= max_length) {
+                        break;
+                    }
+                    /* Fall through */
+                default:
+                    rnd_len = asn_random_between(pc->lower_bound,
+                                                 suggested_upper_bound);
+                }
+            } else {
+                rnd_len =
+                    asn_random_between(pc->lower_bound, suggested_upper_bound);
+            }
+        } else {
+            rnd_len = asn_random_between(0, max_length);
+        }
+    } else if(rnd_len > max_length) {
+        rnd_len = asn_random_between(0, max_length);
+    }
+
+    return rnd_len;
+}
+
+asn_random_fill_result_t
+OCTET_STRING_random_fill(const asn_TYPE_descriptor_t *td, void **sptr,
+                         const asn_encoding_constraints_t *constraints,
+                         size_t max_length) {
+	const asn_OCTET_STRING_specifics_t *specs = td->specifics
+				? (const asn_OCTET_STRING_specifics_t *)td->specifics
+				: &asn_SPC_OCTET_STRING_specs;
+    asn_random_fill_result_t result_ok = {ARFILL_OK, 1};
+    asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0};
+    asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0};
+    unsigned int unit_bytes = 1;
+    unsigned long clb = 0;  /* Lower bound on char */
+    unsigned long cub = 255;  /* Higher bound on char value */
+    uint8_t *buf;
+    uint8_t *bend;
+    uint8_t *b;
+    size_t rnd_len;
+    OCTET_STRING_t *st;
+
+    if(max_length == 0 && !*sptr) return result_skipped;
+
+    switch(specs->subvariant) {
+    default:
+    case ASN_OSUBV_ANY:
+        return result_failed;
+    case ASN_OSUBV_BIT:
+        /* Handled by BIT_STRING itself. */
+        return result_failed;
+    case ASN_OSUBV_STR:
+        unit_bytes = 1;
+        clb = 0;
+        cub = 255;
+        break;
+    case ASN_OSUBV_U16:
+        unit_bytes = 2;
+        clb = 0;
+        cub = 65535;
+        break;
+    case ASN_OSUBV_U32:
+        unit_bytes = 4;
+        clb = 0;
+        cub = 0x10FFFF;
+        break;
+    }
+
+    if(!constraints || !constraints->per_constraints)
+        constraints = &td->encoding_constraints;
+    if(constraints->per_constraints) {
+        const asn_per_constraint_t *pc = &constraints->per_constraints->value;
+        if(pc->flags & APC_SEMI_CONSTRAINED) {
+            clb = pc->lower_bound;
+        } else if(pc->flags & APC_CONSTRAINED) {
+            clb = pc->lower_bound;
+            cub = pc->upper_bound;
+        }
+    }
+
+    rnd_len =
+        OCTET_STRING_random_length_constrained(td, constraints, max_length);
+
+    buf = CALLOC(unit_bytes, rnd_len + 1);
+    if(!buf) return result_failed;
+
+    bend = &buf[unit_bytes * rnd_len];
+
+    switch(unit_bytes) {
+    case 1:
+        for(b = buf; b < bend; b += unit_bytes) {
+            *(uint8_t *)b = OCTET_STRING__random_char(clb, cub);
+        }
+        *(uint8_t *)b = 0;
+        break;
+    case 2:
+        for(b = buf; b < bend; b += unit_bytes) {
+            uint32_t code = OCTET_STRING__random_char(clb, cub);
+            b[0] = code >> 8;
+            b[1] = code;
+        }
+        *(uint16_t *)b = 0;
+        break;
+    case 4:
+        for(b = buf; b < bend; b += unit_bytes) {
+            uint32_t code = OCTET_STRING__random_char(clb, cub);
+            b[0] = code >> 24;
+            b[1] = code >> 16;
+            b[2] = code >> 8;
+            b[3] = code;
+        }
+        *(uint32_t *)b = 0;
+        break;
+    }
+
+    if(*sptr) {
+        st = *sptr;
+        FREEMEM(st->buf);
+    } else {
+        st = (OCTET_STRING_t *)(*sptr = CALLOC(1, specs->struct_size));
+        if(!st) {
+            FREEMEM(buf);
+            return result_failed;
+        }
+    }
+
+    st->buf = buf;
+    st->size = unit_bytes * rnd_len;
+
+    result_ok.length = st->size;
+    return result_ok;
+}
diff --git a/3rdparty/libe2ap/OCTET_STRING.h b/3rdparty/E2AP-v01.00.00/OCTET_STRING.h
similarity index 100%
rename from 3rdparty/libe2ap/OCTET_STRING.h
rename to 3rdparty/E2AP-v01.00.00/OCTET_STRING.h
diff --git a/3rdparty/libe2ap/OPEN_TYPE.c b/3rdparty/E2AP-v01.00.00/OPEN_TYPE.c
similarity index 100%
rename from 3rdparty/libe2ap/OPEN_TYPE.c
rename to 3rdparty/E2AP-v01.00.00/OPEN_TYPE.c
diff --git a/3rdparty/libe2ap/OPEN_TYPE.h b/3rdparty/E2AP-v01.00.00/OPEN_TYPE.h
similarity index 100%
rename from 3rdparty/libe2ap/OPEN_TYPE.h
rename to 3rdparty/E2AP-v01.00.00/OPEN_TYPE.h
diff --git a/3rdparty/E2AP-v01.00.00/PLMN-Identity.c b/3rdparty/E2AP-v01.00.00/PLMN-Identity.c
new file mode 100644
index 0000000..69b8ceb
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/PLMN-Identity.c
@@ -0,0 +1,62 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "PLMN-Identity.h"
+
+int
+PLMN_Identity_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 3)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_PLMN_Identity_constr_1 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  3,  3 }	/* (SIZE(3..3)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_PLMN_Identity_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_PLMN_Identity = {
+	"PLMN-Identity",
+	"PLMN-Identity",
+	&asn_OP_OCTET_STRING,
+	asn_DEF_PLMN_Identity_tags_1,
+	sizeof(asn_DEF_PLMN_Identity_tags_1)
+		/sizeof(asn_DEF_PLMN_Identity_tags_1[0]), /* 1 */
+	asn_DEF_PLMN_Identity_tags_1,	/* Same as above */
+	sizeof(asn_DEF_PLMN_Identity_tags_1)
+		/sizeof(asn_DEF_PLMN_Identity_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_PLMN_Identity_constr_1, PLMN_Identity_constraint },
+	0, 0,	/* No members */
+	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/PLMN-Identity.h b/3rdparty/E2AP-v01.00.00/PLMN-Identity.h
new file mode 100644
index 0000000..8a954b5
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/PLMN-Identity.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_PLMN_Identity_H_
+#define	_PLMN_Identity_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "OCTET_STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* PLMN-Identity */
+typedef OCTET_STRING_t	 PLMN_Identity_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_PLMN_Identity_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_PLMN_Identity;
+asn_struct_free_f PLMN_Identity_free;
+asn_struct_print_f PLMN_Identity_print;
+asn_constr_check_f PLMN_Identity_constraint;
+ber_type_decoder_f PLMN_Identity_decode_ber;
+der_type_encoder_f PLMN_Identity_encode_der;
+xer_type_decoder_f PLMN_Identity_decode_xer;
+xer_type_encoder_f PLMN_Identity_encode_xer;
+per_type_decoder_f PLMN_Identity_decode_uper;
+per_type_encoder_f PLMN_Identity_encode_uper;
+per_type_decoder_f PLMN_Identity_decode_aper;
+per_type_encoder_f PLMN_Identity_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PLMN_Identity_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/Presence.c b/3rdparty/E2AP-v01.00.00/Presence.c
new file mode 100644
index 0000000..b216284
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/Presence.c
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-CommonDataTypes"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "Presence.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_Presence_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_Presence_value2enum_1[] = {
+	{ 0,	8,	"optional" },
+	{ 1,	11,	"conditional" },
+	{ 2,	9,	"mandatory" }
+};
+static const unsigned int asn_MAP_Presence_enum2value_1[] = {
+	1,	/* conditional(1) */
+	2,	/* mandatory(2) */
+	0	/* optional(0) */
+};
+const asn_INTEGER_specifics_t asn_SPC_Presence_specs_1 = {
+	asn_MAP_Presence_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_Presence_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_Presence_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_Presence = {
+	"Presence",
+	"Presence",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_Presence_tags_1,
+	sizeof(asn_DEF_Presence_tags_1)
+		/sizeof(asn_DEF_Presence_tags_1[0]), /* 1 */
+	asn_DEF_Presence_tags_1,	/* Same as above */
+	sizeof(asn_DEF_Presence_tags_1)
+		/sizeof(asn_DEF_Presence_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_Presence_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_Presence_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/Presence.h b/3rdparty/E2AP-v01.00.00/Presence.h
new file mode 100644
index 0000000..d2ec192
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/Presence.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-CommonDataTypes"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_Presence_H_
+#define	_Presence_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Presence {
+	Presence_optional	= 0,
+	Presence_conditional	= 1,
+	Presence_mandatory	= 2
+} e_Presence;
+
+/* Presence */
+typedef long	 Presence_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Presence_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Presence;
+extern const asn_INTEGER_specifics_t asn_SPC_Presence_specs_1;
+asn_struct_free_f Presence_free;
+asn_struct_print_f Presence_print;
+asn_constr_check_f Presence_constraint;
+ber_type_decoder_f Presence_decode_ber;
+der_type_encoder_f Presence_encode_der;
+xer_type_decoder_f Presence_decode_xer;
+xer_type_encoder_f Presence_encode_xer;
+per_type_decoder_f Presence_decode_uper;
+per_type_encoder_f Presence_encode_uper;
+per_type_decoder_f Presence_decode_aper;
+per_type_encoder_f Presence_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Presence_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/ProcedureCode.c b/3rdparty/E2AP-v01.00.00/ProcedureCode.c
new file mode 100644
index 0000000..b71f811
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProcedureCode.c
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-CommonDataTypes"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "ProcedureCode.h"
+
+int
+ProcedureCode_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 255)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_ProcedureCode_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0,  255 }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_ProcedureCode_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_ProcedureCode = {
+	"ProcedureCode",
+	"ProcedureCode",
+	&asn_OP_NativeInteger,
+	asn_DEF_ProcedureCode_tags_1,
+	sizeof(asn_DEF_ProcedureCode_tags_1)
+		/sizeof(asn_DEF_ProcedureCode_tags_1[0]), /* 1 */
+	asn_DEF_ProcedureCode_tags_1,	/* Same as above */
+	sizeof(asn_DEF_ProcedureCode_tags_1)
+		/sizeof(asn_DEF_ProcedureCode_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_ProcedureCode_constr_1, ProcedureCode_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/ProcedureCode.h b/3rdparty/E2AP-v01.00.00/ProcedureCode.h
new file mode 100644
index 0000000..b591490
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProcedureCode.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-CommonDataTypes"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_ProcedureCode_H_
+#define	_ProcedureCode_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ProcedureCode */
+typedef long	 ProcedureCode_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ProcedureCode_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ProcedureCode;
+asn_struct_free_f ProcedureCode_free;
+asn_struct_print_f ProcedureCode_print;
+asn_constr_check_f ProcedureCode_constraint;
+ber_type_decoder_f ProcedureCode_decode_ber;
+der_type_encoder_f ProcedureCode_encode_der;
+xer_type_decoder_f ProcedureCode_decode_xer;
+xer_type_encoder_f ProcedureCode_encode_xer;
+per_type_decoder_f ProcedureCode_decode_uper;
+per_type_encoder_f ProcedureCode_encode_uper;
+per_type_decoder_f ProcedureCode_decode_aper;
+per_type_encoder_f ProcedureCode_encode_aper;
+#define ProcedureCode_id_E2setup	((ProcedureCode_t)1)
+#define ProcedureCode_id_ErrorIndication	((ProcedureCode_t)2)
+#define ProcedureCode_id_Reset	((ProcedureCode_t)3)
+#define ProcedureCode_id_RICcontrol	((ProcedureCode_t)4)
+#define ProcedureCode_id_RICindication	((ProcedureCode_t)5)
+#define ProcedureCode_id_RICserviceQuery	((ProcedureCode_t)6)
+#define ProcedureCode_id_RICserviceUpdate	((ProcedureCode_t)7)
+#define ProcedureCode_id_RICsubscription	((ProcedureCode_t)8)
+#define ProcedureCode_id_RICsubscriptionDelete	((ProcedureCode_t)9)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProcedureCode_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-Container.c b/3rdparty/E2AP-v01.00.00/ProtocolIE-Container.c
new file mode 100644
index 0000000..485c3b8
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-Container.c
@@ -0,0 +1,810 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-Containers"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "ProtocolIE-Container.h"
+
+#include "ProtocolIE-Field.h"
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P0_constr_1 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P1_constr_3 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P2_constr_5 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P3_constr_7 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P4_constr_9 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P5_constr_11 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P6_constr_13 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P7_constr_15 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P8_constr_17 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P9_constr_19 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P10_constr_21 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P11_constr_23 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P12_constr_25 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P13_constr_27 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P14_constr_29 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P15_constr_31 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P16_constr_33 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P17_constr_35 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P18_constr_37 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P19_constr_39 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P0_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICsubscriptionRequest_IEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P0_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P0_specs_1 = {
+	sizeof(struct ProtocolIE_Container_1544P0),
+	offsetof(struct ProtocolIE_Container_1544P0, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P0 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P0_tags_1,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P0_tags_1)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P0_tags_1[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P0_tags_1,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P0_tags_1)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P0_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P0_constr_1, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P0_1,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P0_specs_1	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P1_3[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICsubscriptionResponse_IEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P1_tags_3[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P1_specs_3 = {
+	sizeof(struct ProtocolIE_Container_1544P1),
+	offsetof(struct ProtocolIE_Container_1544P1, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P1 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P1_tags_3,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P1_tags_3)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P1_tags_3[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P1_tags_3,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P1_tags_3)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P1_tags_3[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P1_constr_3, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P1_3,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P1_specs_3	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P2_5[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICsubscriptionFailure_IEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P2_tags_5[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P2_specs_5 = {
+	sizeof(struct ProtocolIE_Container_1544P2),
+	offsetof(struct ProtocolIE_Container_1544P2, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P2 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P2_tags_5,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P2_tags_5)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P2_tags_5[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P2_tags_5,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P2_tags_5)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P2_tags_5[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P2_constr_5, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P2_5,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P2_specs_5	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P3_7[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICsubscriptionDeleteRequest_IEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P3_tags_7[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P3_specs_7 = {
+	sizeof(struct ProtocolIE_Container_1544P3),
+	offsetof(struct ProtocolIE_Container_1544P3, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P3 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P3_tags_7,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P3_tags_7)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P3_tags_7[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P3_tags_7,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P3_tags_7)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P3_tags_7[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P3_constr_7, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P3_7,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P3_specs_7	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P4_9[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICsubscriptionDeleteResponse_IEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P4_tags_9[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P4_specs_9 = {
+	sizeof(struct ProtocolIE_Container_1544P4),
+	offsetof(struct ProtocolIE_Container_1544P4, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P4 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P4_tags_9,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P4_tags_9)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P4_tags_9[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P4_tags_9,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P4_tags_9)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P4_tags_9[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P4_constr_9, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P4_9,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P4_specs_9	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P5_11[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICsubscriptionDeleteFailure_IEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P5_tags_11[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P5_specs_11 = {
+	sizeof(struct ProtocolIE_Container_1544P5),
+	offsetof(struct ProtocolIE_Container_1544P5, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P5 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P5_tags_11,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P5_tags_11)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P5_tags_11[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P5_tags_11,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P5_tags_11)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P5_tags_11[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P5_constr_11, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P5_11,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P5_specs_11	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P6_13[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICindication_IEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P6_tags_13[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P6_specs_13 = {
+	sizeof(struct ProtocolIE_Container_1544P6),
+	offsetof(struct ProtocolIE_Container_1544P6, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P6 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P6_tags_13,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P6_tags_13)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P6_tags_13[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P6_tags_13,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P6_tags_13)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P6_tags_13[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P6_constr_13, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P6_13,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P6_specs_13	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P7_15[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICcontrolRequest_IEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P7_tags_15[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P7_specs_15 = {
+	sizeof(struct ProtocolIE_Container_1544P7),
+	offsetof(struct ProtocolIE_Container_1544P7, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P7 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P7_tags_15,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P7_tags_15)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P7_tags_15[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P7_tags_15,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P7_tags_15)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P7_tags_15[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P7_constr_15, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P7_15,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P7_specs_15	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P8_17[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICcontrolAcknowledge_IEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P8_tags_17[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P8_specs_17 = {
+	sizeof(struct ProtocolIE_Container_1544P8),
+	offsetof(struct ProtocolIE_Container_1544P8, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P8 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P8_tags_17,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P8_tags_17)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P8_tags_17[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P8_tags_17,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P8_tags_17)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P8_tags_17[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P8_constr_17, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P8_17,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P8_specs_17	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P9_19[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICcontrolFailure_IEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P9_tags_19[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P9_specs_19 = {
+	sizeof(struct ProtocolIE_Container_1544P9),
+	offsetof(struct ProtocolIE_Container_1544P9, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P9 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P9_tags_19,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P9_tags_19)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P9_tags_19[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P9_tags_19,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P9_tags_19)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P9_tags_19[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P9_constr_19, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P9_19,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P9_specs_19	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P10_21[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_ErrorIndication_IEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P10_tags_21[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P10_specs_21 = {
+	sizeof(struct ProtocolIE_Container_1544P10),
+	offsetof(struct ProtocolIE_Container_1544P10, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P10 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P10_tags_21,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P10_tags_21)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P10_tags_21[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P10_tags_21,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P10_tags_21)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P10_tags_21[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P10_constr_21, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P10_21,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P10_specs_21	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P11_23[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_E2setupRequestIEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P11_tags_23[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P11_specs_23 = {
+	sizeof(struct ProtocolIE_Container_1544P11),
+	offsetof(struct ProtocolIE_Container_1544P11, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P11 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P11_tags_23,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P11_tags_23)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P11_tags_23[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P11_tags_23,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P11_tags_23)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P11_tags_23[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P11_constr_23, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P11_23,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P11_specs_23	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P12_25[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_E2setupResponseIEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P12_tags_25[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P12_specs_25 = {
+	sizeof(struct ProtocolIE_Container_1544P12),
+	offsetof(struct ProtocolIE_Container_1544P12, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P12 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P12_tags_25,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P12_tags_25)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P12_tags_25[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P12_tags_25,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P12_tags_25)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P12_tags_25[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P12_constr_25, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P12_25,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P12_specs_25	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P13_27[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_E2setupFailureIEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P13_tags_27[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P13_specs_27 = {
+	sizeof(struct ProtocolIE_Container_1544P13),
+	offsetof(struct ProtocolIE_Container_1544P13, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P13 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P13_tags_27,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P13_tags_27)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P13_tags_27[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P13_tags_27,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P13_tags_27)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P13_tags_27[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P13_constr_27, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P13_27,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P13_specs_27	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P14_29[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_ResetRequestIEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P14_tags_29[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P14_specs_29 = {
+	sizeof(struct ProtocolIE_Container_1544P14),
+	offsetof(struct ProtocolIE_Container_1544P14, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P14 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P14_tags_29,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P14_tags_29)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P14_tags_29[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P14_tags_29,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P14_tags_29)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P14_tags_29[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P14_constr_29, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P14_29,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P14_specs_29	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P15_31[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_ResetResponseIEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P15_tags_31[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P15_specs_31 = {
+	sizeof(struct ProtocolIE_Container_1544P15),
+	offsetof(struct ProtocolIE_Container_1544P15, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P15 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P15_tags_31,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P15_tags_31)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P15_tags_31[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P15_tags_31,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P15_tags_31)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P15_tags_31[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P15_constr_31, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P15_31,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P15_specs_31	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P16_33[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICserviceUpdate_IEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P16_tags_33[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P16_specs_33 = {
+	sizeof(struct ProtocolIE_Container_1544P16),
+	offsetof(struct ProtocolIE_Container_1544P16, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P16 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P16_tags_33,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P16_tags_33)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P16_tags_33[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P16_tags_33,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P16_tags_33)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P16_tags_33[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P16_constr_33, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P16_33,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P16_specs_33	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P17_35[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICserviceUpdateAcknowledge_IEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P17_tags_35[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P17_specs_35 = {
+	sizeof(struct ProtocolIE_Container_1544P17),
+	offsetof(struct ProtocolIE_Container_1544P17, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P17 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P17_tags_35,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P17_tags_35)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P17_tags_35[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P17_tags_35,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P17_tags_35)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P17_tags_35[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P17_constr_35, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P17_35,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P17_specs_35	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P18_37[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICserviceUpdateFailure_IEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P18_tags_37[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P18_specs_37 = {
+	sizeof(struct ProtocolIE_Container_1544P18),
+	offsetof(struct ProtocolIE_Container_1544P18, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P18 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P18_tags_37,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P18_tags_37)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P18_tags_37[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P18_tags_37,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P18_tags_37)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P18_tags_37[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P18_constr_37, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P18_37,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P18_specs_37	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P19_39[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICserviceQuery_IEs,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_1544P19_tags_39[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P19_specs_39 = {
+	sizeof(struct ProtocolIE_Container_1544P19),
+	offsetof(struct ProtocolIE_Container_1544P19, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P19 = {
+	"ProtocolIE-Container",
+	"ProtocolIE-Container",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_ProtocolIE_Container_1544P19_tags_39,
+	sizeof(asn_DEF_ProtocolIE_Container_1544P19_tags_39)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P19_tags_39[0]), /* 1 */
+	asn_DEF_ProtocolIE_Container_1544P19_tags_39,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_Container_1544P19_tags_39)
+		/sizeof(asn_DEF_ProtocolIE_Container_1544P19_tags_39[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_Container_1544P19_constr_39, SEQUENCE_OF_constraint },
+	asn_MBR_ProtocolIE_Container_1544P19_39,
+	1,	/* Single element */
+	&asn_SPC_ProtocolIE_Container_1544P19_specs_39	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-Container.h b/3rdparty/E2AP-v01.00.00/ProtocolIE-Container.h
new file mode 100644
index 0000000..ad1c380
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-Container.h
@@ -0,0 +1,253 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-Containers"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_ProtocolIE_Container_H_
+#define	_ProtocolIE_Container_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "asn_SEQUENCE_OF.h"
+#include "constr_SEQUENCE_OF.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct RICsubscriptionRequest_IEs;
+struct RICsubscriptionResponse_IEs;
+struct RICsubscriptionFailure_IEs;
+struct RICsubscriptionDeleteRequest_IEs;
+struct RICsubscriptionDeleteResponse_IEs;
+struct RICsubscriptionDeleteFailure_IEs;
+struct RICindication_IEs;
+struct RICcontrolRequest_IEs;
+struct RICcontrolAcknowledge_IEs;
+struct RICcontrolFailure_IEs;
+struct ErrorIndication_IEs;
+struct E2setupRequestIEs;
+struct E2setupResponseIEs;
+struct E2setupFailureIEs;
+struct ResetRequestIEs;
+struct ResetResponseIEs;
+struct RICserviceUpdate_IEs;
+struct RICserviceUpdateAcknowledge_IEs;
+struct RICserviceUpdateFailure_IEs;
+struct RICserviceQuery_IEs;
+
+/* ProtocolIE-Container */
+typedef struct ProtocolIE_Container_1544P0 {
+	A_SEQUENCE_OF(struct RICsubscriptionRequest_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P0_t;
+typedef struct ProtocolIE_Container_1544P1 {
+	A_SEQUENCE_OF(struct RICsubscriptionResponse_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P1_t;
+typedef struct ProtocolIE_Container_1544P2 {
+	A_SEQUENCE_OF(struct RICsubscriptionFailure_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P2_t;
+typedef struct ProtocolIE_Container_1544P3 {
+	A_SEQUENCE_OF(struct RICsubscriptionDeleteRequest_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P3_t;
+typedef struct ProtocolIE_Container_1544P4 {
+	A_SEQUENCE_OF(struct RICsubscriptionDeleteResponse_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P4_t;
+typedef struct ProtocolIE_Container_1544P5 {
+	A_SEQUENCE_OF(struct RICsubscriptionDeleteFailure_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P5_t;
+typedef struct ProtocolIE_Container_1544P6 {
+	A_SEQUENCE_OF(struct RICindication_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P6_t;
+typedef struct ProtocolIE_Container_1544P7 {
+	A_SEQUENCE_OF(struct RICcontrolRequest_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P7_t;
+typedef struct ProtocolIE_Container_1544P8 {
+	A_SEQUENCE_OF(struct RICcontrolAcknowledge_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P8_t;
+typedef struct ProtocolIE_Container_1544P9 {
+	A_SEQUENCE_OF(struct RICcontrolFailure_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P9_t;
+typedef struct ProtocolIE_Container_1544P10 {
+	A_SEQUENCE_OF(struct ErrorIndication_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P10_t;
+typedef struct ProtocolIE_Container_1544P11 {
+	A_SEQUENCE_OF(struct E2setupRequestIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P11_t;
+typedef struct ProtocolIE_Container_1544P12 {
+	A_SEQUENCE_OF(struct E2setupResponseIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P12_t;
+typedef struct ProtocolIE_Container_1544P13 {
+	A_SEQUENCE_OF(struct E2setupFailureIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P13_t;
+typedef struct ProtocolIE_Container_1544P14 {
+	A_SEQUENCE_OF(struct ResetRequestIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P14_t;
+typedef struct ProtocolIE_Container_1544P15 {
+	A_SEQUENCE_OF(struct ResetResponseIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P15_t;
+typedef struct ProtocolIE_Container_1544P16 {
+	A_SEQUENCE_OF(struct RICserviceUpdate_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P16_t;
+typedef struct ProtocolIE_Container_1544P17 {
+	A_SEQUENCE_OF(struct RICserviceUpdateAcknowledge_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P17_t;
+typedef struct ProtocolIE_Container_1544P18 {
+	A_SEQUENCE_OF(struct RICserviceUpdateFailure_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P18_t;
+typedef struct ProtocolIE_Container_1544P19 {
+	A_SEQUENCE_OF(struct RICserviceQuery_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_1544P19_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P0;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P0_specs_1;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P0_1[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P0_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P1;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P1_specs_3;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P1_3[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P1_constr_3;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P2;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P2_specs_5;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P2_5[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P2_constr_5;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P3;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P3_specs_7;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P3_7[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P3_constr_7;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P4;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P4_specs_9;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P4_9[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P4_constr_9;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P5;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P5_specs_11;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P5_11[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P5_constr_11;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P6;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P6_specs_13;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P6_13[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P6_constr_13;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P7;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P7_specs_15;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P7_15[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P7_constr_15;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P8;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P8_specs_17;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P8_17[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P8_constr_17;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P9;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P9_specs_19;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P9_19[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P9_constr_19;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P10;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P10_specs_21;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P10_21[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P10_constr_21;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P11;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P11_specs_23;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P11_23[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P11_constr_23;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P12;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P12_specs_25;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P12_25[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P12_constr_25;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P13;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P13_specs_27;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P13_27[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P13_constr_27;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P14;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P14_specs_29;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P14_29[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P14_constr_29;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P15;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P15_specs_31;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P15_31[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P15_constr_31;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P16;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P16_specs_33;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P16_33[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P16_constr_33;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P17;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P17_specs_35;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P17_35[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P17_constr_35;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P18;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P18_specs_37;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P18_37[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P18_constr_37;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_1544P19;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_1544P19_specs_39;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_1544P19_39[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_1544P19_constr_39;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_Container_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerList.c b/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerList.c
new file mode 100644
index 0000000..7d3db94
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerList.c
@@ -0,0 +1,9 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-Containers"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "ProtocolIE-ContainerList.h"
+
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerList.h b/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerList.h
new file mode 100644
index 0000000..2f6e4c4
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerList.h
@@ -0,0 +1,23 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-Containers"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_ProtocolIE_ContainerList_H_
+#define	_ProtocolIE_ContainerList_H_
+
+
+#include "asn_application.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_ContainerList_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerPair.c b/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerPair.c
new file mode 100644
index 0000000..c7e3c17
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerPair.c
@@ -0,0 +1,9 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-Containers"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "ProtocolIE-ContainerPair.h"
+
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerPair.h b/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerPair.h
new file mode 100644
index 0000000..89d9186
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerPair.h
@@ -0,0 +1,23 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-Containers"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_ProtocolIE_ContainerPair_H_
+#define	_ProtocolIE_ContainerPair_H_
+
+
+#include "asn_application.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_ContainerPair_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerPairList.c b/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerPairList.c
new file mode 100644
index 0000000..c3ab86f
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerPairList.c
@@ -0,0 +1,9 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-Containers"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "ProtocolIE-ContainerPairList.h"
+
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerPairList.h b/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerPairList.h
new file mode 100644
index 0000000..0978e80
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-ContainerPairList.h
@@ -0,0 +1,23 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-Containers"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_ProtocolIE_ContainerPairList_H_
+#define	_ProtocolIE_ContainerPairList_H_
+
+
+#include "asn_application.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_ContainerPairList_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-Field.c b/3rdparty/E2AP-v01.00.00/ProtocolIE-Field.c
new file mode 100644
index 0000000..f72c03c
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-Field.c
@@ -0,0 +1,7190 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-Containers"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "ProtocolIE-Field.h"
+
+static const long asn_VAL_4_id_RICaction_ToBeSetup_Item = 19;
+static const long asn_VAL_4_ignore = 1;
+static const long asn_VAL_4_mandatory = 2;
+static const asn_ioc_cell_t asn_IOS_RICaction_ToBeSetup_ItemIEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_4_id_RICaction_ToBeSetup_Item },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_4_ignore },
+	{ "&Value", aioc__type, &asn_DEF_RICaction_ToBeSetup_Item },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_4_mandatory }
+};
+static const asn_ioc_set_t asn_IOS_RICaction_ToBeSetup_ItemIEs_1[] = {
+	{ 1, 4, asn_IOS_RICaction_ToBeSetup_ItemIEs_1_rows }
+};
+static const long asn_VAL_9_id_RICaction_Admitted_Item = 14;
+static const long asn_VAL_9_ignore = 1;
+static const long asn_VAL_9_mandatory = 2;
+static const asn_ioc_cell_t asn_IOS_RICaction_Admitted_ItemIEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_9_id_RICaction_Admitted_Item },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_ignore },
+	{ "&Value", aioc__type, &asn_DEF_RICaction_Admitted_Item },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_9_mandatory }
+};
+static const asn_ioc_set_t asn_IOS_RICaction_Admitted_ItemIEs_1[] = {
+	{ 1, 4, asn_IOS_RICaction_Admitted_ItemIEs_1_rows }
+};
+static const long asn_VAL_10_id_RICaction_NotAdmitted_Item = 16;
+static const long asn_VAL_10_ignore = 1;
+static const long asn_VAL_10_mandatory = 2;
+static const asn_ioc_cell_t asn_IOS_RICaction_NotAdmitted_ItemIEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_10_id_RICaction_NotAdmitted_Item },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_10_ignore },
+	{ "&Value", aioc__type, &asn_DEF_RICaction_NotAdmitted_Item },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_10_mandatory }
+};
+static const asn_ioc_set_t asn_IOS_RICaction_NotAdmitted_ItemIEs_1[] = {
+	{ 1, 4, asn_IOS_RICaction_NotAdmitted_ItemIEs_1_rows }
+};
+static const long asn_VAL_64_id_RANfunction_Item = 8;
+static const long asn_VAL_64_ignore = 1;
+static const long asn_VAL_64_mandatory = 2;
+static const asn_ioc_cell_t asn_IOS_RANfunction_ItemIEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_64_id_RANfunction_Item },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_64_ignore },
+	{ "&Value", aioc__type, &asn_DEF_RANfunction_Item },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_64_mandatory }
+};
+static const asn_ioc_set_t asn_IOS_RANfunction_ItemIEs_1[] = {
+	{ 1, 4, asn_IOS_RANfunction_ItemIEs_1_rows }
+};
+static const long asn_VAL_65_id_RANfunctionID_Item = 6;
+static const long asn_VAL_65_ignore = 1;
+static const long asn_VAL_65_mandatory = 2;
+static const asn_ioc_cell_t asn_IOS_RANfunctionID_ItemIEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_65_id_RANfunctionID_Item },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_65_ignore },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionID_Item },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_65_mandatory }
+};
+static const asn_ioc_set_t asn_IOS_RANfunctionID_ItemIEs_1[] = {
+	{ 1, 4, asn_IOS_RANfunctionID_ItemIEs_1_rows }
+};
+static const long asn_VAL_68_id_RANfunctionIEcause_Item = 7;
+static const long asn_VAL_68_ignore = 1;
+static const long asn_VAL_68_mandatory = 2;
+static const asn_ioc_cell_t asn_IOS_RANfunctionIDcause_ItemIEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_68_id_RANfunctionIEcause_Item },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_68_ignore },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionIDcause_Item },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_68_mandatory }
+};
+static const asn_ioc_set_t asn_IOS_RANfunctionIDcause_ItemIEs_1[] = {
+	{ 1, 4, asn_IOS_RANfunctionIDcause_ItemIEs_1_rows }
+};
+static const long asn_VAL_1_id_RICrequestID = 29;
+static const long asn_VAL_1_reject = 0;
+static const long asn_VAL_1_mandatory = 2;
+static const long asn_VAL_2_id_RANfunctionID = 5;
+static const long asn_VAL_2_reject = 0;
+static const long asn_VAL_2_mandatory = 2;
+static const long asn_VAL_3_id_RICsubscriptionDetails = 30;
+static const long asn_VAL_3_reject = 0;
+static const long asn_VAL_3_mandatory = 2;
+static const asn_ioc_cell_t asn_IOS_RICsubscriptionRequest_IEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_1_id_RICrequestID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_1_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_1_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_2_id_RANfunctionID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_2_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_2_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_3_id_RICsubscriptionDetails },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_3_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICsubscriptionDetails },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_3_mandatory }
+};
+static const asn_ioc_set_t asn_IOS_RICsubscriptionRequest_IEs_1[] = {
+	{ 3, 4, asn_IOS_RICsubscriptionRequest_IEs_1_rows }
+};
+static const long asn_VAL_5_id_RICrequestID = 29;
+static const long asn_VAL_5_reject = 0;
+static const long asn_VAL_5_mandatory = 2;
+static const long asn_VAL_6_id_RANfunctionID = 5;
+static const long asn_VAL_6_reject = 0;
+static const long asn_VAL_6_mandatory = 2;
+static const long asn_VAL_7_id_RICactions_Admitted = 17;
+static const long asn_VAL_7_reject = 0;
+static const long asn_VAL_7_mandatory = 2;
+static const long asn_VAL_8_id_RICactions_NotAdmitted = 18;
+static const long asn_VAL_8_reject = 0;
+static const long asn_VAL_8_optional = 0;
+static const asn_ioc_cell_t asn_IOS_RICsubscriptionResponse_IEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_5_id_RICrequestID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_5_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_5_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_6_id_RANfunctionID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_6_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_7_id_RICactions_Admitted },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICaction_Admitted_List },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_7_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_8_id_RICactions_NotAdmitted },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICaction_NotAdmitted_List },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_8_optional }
+};
+static const asn_ioc_set_t asn_IOS_RICsubscriptionResponse_IEs_1[] = {
+	{ 4, 4, asn_IOS_RICsubscriptionResponse_IEs_1_rows }
+};
+static const long asn_VAL_11_id_RICrequestID = 29;
+static const long asn_VAL_11_reject = 0;
+static const long asn_VAL_11_mandatory = 2;
+static const long asn_VAL_12_id_RANfunctionID = 5;
+static const long asn_VAL_12_reject = 0;
+static const long asn_VAL_12_mandatory = 2;
+static const long asn_VAL_13_id_RICactions_NotAdmitted = 18;
+static const long asn_VAL_13_reject = 0;
+static const long asn_VAL_13_mandatory = 2;
+static const long asn_VAL_14_id_CriticalityDiagnostics = 2;
+static const long asn_VAL_14_ignore = 1;
+static const long asn_VAL_14_optional = 0;
+static const asn_ioc_cell_t asn_IOS_RICsubscriptionFailure_IEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_11_id_RICrequestID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_11_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_11_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_12_id_RANfunctionID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_12_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_12_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_13_id_RICactions_NotAdmitted },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_13_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICaction_NotAdmitted_List },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_13_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_14_id_CriticalityDiagnostics },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_14_ignore },
+	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_14_optional }
+};
+static const asn_ioc_set_t asn_IOS_RICsubscriptionFailure_IEs_1[] = {
+	{ 4, 4, asn_IOS_RICsubscriptionFailure_IEs_1_rows }
+};
+static const long asn_VAL_15_id_RICrequestID = 29;
+static const long asn_VAL_15_reject = 0;
+static const long asn_VAL_15_mandatory = 2;
+static const long asn_VAL_16_id_RANfunctionID = 5;
+static const long asn_VAL_16_reject = 0;
+static const long asn_VAL_16_mandatory = 2;
+static const asn_ioc_cell_t asn_IOS_RICsubscriptionDeleteRequest_IEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_15_id_RICrequestID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_15_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_15_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_16_id_RANfunctionID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_16_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_16_mandatory }
+};
+static const asn_ioc_set_t asn_IOS_RICsubscriptionDeleteRequest_IEs_1[] = {
+	{ 2, 4, asn_IOS_RICsubscriptionDeleteRequest_IEs_1_rows }
+};
+static const long asn_VAL_17_id_RICrequestID = 29;
+static const long asn_VAL_17_reject = 0;
+static const long asn_VAL_17_mandatory = 2;
+static const long asn_VAL_18_id_RANfunctionID = 5;
+static const long asn_VAL_18_reject = 0;
+static const long asn_VAL_18_mandatory = 2;
+static const asn_ioc_cell_t asn_IOS_RICsubscriptionDeleteResponse_IEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_17_id_RICrequestID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_17_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_17_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_18_id_RANfunctionID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_18_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_18_mandatory }
+};
+static const asn_ioc_set_t asn_IOS_RICsubscriptionDeleteResponse_IEs_1[] = {
+	{ 2, 4, asn_IOS_RICsubscriptionDeleteResponse_IEs_1_rows }
+};
+static const long asn_VAL_19_id_RICrequestID = 29;
+static const long asn_VAL_19_reject = 0;
+static const long asn_VAL_19_mandatory = 2;
+static const long asn_VAL_20_id_RANfunctionID = 5;
+static const long asn_VAL_20_reject = 0;
+static const long asn_VAL_20_mandatory = 2;
+static const long asn_VAL_21_id_Cause = 1;
+static const long asn_VAL_21_ignore = 1;
+static const long asn_VAL_21_mandatory = 2;
+static const long asn_VAL_22_id_CriticalityDiagnostics = 2;
+static const long asn_VAL_22_ignore = 1;
+static const long asn_VAL_22_optional = 0;
+static const asn_ioc_cell_t asn_IOS_RICsubscriptionDeleteFailure_IEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_19_id_RICrequestID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_19_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_19_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_20_id_RANfunctionID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_20_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_20_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_21_id_Cause },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_21_ignore },
+	{ "&Value", aioc__type, &asn_DEF_Cause },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_21_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_22_id_CriticalityDiagnostics },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_22_ignore },
+	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_22_optional }
+};
+static const asn_ioc_set_t asn_IOS_RICsubscriptionDeleteFailure_IEs_1[] = {
+	{ 4, 4, asn_IOS_RICsubscriptionDeleteFailure_IEs_1_rows }
+};
+static const long asn_VAL_23_id_RICrequestID = 29;
+static const long asn_VAL_23_reject = 0;
+static const long asn_VAL_23_mandatory = 2;
+static const long asn_VAL_24_id_RANfunctionID = 5;
+static const long asn_VAL_24_reject = 0;
+static const long asn_VAL_24_mandatory = 2;
+static const long asn_VAL_25_id_RICactionID = 15;
+static const long asn_VAL_25_reject = 0;
+static const long asn_VAL_25_mandatory = 2;
+static const long asn_VAL_26_id_RICindicationSN = 27;
+static const long asn_VAL_26_reject = 0;
+static const long asn_VAL_26_optional = 0;
+static const long asn_VAL_27_id_RICindicationType = 28;
+static const long asn_VAL_27_reject = 0;
+static const long asn_VAL_27_mandatory = 2;
+static const long asn_VAL_28_id_RICindicationHeader = 25;
+static const long asn_VAL_28_reject = 0;
+static const long asn_VAL_28_mandatory = 2;
+static const long asn_VAL_29_id_RICindicationMessage = 26;
+static const long asn_VAL_29_reject = 0;
+static const long asn_VAL_29_mandatory = 2;
+static const long asn_VAL_30_id_RICcallProcessID = 20;
+static const long asn_VAL_30_reject = 0;
+static const long asn_VAL_30_optional = 0;
+static const asn_ioc_cell_t asn_IOS_RICindication_IEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_23_id_RICrequestID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_23_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_23_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_24_id_RANfunctionID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_24_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_24_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_25_id_RICactionID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_25_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICactionID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_25_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_26_id_RICindicationSN },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_26_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICindicationSN },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_26_optional },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_27_id_RICindicationType },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_27_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICindicationType },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_27_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_28_id_RICindicationHeader },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_28_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICindicationHeader },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_28_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_29_id_RICindicationMessage },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_29_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICindicationMessage },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_29_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_30_id_RICcallProcessID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_30_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICcallProcessID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_30_optional }
+};
+static const asn_ioc_set_t asn_IOS_RICindication_IEs_1[] = {
+	{ 8, 4, asn_IOS_RICindication_IEs_1_rows }
+};
+static const long asn_VAL_31_id_RICrequestID = 29;
+static const long asn_VAL_31_reject = 0;
+static const long asn_VAL_31_mandatory = 2;
+static const long asn_VAL_32_id_RANfunctionID = 5;
+static const long asn_VAL_32_reject = 0;
+static const long asn_VAL_32_mandatory = 2;
+static const long asn_VAL_33_id_RICcallProcessID = 20;
+static const long asn_VAL_33_reject = 0;
+static const long asn_VAL_33_optional = 0;
+static const long asn_VAL_34_id_RICcontrolHeader = 22;
+static const long asn_VAL_34_reject = 0;
+static const long asn_VAL_34_mandatory = 2;
+static const long asn_VAL_35_id_RICcontrolMessage = 23;
+static const long asn_VAL_35_reject = 0;
+static const long asn_VAL_35_mandatory = 2;
+static const long asn_VAL_36_id_RICcontrolAckRequest = 21;
+static const long asn_VAL_36_reject = 0;
+static const long asn_VAL_36_optional = 0;
+static const asn_ioc_cell_t asn_IOS_RICcontrolRequest_IEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_31_id_RICrequestID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_31_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_31_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_32_id_RANfunctionID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_32_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_32_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_33_id_RICcallProcessID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_33_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICcallProcessID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_33_optional },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_34_id_RICcontrolHeader },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_34_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICcontrolHeader },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_34_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_35_id_RICcontrolMessage },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_35_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICcontrolMessage },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_35_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_36_id_RICcontrolAckRequest },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_36_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICcontrolAckRequest },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_36_optional }
+};
+static const asn_ioc_set_t asn_IOS_RICcontrolRequest_IEs_1[] = {
+	{ 6, 4, asn_IOS_RICcontrolRequest_IEs_1_rows }
+};
+static const long asn_VAL_37_id_RICrequestID = 29;
+static const long asn_VAL_37_reject = 0;
+static const long asn_VAL_37_mandatory = 2;
+static const long asn_VAL_38_id_RANfunctionID = 5;
+static const long asn_VAL_38_reject = 0;
+static const long asn_VAL_38_mandatory = 2;
+static const long asn_VAL_39_id_RICcallProcessID = 20;
+static const long asn_VAL_39_reject = 0;
+static const long asn_VAL_39_optional = 0;
+static const long asn_VAL_40_id_RICcontrolStatus = 24;
+static const long asn_VAL_40_reject = 0;
+static const long asn_VAL_40_mandatory = 2;
+static const long asn_VAL_41_id_RICcontrolOutcome = 32;
+static const long asn_VAL_41_reject = 0;
+static const long asn_VAL_41_optional = 0;
+static const asn_ioc_cell_t asn_IOS_RICcontrolAcknowledge_IEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_37_id_RICrequestID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_37_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_37_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_38_id_RANfunctionID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_38_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_38_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_39_id_RICcallProcessID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_39_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICcallProcessID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_39_optional },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_40_id_RICcontrolStatus },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_40_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICcontrolStatus },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_40_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_41_id_RICcontrolOutcome },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_41_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICcontrolOutcome },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_41_optional }
+};
+static const asn_ioc_set_t asn_IOS_RICcontrolAcknowledge_IEs_1[] = {
+	{ 5, 4, asn_IOS_RICcontrolAcknowledge_IEs_1_rows }
+};
+static const long asn_VAL_42_id_RICrequestID = 29;
+static const long asn_VAL_42_reject = 0;
+static const long asn_VAL_42_mandatory = 2;
+static const long asn_VAL_43_id_RANfunctionID = 5;
+static const long asn_VAL_43_reject = 0;
+static const long asn_VAL_43_mandatory = 2;
+static const long asn_VAL_44_id_RICcallProcessID = 20;
+static const long asn_VAL_44_reject = 0;
+static const long asn_VAL_44_optional = 0;
+static const long asn_VAL_45_id_Cause = 1;
+static const long asn_VAL_45_ignore = 1;
+static const long asn_VAL_45_mandatory = 2;
+static const long asn_VAL_46_id_RICcontrolOutcome = 32;
+static const long asn_VAL_46_reject = 0;
+static const long asn_VAL_46_optional = 0;
+static const asn_ioc_cell_t asn_IOS_RICcontrolFailure_IEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_42_id_RICrequestID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_42_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_42_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_43_id_RANfunctionID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_43_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_43_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_44_id_RICcallProcessID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_44_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICcallProcessID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_44_optional },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_45_id_Cause },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_45_ignore },
+	{ "&Value", aioc__type, &asn_DEF_Cause },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_45_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_46_id_RICcontrolOutcome },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_46_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICcontrolOutcome },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_46_optional }
+};
+static const asn_ioc_set_t asn_IOS_RICcontrolFailure_IEs_1[] = {
+	{ 5, 4, asn_IOS_RICcontrolFailure_IEs_1_rows }
+};
+static const long asn_VAL_47_id_RICrequestID = 29;
+static const long asn_VAL_47_reject = 0;
+static const long asn_VAL_47_optional = 0;
+static const long asn_VAL_48_id_RANfunctionID = 5;
+static const long asn_VAL_48_reject = 0;
+static const long asn_VAL_48_optional = 0;
+static const long asn_VAL_49_id_Cause = 1;
+static const long asn_VAL_49_ignore = 1;
+static const long asn_VAL_49_optional = 0;
+static const long asn_VAL_50_id_CriticalityDiagnostics = 2;
+static const long asn_VAL_50_ignore = 1;
+static const long asn_VAL_50_optional = 0;
+static const asn_ioc_cell_t asn_IOS_ErrorIndication_IEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_47_id_RICrequestID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_47_reject },
+	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_47_optional },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_48_id_RANfunctionID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_48_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_48_optional },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_49_id_Cause },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_49_ignore },
+	{ "&Value", aioc__type, &asn_DEF_Cause },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_49_optional },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_50_id_CriticalityDiagnostics },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_50_ignore },
+	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_50_optional }
+};
+static const asn_ioc_set_t asn_IOS_ErrorIndication_IEs_1[] = {
+	{ 4, 4, asn_IOS_ErrorIndication_IEs_1_rows }
+};
+static const long asn_VAL_51_id_GlobalE2node_ID = 3;
+static const long asn_VAL_51_reject = 0;
+static const long asn_VAL_51_mandatory = 2;
+static const long asn_VAL_52_id_RANfunctionsAdded = 10;
+static const long asn_VAL_52_reject = 0;
+static const long asn_VAL_52_optional = 0;
+static const asn_ioc_cell_t asn_IOS_E2setupRequestIEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_51_id_GlobalE2node_ID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_51_reject },
+	{ "&Value", aioc__type, &asn_DEF_GlobalE2node_ID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_51_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_52_id_RANfunctionsAdded },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_52_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctions_List },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_52_optional }
+};
+static const asn_ioc_set_t asn_IOS_E2setupRequestIEs_1[] = {
+	{ 2, 4, asn_IOS_E2setupRequestIEs_1_rows }
+};
+static const long asn_VAL_53_id_GlobalRIC_ID = 4;
+static const long asn_VAL_53_reject = 0;
+static const long asn_VAL_53_mandatory = 2;
+static const long asn_VAL_54_id_RANfunctionsAccepted = 9;
+static const long asn_VAL_54_reject = 0;
+static const long asn_VAL_54_optional = 0;
+static const long asn_VAL_55_id_RANfunctionsRejected = 13;
+static const long asn_VAL_55_reject = 0;
+static const long asn_VAL_55_optional = 0;
+static const asn_ioc_cell_t asn_IOS_E2setupResponseIEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_53_id_GlobalRIC_ID },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_53_reject },
+	{ "&Value", aioc__type, &asn_DEF_GlobalRIC_ID },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_53_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_54_id_RANfunctionsAccepted },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_54_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionsID_List },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_54_optional },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_55_id_RANfunctionsRejected },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_55_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionsIDcause_List },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_55_optional }
+};
+static const asn_ioc_set_t asn_IOS_E2setupResponseIEs_1[] = {
+	{ 3, 4, asn_IOS_E2setupResponseIEs_1_rows }
+};
+static const long asn_VAL_56_id_Cause = 1;
+static const long asn_VAL_56_ignore = 1;
+static const long asn_VAL_56_mandatory = 2;
+static const long asn_VAL_57_id_TimeToWait = 31;
+static const long asn_VAL_57_ignore = 1;
+static const long asn_VAL_57_optional = 0;
+static const long asn_VAL_58_id_CriticalityDiagnostics = 2;
+static const long asn_VAL_58_ignore = 1;
+static const long asn_VAL_58_optional = 0;
+static const asn_ioc_cell_t asn_IOS_E2setupFailureIEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_56_id_Cause },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_56_ignore },
+	{ "&Value", aioc__type, &asn_DEF_Cause },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_56_mandatory },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_57_id_TimeToWait },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_57_ignore },
+	{ "&Value", aioc__type, &asn_DEF_TimeToWait },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_57_optional },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_58_id_CriticalityDiagnostics },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_58_ignore },
+	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_58_optional }
+};
+static const asn_ioc_set_t asn_IOS_E2setupFailureIEs_1[] = {
+	{ 3, 4, asn_IOS_E2setupFailureIEs_1_rows }
+};
+static const long asn_VAL_59_id_Cause = 1;
+static const long asn_VAL_59_ignore = 1;
+static const long asn_VAL_59_mandatory = 2;
+static const asn_ioc_cell_t asn_IOS_ResetRequestIEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_59_id_Cause },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_59_ignore },
+	{ "&Value", aioc__type, &asn_DEF_Cause },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_59_mandatory }
+};
+static const asn_ioc_set_t asn_IOS_ResetRequestIEs_1[] = {
+	{ 1, 4, asn_IOS_ResetRequestIEs_1_rows }
+};
+static const long asn_VAL_60_id_CriticalityDiagnostics = 2;
+static const long asn_VAL_60_ignore = 1;
+static const long asn_VAL_60_optional = 0;
+static const asn_ioc_cell_t asn_IOS_ResetResponseIEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_60_id_CriticalityDiagnostics },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_60_ignore },
+	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_60_optional }
+};
+static const asn_ioc_set_t asn_IOS_ResetResponseIEs_1[] = {
+	{ 1, 4, asn_IOS_ResetResponseIEs_1_rows }
+};
+static const long asn_VAL_61_id_RANfunctionsAdded = 10;
+static const long asn_VAL_61_reject = 0;
+static const long asn_VAL_61_optional = 0;
+static const long asn_VAL_62_id_RANfunctionsModified = 12;
+static const long asn_VAL_62_reject = 0;
+static const long asn_VAL_62_optional = 0;
+static const long asn_VAL_63_id_RANfunctionsDeleted = 11;
+static const long asn_VAL_63_reject = 0;
+static const long asn_VAL_63_optional = 0;
+static const asn_ioc_cell_t asn_IOS_RICserviceUpdate_IEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_61_id_RANfunctionsAdded },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_61_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctions_List },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_61_optional },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_62_id_RANfunctionsModified },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_62_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctions_List },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_62_optional },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_63_id_RANfunctionsDeleted },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_63_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionsID_List },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_63_optional }
+};
+static const asn_ioc_set_t asn_IOS_RICserviceUpdate_IEs_1[] = {
+	{ 3, 4, asn_IOS_RICserviceUpdate_IEs_1_rows }
+};
+static const long asn_VAL_66_id_RANfunctionsAccepted = 9;
+static const long asn_VAL_66_reject = 0;
+static const long asn_VAL_66_optional = 0;
+static const long asn_VAL_67_id_RANfunctionsRejected = 13;
+static const long asn_VAL_67_reject = 0;
+static const long asn_VAL_67_optional = 0;
+static const asn_ioc_cell_t asn_IOS_RICserviceUpdateAcknowledge_IEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_66_id_RANfunctionsAccepted },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_66_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionsID_List },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_66_optional },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_67_id_RANfunctionsRejected },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_67_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionsIDcause_List },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_67_optional }
+};
+static const asn_ioc_set_t asn_IOS_RICserviceUpdateAcknowledge_IEs_1[] = {
+	{ 2, 4, asn_IOS_RICserviceUpdateAcknowledge_IEs_1_rows }
+};
+static const long asn_VAL_69_id_RANfunctionsRejected = 13;
+static const long asn_VAL_69_ignore = 1;
+static const long asn_VAL_69_optional = 0;
+static const long asn_VAL_70_id_TimeToWait = 31;
+static const long asn_VAL_70_ignore = 1;
+static const long asn_VAL_70_optional = 0;
+static const long asn_VAL_71_id_CriticalityDiagnostics = 2;
+static const long asn_VAL_71_ignore = 1;
+static const long asn_VAL_71_optional = 0;
+static const asn_ioc_cell_t asn_IOS_RICserviceUpdateFailure_IEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_69_id_RANfunctionsRejected },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_69_ignore },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionsIDcause_List },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_69_optional },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_70_id_TimeToWait },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_70_ignore },
+	{ "&Value", aioc__type, &asn_DEF_TimeToWait },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_70_optional },
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_71_id_CriticalityDiagnostics },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_71_ignore },
+	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_71_optional }
+};
+static const asn_ioc_set_t asn_IOS_RICserviceUpdateFailure_IEs_1[] = {
+	{ 3, 4, asn_IOS_RICserviceUpdateFailure_IEs_1_rows }
+};
+static const long asn_VAL_72_id_RANfunctionsAccepted = 9;
+static const long asn_VAL_72_reject = 0;
+static const long asn_VAL_72_optional = 0;
+static const asn_ioc_cell_t asn_IOS_RICserviceQuery_IEs_1_rows[] = {
+	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_72_id_RANfunctionsAccepted },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_72_reject },
+	{ "&Value", aioc__type, &asn_DEF_RANfunctionsID_List },
+	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_72_optional }
+};
+static const asn_ioc_set_t asn_IOS_RICserviceQuery_IEs_1[] = {
+	{ 1, 4, asn_IOS_RICserviceQuery_IEs_1_rows }
+};
+static int
+memb_id_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICaction_ToBeSetup_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICaction_ToBeSetup_ItemIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_ToBeSetup_ItemIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICaction_ToBeSetup_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICaction_ToBeSetup_ItemIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_ToBeSetup_ItemIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICaction_Admitted_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICaction_Admitted_ItemIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_Admitted_ItemIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICaction_Admitted_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICaction_Admitted_ItemIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_Admitted_ItemIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICaction_NotAdmitted_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICaction_NotAdmitted_ItemIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_NotAdmitted_ItemIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICaction_NotAdmitted_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICaction_NotAdmitted_ItemIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_NotAdmitted_ItemIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RANfunction_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RANfunction_ItemIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunction_ItemIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RANfunction_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RANfunction_ItemIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunction_ItemIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RANfunctionID_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RANfunctionID_ItemIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionID_ItemIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RANfunctionID_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RANfunctionID_ItemIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionID_ItemIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RANfunctionIDcause_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RANfunctionIDcause_ItemIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionIDcause_ItemIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RANfunctionIDcause_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RANfunctionIDcause_ItemIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionIDcause_ItemIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICsubscriptionRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionRequest_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionRequest_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICsubscriptionRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionRequest_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionRequest_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICsubscriptionResponse_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionResponse_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionResponse_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICsubscriptionResponse_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionResponse_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionResponse_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICsubscriptionFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionFailure_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionFailure_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICsubscriptionFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionFailure_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionFailure_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICsubscriptionDeleteRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteRequest_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteRequest_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICsubscriptionDeleteRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteRequest_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteRequest_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICsubscriptionDeleteResponse_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteResponse_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteResponse_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICsubscriptionDeleteResponse_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteResponse_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteResponse_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICsubscriptionDeleteFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteFailure_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteFailure_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICsubscriptionDeleteFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteFailure_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteFailure_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICindication_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICindication_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICindication_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICindication_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICindication_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICindication_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICcontrolRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICcontrolRequest_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolRequest_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICcontrolRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICcontrolRequest_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolRequest_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICcontrolAcknowledge_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICcontrolAcknowledge_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolAcknowledge_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICcontrolAcknowledge_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICcontrolAcknowledge_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolAcknowledge_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICcontrolFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICcontrolFailure_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolFailure_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICcontrolFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICcontrolFailure_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolFailure_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_ErrorIndication_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_ErrorIndication_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ErrorIndication_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_ErrorIndication_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_ErrorIndication_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ErrorIndication_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_E2setupRequestIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_E2setupRequestIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupRequestIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_E2setupRequestIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_E2setupRequestIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupRequestIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_E2setupResponseIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_E2setupResponseIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupResponseIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_E2setupResponseIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_E2setupResponseIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupResponseIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_E2setupFailureIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_E2setupFailureIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupFailureIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_E2setupFailureIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_E2setupFailureIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupFailureIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_ResetRequestIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_ResetRequestIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetRequestIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_ResetRequestIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_ResetRequestIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetRequestIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_ResetResponseIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_ResetResponseIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetResponseIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_ResetResponseIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_ResetResponseIEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetResponseIEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICserviceUpdate_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdate_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdate_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICserviceUpdate_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdate_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdate_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICserviceUpdateAcknowledge_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateAcknowledge_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateAcknowledge_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICserviceUpdateAcknowledge_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateAcknowledge_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateAcknowledge_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICserviceUpdateFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateFailure_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateFailure_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICserviceUpdateFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateFailure_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateFailure_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static int
+memb_id_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_RICserviceQuery_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICserviceQuery_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 1; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceQuery_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_RICserviceQuery_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_RICserviceQuery_IEs_1;
+	size_t constraining_column = 0; /* &id */
+	size_t for_column = 2; /* &Value */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceQuery_IEs, id));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_per_constraints_t asn_PER_memb_id_constr_2 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_6 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_7 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_8 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_10 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_11 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_12 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_14 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_15 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_16 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_18 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_19 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_20 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_22 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_23 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_24 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_26 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_27 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_28 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_30 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_31 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_32 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_34 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_35 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_36 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_38 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_39 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_40 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_42 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_43 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_44 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_46 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_47 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_48 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_50 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_51 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_52 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_54 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_55 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_56 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_58 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_59 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_60 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_62 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_63 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_64 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_66 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_67 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_68 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_70 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_71 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_72 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_74 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_75 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_76 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_78 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_79 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_80 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_82 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_83 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_84 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_86 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_87 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_88 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_90 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_91 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_92 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_94 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_95 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_96 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_98 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_99 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_100 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_id_constr_102 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_103 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_104 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_value_4[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs__value, choice.RICaction_ToBeSetup_Item),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICaction_ToBeSetup_Item,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICaction-ToBeSetup-Item"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICaction-ToBeSetup-Item */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = {
+	sizeof(struct RICaction_ToBeSetup_ItemIEs__value),
+	offsetof(struct RICaction_ToBeSetup_ItemIEs__value, _asn_ctx),
+	offsetof(struct RICaction_ToBeSetup_ItemIEs__value, present),
+	sizeof(((struct RICaction_ToBeSetup_ItemIEs__value *)0)->present),
+	asn_MAP_value_tag2el_4,
+	1,	/* Count of tags in the map */
+	0, 0,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_4 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_4,
+	1,	/* Elements count */
+	&asn_SPC_value_specs_4	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_ItemIEs_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_2,  memb_id_constraint_1 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICaction_ToBeSetup_ItemIEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_3,  memb_criticality_constraint_1 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_4,
+		select_RICaction_ToBeSetup_ItemIEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_4,  memb_value_constraint_1 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICaction_ToBeSetup_ItemIEs_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1 = {
+	sizeof(struct RICaction_ToBeSetup_ItemIEs),
+	offsetof(struct RICaction_ToBeSetup_ItemIEs, _asn_ctx),
+	asn_MAP_RICaction_ToBeSetup_ItemIEs_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_ItemIEs = {
+	"RICaction-ToBeSetup-ItemIEs",
+	"RICaction-ToBeSetup-ItemIEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1,
+	sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1)
+		/sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1[0]), /* 1 */
+	asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1)
+		/sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICaction_ToBeSetup_ItemIEs_1,
+	3,	/* Elements count */
+	&asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_8[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs__value, choice.RICaction_Admitted_Item),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICaction_Admitted_Item,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICaction-Admitted-Item"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_8[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICaction-Admitted-Item */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_8 = {
+	sizeof(struct RICaction_Admitted_ItemIEs__value),
+	offsetof(struct RICaction_Admitted_ItemIEs__value, _asn_ctx),
+	offsetof(struct RICaction_Admitted_ItemIEs__value, present),
+	sizeof(((struct RICaction_Admitted_ItemIEs__value *)0)->present),
+	asn_MAP_value_tag2el_8,
+	1,	/* Count of tags in the map */
+	0, 0,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_8 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_8,
+	1,	/* Elements count */
+	&asn_SPC_value_specs_8	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICaction_Admitted_ItemIEs_5[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_6,  memb_id_constraint_5 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICaction_Admitted_ItemIEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_7,  memb_criticality_constraint_5 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_8,
+		select_RICaction_Admitted_ItemIEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_8,  memb_value_constraint_5 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICaction_Admitted_ItemIEs_tags_5[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICaction_Admitted_ItemIEs_tag2el_5[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICaction_Admitted_ItemIEs_specs_5 = {
+	sizeof(struct RICaction_Admitted_ItemIEs),
+	offsetof(struct RICaction_Admitted_ItemIEs, _asn_ctx),
+	asn_MAP_RICaction_Admitted_ItemIEs_tag2el_5,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_ItemIEs = {
+	"RICaction-Admitted-ItemIEs",
+	"RICaction-Admitted-ItemIEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICaction_Admitted_ItemIEs_tags_5,
+	sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5)
+		/sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5[0]), /* 1 */
+	asn_DEF_RICaction_Admitted_ItemIEs_tags_5,	/* Same as above */
+	sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5)
+		/sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICaction_Admitted_ItemIEs_5,
+	3,	/* Elements count */
+	&asn_SPC_RICaction_Admitted_ItemIEs_specs_5	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_12[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs__value, choice.RICaction_NotAdmitted_Item),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICaction_NotAdmitted_Item,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICaction-NotAdmitted-Item"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_12[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICaction-NotAdmitted-Item */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_12 = {
+	sizeof(struct RICaction_NotAdmitted_ItemIEs__value),
+	offsetof(struct RICaction_NotAdmitted_ItemIEs__value, _asn_ctx),
+	offsetof(struct RICaction_NotAdmitted_ItemIEs__value, present),
+	sizeof(((struct RICaction_NotAdmitted_ItemIEs__value *)0)->present),
+	asn_MAP_value_tag2el_12,
+	1,	/* Count of tags in the map */
+	0, 0,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_12 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_12,
+	1,	/* Elements count */
+	&asn_SPC_value_specs_12	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_ItemIEs_9[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_10,  memb_id_constraint_9 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICaction_NotAdmitted_ItemIEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_11,  memb_criticality_constraint_9 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_12,
+		select_RICaction_NotAdmitted_ItemIEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_12,  memb_value_constraint_9 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICaction_NotAdmitted_ItemIEs_tag2el_9[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9 = {
+	sizeof(struct RICaction_NotAdmitted_ItemIEs),
+	offsetof(struct RICaction_NotAdmitted_ItemIEs, _asn_ctx),
+	asn_MAP_RICaction_NotAdmitted_ItemIEs_tag2el_9,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_ItemIEs = {
+	"RICaction-NotAdmitted-ItemIEs",
+	"RICaction-NotAdmitted-ItemIEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9,
+	sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9)
+		/sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9[0]), /* 1 */
+	asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9,	/* Same as above */
+	sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9)
+		/sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICaction_NotAdmitted_ItemIEs_9,
+	3,	/* Elements count */
+	&asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_16[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs__value, choice.RANfunction_Item),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RANfunction_Item,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunction-Item"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_16[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunction-Item */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_16 = {
+	sizeof(struct RANfunction_ItemIEs__value),
+	offsetof(struct RANfunction_ItemIEs__value, _asn_ctx),
+	offsetof(struct RANfunction_ItemIEs__value, present),
+	sizeof(((struct RANfunction_ItemIEs__value *)0)->present),
+	asn_MAP_value_tag2el_16,
+	1,	/* Count of tags in the map */
+	0, 0,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_16 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_16,
+	1,	/* Elements count */
+	&asn_SPC_value_specs_16	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RANfunction_ItemIEs_13[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_14,  memb_id_constraint_13 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RANfunction_ItemIEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_15,  memb_criticality_constraint_13 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_16,
+		select_RANfunction_ItemIEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_16,  memb_value_constraint_13 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANfunction_ItemIEs_tags_13[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANfunction_ItemIEs_tag2el_13[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RANfunction_ItemIEs_specs_13 = {
+	sizeof(struct RANfunction_ItemIEs),
+	offsetof(struct RANfunction_ItemIEs, _asn_ctx),
+	asn_MAP_RANfunction_ItemIEs_tag2el_13,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RANfunction_ItemIEs = {
+	"RANfunction-ItemIEs",
+	"RANfunction-ItemIEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RANfunction_ItemIEs_tags_13,
+	sizeof(asn_DEF_RANfunction_ItemIEs_tags_13)
+		/sizeof(asn_DEF_RANfunction_ItemIEs_tags_13[0]), /* 1 */
+	asn_DEF_RANfunction_ItemIEs_tags_13,	/* Same as above */
+	sizeof(asn_DEF_RANfunction_ItemIEs_tags_13)
+		/sizeof(asn_DEF_RANfunction_ItemIEs_tags_13[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RANfunction_ItemIEs_13,
+	3,	/* Elements count */
+	&asn_SPC_RANfunction_ItemIEs_specs_13	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_20[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs__value, choice.RANfunctionID_Item),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RANfunctionID_Item,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionID-Item"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_20[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunctionID-Item */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_20 = {
+	sizeof(struct RANfunctionID_ItemIEs__value),
+	offsetof(struct RANfunctionID_ItemIEs__value, _asn_ctx),
+	offsetof(struct RANfunctionID_ItemIEs__value, present),
+	sizeof(((struct RANfunctionID_ItemIEs__value *)0)->present),
+	asn_MAP_value_tag2el_20,
+	1,	/* Count of tags in the map */
+	0, 0,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_20 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_20,
+	1,	/* Elements count */
+	&asn_SPC_value_specs_20	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RANfunctionID_ItemIEs_17[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_18,  memb_id_constraint_17 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RANfunctionID_ItemIEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_19,  memb_criticality_constraint_17 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_20,
+		select_RANfunctionID_ItemIEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_20,  memb_value_constraint_17 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANfunctionID_ItemIEs_tags_17[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANfunctionID_ItemIEs_tag2el_17[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RANfunctionID_ItemIEs_specs_17 = {
+	sizeof(struct RANfunctionID_ItemIEs),
+	offsetof(struct RANfunctionID_ItemIEs, _asn_ctx),
+	asn_MAP_RANfunctionID_ItemIEs_tag2el_17,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RANfunctionID_ItemIEs = {
+	"RANfunctionID-ItemIEs",
+	"RANfunctionID-ItemIEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RANfunctionID_ItemIEs_tags_17,
+	sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17)
+		/sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17[0]), /* 1 */
+	asn_DEF_RANfunctionID_ItemIEs_tags_17,	/* Same as above */
+	sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17)
+		/sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RANfunctionID_ItemIEs_17,
+	3,	/* Elements count */
+	&asn_SPC_RANfunctionID_ItemIEs_specs_17	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_24[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs__value, choice.RANfunctionIDcause_Item),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RANfunctionIDcause_Item,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionIDcause-Item"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_24[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunctionIDcause-Item */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_24 = {
+	sizeof(struct RANfunctionIDcause_ItemIEs__value),
+	offsetof(struct RANfunctionIDcause_ItemIEs__value, _asn_ctx),
+	offsetof(struct RANfunctionIDcause_ItemIEs__value, present),
+	sizeof(((struct RANfunctionIDcause_ItemIEs__value *)0)->present),
+	asn_MAP_value_tag2el_24,
+	1,	/* Count of tags in the map */
+	0, 0,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_24 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_24,
+	1,	/* Elements count */
+	&asn_SPC_value_specs_24	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RANfunctionIDcause_ItemIEs_21[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_22,  memb_id_constraint_21 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RANfunctionIDcause_ItemIEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_23,  memb_criticality_constraint_21 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_24,
+		select_RANfunctionIDcause_ItemIEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_24,  memb_value_constraint_21 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANfunctionIDcause_ItemIEs_tags_21[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANfunctionIDcause_ItemIEs_tag2el_21[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RANfunctionIDcause_ItemIEs_specs_21 = {
+	sizeof(struct RANfunctionIDcause_ItemIEs),
+	offsetof(struct RANfunctionIDcause_ItemIEs, _asn_ctx),
+	asn_MAP_RANfunctionIDcause_ItemIEs_tag2el_21,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_ItemIEs = {
+	"RANfunctionIDcause-ItemIEs",
+	"RANfunctionIDcause-ItemIEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RANfunctionIDcause_ItemIEs_tags_21,
+	sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21)
+		/sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21[0]), /* 1 */
+	asn_DEF_RANfunctionIDcause_ItemIEs_tags_21,	/* Same as above */
+	sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21)
+		/sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RANfunctionIDcause_ItemIEs_21,
+	3,	/* Elements count */
+	&asn_SPC_RANfunctionIDcause_ItemIEs_specs_21	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_28[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RICrequestID),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICrequestID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICrequestID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RANfunctionID),
+		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
+		0,
+		&asn_DEF_RANfunctionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RICsubscriptionDetails),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICsubscriptionDetails,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICsubscriptionDetails"
+		},
+};
+static const unsigned asn_MAP_value_to_canonical_28[] = { 1, 0, 2 };
+static const unsigned asn_MAP_value_from_canonical_28[] = { 1, 0, 2 };
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_28[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RICrequestID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 } /* RICsubscriptionDetails */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_28 = {
+	sizeof(struct RICsubscriptionRequest_IEs__value),
+	offsetof(struct RICsubscriptionRequest_IEs__value, _asn_ctx),
+	offsetof(struct RICsubscriptionRequest_IEs__value, present),
+	sizeof(((struct RICsubscriptionRequest_IEs__value *)0)->present),
+	asn_MAP_value_tag2el_28,
+	3,	/* Count of tags in the map */
+	asn_MAP_value_to_canonical_28,
+	asn_MAP_value_from_canonical_28,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_28 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_28,
+	3,	/* Elements count */
+	&asn_SPC_value_specs_28	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_IEs_25[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_26,  memb_id_constraint_25 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICsubscriptionRequest_IEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_27,  memb_criticality_constraint_25 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_28,
+		select_RICsubscriptionRequest_IEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_28,  memb_value_constraint_25 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICsubscriptionRequest_IEs_tags_25[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionRequest_IEs_tag2el_25[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_IEs_specs_25 = {
+	sizeof(struct RICsubscriptionRequest_IEs),
+	offsetof(struct RICsubscriptionRequest_IEs, _asn_ctx),
+	asn_MAP_RICsubscriptionRequest_IEs_tag2el_25,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest_IEs = {
+	"RICsubscriptionRequest-IEs",
+	"RICsubscriptionRequest-IEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICsubscriptionRequest_IEs_tags_25,
+	sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_25)
+		/sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_25[0]), /* 1 */
+	asn_DEF_RICsubscriptionRequest_IEs_tags_25,	/* Same as above */
+	sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_25)
+		/sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_25[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICsubscriptionRequest_IEs_25,
+	3,	/* Elements count */
+	&asn_SPC_RICsubscriptionRequest_IEs_specs_25	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_32[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RICrequestID),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICrequestID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICrequestID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RANfunctionID),
+		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
+		0,
+		&asn_DEF_RANfunctionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RICaction_Admitted_List),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICaction_Admitted_List,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICaction-Admitted-List"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RICaction_NotAdmitted_List),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICaction_NotAdmitted_List,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICaction-NotAdmitted-List"
+		},
+};
+static const unsigned asn_MAP_value_to_canonical_32[] = { 1, 0, 2, 3 };
+static const unsigned asn_MAP_value_from_canonical_32[] = { 1, 0, 2, 3 };
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_32[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 2 }, /* RICrequestID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 1 }, /* RICaction-Admitted-List */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -2, 0 } /* RICaction-NotAdmitted-List */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_32 = {
+	sizeof(struct RICsubscriptionResponse_IEs__value),
+	offsetof(struct RICsubscriptionResponse_IEs__value, _asn_ctx),
+	offsetof(struct RICsubscriptionResponse_IEs__value, present),
+	sizeof(((struct RICsubscriptionResponse_IEs__value *)0)->present),
+	asn_MAP_value_tag2el_32,
+	4,	/* Count of tags in the map */
+	asn_MAP_value_to_canonical_32,
+	asn_MAP_value_from_canonical_32,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_32 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_32,
+	4,	/* Elements count */
+	&asn_SPC_value_specs_32	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_IEs_29[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_30,  memb_id_constraint_29 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICsubscriptionResponse_IEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_31,  memb_criticality_constraint_29 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_32,
+		select_RICsubscriptionResponse_IEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_32,  memb_value_constraint_29 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICsubscriptionResponse_IEs_tags_29[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionResponse_IEs_tag2el_29[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_IEs_specs_29 = {
+	sizeof(struct RICsubscriptionResponse_IEs),
+	offsetof(struct RICsubscriptionResponse_IEs, _asn_ctx),
+	asn_MAP_RICsubscriptionResponse_IEs_tag2el_29,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse_IEs = {
+	"RICsubscriptionResponse-IEs",
+	"RICsubscriptionResponse-IEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICsubscriptionResponse_IEs_tags_29,
+	sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_29)
+		/sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_29[0]), /* 1 */
+	asn_DEF_RICsubscriptionResponse_IEs_tags_29,	/* Same as above */
+	sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_29)
+		/sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_29[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICsubscriptionResponse_IEs_29,
+	3,	/* Elements count */
+	&asn_SPC_RICsubscriptionResponse_IEs_specs_29	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_36[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RICrequestID),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICrequestID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICrequestID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RANfunctionID),
+		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
+		0,
+		&asn_DEF_RANfunctionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RICaction_NotAdmitted_List),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICaction_NotAdmitted_List,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICaction-NotAdmitted-List"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.CriticalityDiagnostics),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_CriticalityDiagnostics,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"CriticalityDiagnostics"
+		},
+};
+static const unsigned asn_MAP_value_to_canonical_36[] = { 1, 0, 2, 3 };
+static const unsigned asn_MAP_value_from_canonical_36[] = { 1, 0, 2, 3 };
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_36[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 2 }, /* RICrequestID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 1 }, /* RICaction-NotAdmitted-List */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -2, 0 } /* CriticalityDiagnostics */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_36 = {
+	sizeof(struct RICsubscriptionFailure_IEs__value),
+	offsetof(struct RICsubscriptionFailure_IEs__value, _asn_ctx),
+	offsetof(struct RICsubscriptionFailure_IEs__value, present),
+	sizeof(((struct RICsubscriptionFailure_IEs__value *)0)->present),
+	asn_MAP_value_tag2el_36,
+	4,	/* Count of tags in the map */
+	asn_MAP_value_to_canonical_36,
+	asn_MAP_value_from_canonical_36,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_36 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_36,
+	4,	/* Elements count */
+	&asn_SPC_value_specs_36	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_IEs_33[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_34,  memb_id_constraint_33 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICsubscriptionFailure_IEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_35,  memb_criticality_constraint_33 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_36,
+		select_RICsubscriptionFailure_IEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_36,  memb_value_constraint_33 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICsubscriptionFailure_IEs_tags_33[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionFailure_IEs_tag2el_33[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_IEs_specs_33 = {
+	sizeof(struct RICsubscriptionFailure_IEs),
+	offsetof(struct RICsubscriptionFailure_IEs, _asn_ctx),
+	asn_MAP_RICsubscriptionFailure_IEs_tag2el_33,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure_IEs = {
+	"RICsubscriptionFailure-IEs",
+	"RICsubscriptionFailure-IEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICsubscriptionFailure_IEs_tags_33,
+	sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_33)
+		/sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_33[0]), /* 1 */
+	asn_DEF_RICsubscriptionFailure_IEs_tags_33,	/* Same as above */
+	sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_33)
+		/sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_33[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICsubscriptionFailure_IEs_33,
+	3,	/* Elements count */
+	&asn_SPC_RICsubscriptionFailure_IEs_specs_33	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_40[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs__value, choice.RICrequestID),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICrequestID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICrequestID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs__value, choice.RANfunctionID),
+		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
+		0,
+		&asn_DEF_RANfunctionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionID"
+		},
+};
+static const unsigned asn_MAP_value_to_canonical_40[] = { 1, 0 };
+static const unsigned asn_MAP_value_from_canonical_40[] = { 1, 0 };
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_40[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_40 = {
+	sizeof(struct RICsubscriptionDeleteRequest_IEs__value),
+	offsetof(struct RICsubscriptionDeleteRequest_IEs__value, _asn_ctx),
+	offsetof(struct RICsubscriptionDeleteRequest_IEs__value, present),
+	sizeof(((struct RICsubscriptionDeleteRequest_IEs__value *)0)->present),
+	asn_MAP_value_tag2el_40,
+	2,	/* Count of tags in the map */
+	asn_MAP_value_to_canonical_40,
+	asn_MAP_value_from_canonical_40,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_40 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_40,
+	2,	/* Elements count */
+	&asn_SPC_value_specs_40	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_IEs_37[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_38,  memb_id_constraint_37 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICsubscriptionDeleteRequest_IEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_39,  memb_criticality_constraint_37 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_40,
+		select_RICsubscriptionDeleteRequest_IEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_40,  memb_value_constraint_37 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteRequest_IEs_tag2el_37[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_37 = {
+	sizeof(struct RICsubscriptionDeleteRequest_IEs),
+	offsetof(struct RICsubscriptionDeleteRequest_IEs, _asn_ctx),
+	asn_MAP_RICsubscriptionDeleteRequest_IEs_tag2el_37,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest_IEs = {
+	"RICsubscriptionDeleteRequest-IEs",
+	"RICsubscriptionDeleteRequest-IEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37,
+	sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37)
+		/sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37[0]), /* 1 */
+	asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37,	/* Same as above */
+	sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37)
+		/sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICsubscriptionDeleteRequest_IEs_37,
+	3,	/* Elements count */
+	&asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_37	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_44[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs__value, choice.RICrequestID),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICrequestID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICrequestID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs__value, choice.RANfunctionID),
+		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
+		0,
+		&asn_DEF_RANfunctionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionID"
+		},
+};
+static const unsigned asn_MAP_value_to_canonical_44[] = { 1, 0 };
+static const unsigned asn_MAP_value_from_canonical_44[] = { 1, 0 };
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_44[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_44 = {
+	sizeof(struct RICsubscriptionDeleteResponse_IEs__value),
+	offsetof(struct RICsubscriptionDeleteResponse_IEs__value, _asn_ctx),
+	offsetof(struct RICsubscriptionDeleteResponse_IEs__value, present),
+	sizeof(((struct RICsubscriptionDeleteResponse_IEs__value *)0)->present),
+	asn_MAP_value_tag2el_44,
+	2,	/* Count of tags in the map */
+	asn_MAP_value_to_canonical_44,
+	asn_MAP_value_from_canonical_44,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_44 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_44,
+	2,	/* Elements count */
+	&asn_SPC_value_specs_44	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_IEs_41[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_42,  memb_id_constraint_41 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICsubscriptionDeleteResponse_IEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_43,  memb_criticality_constraint_41 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_44,
+		select_RICsubscriptionDeleteResponse_IEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_44,  memb_value_constraint_41 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteResponse_IEs_tag2el_41[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_41 = {
+	sizeof(struct RICsubscriptionDeleteResponse_IEs),
+	offsetof(struct RICsubscriptionDeleteResponse_IEs, _asn_ctx),
+	asn_MAP_RICsubscriptionDeleteResponse_IEs_tag2el_41,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse_IEs = {
+	"RICsubscriptionDeleteResponse-IEs",
+	"RICsubscriptionDeleteResponse-IEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41,
+	sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41)
+		/sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41[0]), /* 1 */
+	asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41,	/* Same as above */
+	sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41)
+		/sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICsubscriptionDeleteResponse_IEs_41,
+	3,	/* Elements count */
+	&asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_41	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_48[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.RICrequestID),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICrequestID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICrequestID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.RANfunctionID),
+		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
+		0,
+		&asn_DEF_RANfunctionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.Cause),
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_Cause,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"Cause"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.CriticalityDiagnostics),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_CriticalityDiagnostics,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"CriticalityDiagnostics"
+		},
+};
+static const unsigned asn_MAP_value_to_canonical_48[] = { 1, 0, 3, 2 };
+static const unsigned asn_MAP_value_from_canonical_48[] = { 1, 0, 3, 2 };
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_48[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RICrequestID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -1, 0 }, /* CriticalityDiagnostics */
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* ricRequest */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 2, 0, 0 }, /* ricService */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* transport */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* protocol */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 2, 0, 0 } /* misc */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_48 = {
+	sizeof(struct RICsubscriptionDeleteFailure_IEs__value),
+	offsetof(struct RICsubscriptionDeleteFailure_IEs__value, _asn_ctx),
+	offsetof(struct RICsubscriptionDeleteFailure_IEs__value, present),
+	sizeof(((struct RICsubscriptionDeleteFailure_IEs__value *)0)->present),
+	asn_MAP_value_tag2el_48,
+	8,	/* Count of tags in the map */
+	asn_MAP_value_to_canonical_48,
+	asn_MAP_value_from_canonical_48,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_48 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_48,
+	4,	/* Elements count */
+	&asn_SPC_value_specs_48	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_IEs_45[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_46,  memb_id_constraint_45 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICsubscriptionDeleteFailure_IEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_47,  memb_criticality_constraint_45 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_48,
+		select_RICsubscriptionDeleteFailure_IEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_48,  memb_value_constraint_45 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteFailure_IEs_tag2el_45[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_45 = {
+	sizeof(struct RICsubscriptionDeleteFailure_IEs),
+	offsetof(struct RICsubscriptionDeleteFailure_IEs, _asn_ctx),
+	asn_MAP_RICsubscriptionDeleteFailure_IEs_tag2el_45,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure_IEs = {
+	"RICsubscriptionDeleteFailure-IEs",
+	"RICsubscriptionDeleteFailure-IEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45,
+	sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45)
+		/sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45[0]), /* 1 */
+	asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45,	/* Same as above */
+	sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45)
+		/sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICsubscriptionDeleteFailure_IEs_45,
+	3,	/* Elements count */
+	&asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_45	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_52[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICrequestID),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICrequestID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICrequestID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RANfunctionID),
+		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
+		0,
+		&asn_DEF_RANfunctionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICactionID),
+		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
+		0,
+		&asn_DEF_RICactionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICactionID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationSN),
+		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
+		0,
+		&asn_DEF_RICindicationSN,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICindicationSN"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationType),
+		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
+		0,
+		&asn_DEF_RICindicationType,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICindicationType"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationHeader),
+		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
+		0,
+		&asn_DEF_RICindicationHeader,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICindicationHeader"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationMessage),
+		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
+		0,
+		&asn_DEF_RICindicationMessage,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICindicationMessage"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICcallProcessID),
+		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
+		0,
+		&asn_DEF_RICcallProcessID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICcallProcessID"
+		},
+};
+static const unsigned asn_MAP_value_to_canonical_52[] = { 1, 2, 3, 5, 6, 7, 4, 0 };
+static const unsigned asn_MAP_value_from_canonical_52[] = { 7, 0, 1, 2, 6, 3, 4, 5 };
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_52[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 2 }, /* RANfunctionID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 2, -1, 1 }, /* RICactionID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 3, -2, 0 }, /* RICindicationSN */
+    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 5, 0, 2 }, /* RICindicationHeader */
+    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 6, -1, 1 }, /* RICindicationMessage */
+    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 7, -2, 0 }, /* RICcallProcessID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 4, 0, 0 }, /* RICindicationType */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_52 = {
+	sizeof(struct RICindication_IEs__value),
+	offsetof(struct RICindication_IEs__value, _asn_ctx),
+	offsetof(struct RICindication_IEs__value, present),
+	sizeof(((struct RICindication_IEs__value *)0)->present),
+	asn_MAP_value_tag2el_52,
+	8,	/* Count of tags in the map */
+	asn_MAP_value_to_canonical_52,
+	asn_MAP_value_from_canonical_52,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_52 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_52,
+	8,	/* Elements count */
+	&asn_SPC_value_specs_52	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICindication_IEs_49[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_50,  memb_id_constraint_49 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICindication_IEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_51,  memb_criticality_constraint_49 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_52,
+		select_RICindication_IEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_52,  memb_value_constraint_49 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICindication_IEs_tags_49[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICindication_IEs_tag2el_49[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICindication_IEs_specs_49 = {
+	sizeof(struct RICindication_IEs),
+	offsetof(struct RICindication_IEs, _asn_ctx),
+	asn_MAP_RICindication_IEs_tag2el_49,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICindication_IEs = {
+	"RICindication-IEs",
+	"RICindication-IEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICindication_IEs_tags_49,
+	sizeof(asn_DEF_RICindication_IEs_tags_49)
+		/sizeof(asn_DEF_RICindication_IEs_tags_49[0]), /* 1 */
+	asn_DEF_RICindication_IEs_tags_49,	/* Same as above */
+	sizeof(asn_DEF_RICindication_IEs_tags_49)
+		/sizeof(asn_DEF_RICindication_IEs_tags_49[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICindication_IEs_49,
+	3,	/* Elements count */
+	&asn_SPC_RICindication_IEs_specs_49	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_56[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICrequestID),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICrequestID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICrequestID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RANfunctionID),
+		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
+		0,
+		&asn_DEF_RANfunctionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcallProcessID),
+		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
+		0,
+		&asn_DEF_RICcallProcessID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICcallProcessID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolHeader),
+		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
+		0,
+		&asn_DEF_RICcontrolHeader,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICcontrolHeader"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolMessage),
+		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
+		0,
+		&asn_DEF_RICcontrolMessage,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICcontrolMessage"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolAckRequest),
+		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
+		0,
+		&asn_DEF_RICcontrolAckRequest,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICcontrolAckRequest"
+		},
+};
+static const unsigned asn_MAP_value_to_canonical_56[] = { 1, 2, 3, 4, 5, 0 };
+static const unsigned asn_MAP_value_from_canonical_56[] = { 5, 0, 1, 2, 3, 4 };
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_56[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 2, 0, 2 }, /* RICcallProcessID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 3, -1, 1 }, /* RICcontrolHeader */
+    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 4, -2, 0 }, /* RICcontrolMessage */
+    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 5, 0, 0 }, /* RICcontrolAckRequest */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_56 = {
+	sizeof(struct RICcontrolRequest_IEs__value),
+	offsetof(struct RICcontrolRequest_IEs__value, _asn_ctx),
+	offsetof(struct RICcontrolRequest_IEs__value, present),
+	sizeof(((struct RICcontrolRequest_IEs__value *)0)->present),
+	asn_MAP_value_tag2el_56,
+	6,	/* Count of tags in the map */
+	asn_MAP_value_to_canonical_56,
+	asn_MAP_value_from_canonical_56,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_56 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_56,
+	6,	/* Elements count */
+	&asn_SPC_value_specs_56	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICcontrolRequest_IEs_53[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_54,  memb_id_constraint_53 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICcontrolRequest_IEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_55,  memb_criticality_constraint_53 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_56,
+		select_RICcontrolRequest_IEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_56,  memb_value_constraint_53 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICcontrolRequest_IEs_tags_53[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICcontrolRequest_IEs_tag2el_53[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_IEs_specs_53 = {
+	sizeof(struct RICcontrolRequest_IEs),
+	offsetof(struct RICcontrolRequest_IEs, _asn_ctx),
+	asn_MAP_RICcontrolRequest_IEs_tag2el_53,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest_IEs = {
+	"RICcontrolRequest-IEs",
+	"RICcontrolRequest-IEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICcontrolRequest_IEs_tags_53,
+	sizeof(asn_DEF_RICcontrolRequest_IEs_tags_53)
+		/sizeof(asn_DEF_RICcontrolRequest_IEs_tags_53[0]), /* 1 */
+	asn_DEF_RICcontrolRequest_IEs_tags_53,	/* Same as above */
+	sizeof(asn_DEF_RICcontrolRequest_IEs_tags_53)
+		/sizeof(asn_DEF_RICcontrolRequest_IEs_tags_53[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICcontrolRequest_IEs_53,
+	3,	/* Elements count */
+	&asn_SPC_RICcontrolRequest_IEs_specs_53	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_60[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICrequestID),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICrequestID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICrequestID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RANfunctionID),
+		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
+		0,
+		&asn_DEF_RANfunctionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcallProcessID),
+		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
+		0,
+		&asn_DEF_RICcallProcessID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICcallProcessID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcontrolStatus),
+		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
+		0,
+		&asn_DEF_RICcontrolStatus,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICcontrolStatus"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcontrolOutcome),
+		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
+		0,
+		&asn_DEF_RICcontrolOutcome,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICcontrolOutcome"
+		},
+};
+static const unsigned asn_MAP_value_to_canonical_60[] = { 1, 2, 4, 3, 0 };
+static const unsigned asn_MAP_value_from_canonical_60[] = { 4, 0, 1, 3, 2 };
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_60[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 2, 0, 1 }, /* RICcallProcessID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 4, -1, 0 }, /* RICcontrolOutcome */
+    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 3, 0, 0 }, /* RICcontrolStatus */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_60 = {
+	sizeof(struct RICcontrolAcknowledge_IEs__value),
+	offsetof(struct RICcontrolAcknowledge_IEs__value, _asn_ctx),
+	offsetof(struct RICcontrolAcknowledge_IEs__value, present),
+	sizeof(((struct RICcontrolAcknowledge_IEs__value *)0)->present),
+	asn_MAP_value_tag2el_60,
+	5,	/* Count of tags in the map */
+	asn_MAP_value_to_canonical_60,
+	asn_MAP_value_from_canonical_60,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_60 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_60,
+	5,	/* Elements count */
+	&asn_SPC_value_specs_60	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_IEs_57[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_58,  memb_id_constraint_57 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICcontrolAcknowledge_IEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_59,  memb_criticality_constraint_57 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_60,
+		select_RICcontrolAcknowledge_IEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_60,  memb_value_constraint_57 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICcontrolAcknowledge_IEs_tags_57[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICcontrolAcknowledge_IEs_tag2el_57[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_IEs_specs_57 = {
+	sizeof(struct RICcontrolAcknowledge_IEs),
+	offsetof(struct RICcontrolAcknowledge_IEs, _asn_ctx),
+	asn_MAP_RICcontrolAcknowledge_IEs_tag2el_57,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge_IEs = {
+	"RICcontrolAcknowledge-IEs",
+	"RICcontrolAcknowledge-IEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICcontrolAcknowledge_IEs_tags_57,
+	sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_57)
+		/sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_57[0]), /* 1 */
+	asn_DEF_RICcontrolAcknowledge_IEs_tags_57,	/* Same as above */
+	sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_57)
+		/sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_57[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICcontrolAcknowledge_IEs_57,
+	3,	/* Elements count */
+	&asn_SPC_RICcontrolAcknowledge_IEs_specs_57	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_64[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RICrequestID),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICrequestID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICrequestID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RANfunctionID),
+		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
+		0,
+		&asn_DEF_RANfunctionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RICcallProcessID),
+		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
+		0,
+		&asn_DEF_RICcallProcessID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICcallProcessID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.Cause),
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_Cause,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"Cause"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RICcontrolOutcome),
+		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
+		0,
+		&asn_DEF_RICcontrolOutcome,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICcontrolOutcome"
+		},
+};
+static const unsigned asn_MAP_value_to_canonical_64[] = { 1, 2, 4, 0, 3 };
+static const unsigned asn_MAP_value_from_canonical_64[] = { 3, 0, 1, 4, 2 };
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_64[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 2, 0, 1 }, /* RICcallProcessID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 4, -1, 0 }, /* RICcontrolOutcome */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 }, /* RICrequestID */
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 3, 0, 0 }, /* ricRequest */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 3, 0, 0 }, /* ricService */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 3, 0, 0 }, /* transport */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* protocol */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 3, 0, 0 } /* misc */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_64 = {
+	sizeof(struct RICcontrolFailure_IEs__value),
+	offsetof(struct RICcontrolFailure_IEs__value, _asn_ctx),
+	offsetof(struct RICcontrolFailure_IEs__value, present),
+	sizeof(((struct RICcontrolFailure_IEs__value *)0)->present),
+	asn_MAP_value_tag2el_64,
+	9,	/* Count of tags in the map */
+	asn_MAP_value_to_canonical_64,
+	asn_MAP_value_from_canonical_64,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_64 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_64,
+	5,	/* Elements count */
+	&asn_SPC_value_specs_64	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICcontrolFailure_IEs_61[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_62,  memb_id_constraint_61 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICcontrolFailure_IEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_63,  memb_criticality_constraint_61 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_64,
+		select_RICcontrolFailure_IEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_64,  memb_value_constraint_61 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICcontrolFailure_IEs_tags_61[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICcontrolFailure_IEs_tag2el_61[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_IEs_specs_61 = {
+	sizeof(struct RICcontrolFailure_IEs),
+	offsetof(struct RICcontrolFailure_IEs, _asn_ctx),
+	asn_MAP_RICcontrolFailure_IEs_tag2el_61,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure_IEs = {
+	"RICcontrolFailure-IEs",
+	"RICcontrolFailure-IEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICcontrolFailure_IEs_tags_61,
+	sizeof(asn_DEF_RICcontrolFailure_IEs_tags_61)
+		/sizeof(asn_DEF_RICcontrolFailure_IEs_tags_61[0]), /* 1 */
+	asn_DEF_RICcontrolFailure_IEs_tags_61,	/* Same as above */
+	sizeof(asn_DEF_RICcontrolFailure_IEs_tags_61)
+		/sizeof(asn_DEF_RICcontrolFailure_IEs_tags_61[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICcontrolFailure_IEs_61,
+	3,	/* Elements count */
+	&asn_SPC_RICcontrolFailure_IEs_specs_61	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_68[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.RICrequestID),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICrequestID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICrequestID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.RANfunctionID),
+		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
+		0,
+		&asn_DEF_RANfunctionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.Cause),
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_Cause,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"Cause"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.CriticalityDiagnostics),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_CriticalityDiagnostics,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"CriticalityDiagnostics"
+		},
+};
+static const unsigned asn_MAP_value_to_canonical_68[] = { 1, 0, 3, 2 };
+static const unsigned asn_MAP_value_from_canonical_68[] = { 1, 0, 3, 2 };
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_68[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RICrequestID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -1, 0 }, /* CriticalityDiagnostics */
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* ricRequest */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 2, 0, 0 }, /* ricService */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* transport */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* protocol */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 2, 0, 0 } /* misc */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_68 = {
+	sizeof(struct ErrorIndication_IEs__value),
+	offsetof(struct ErrorIndication_IEs__value, _asn_ctx),
+	offsetof(struct ErrorIndication_IEs__value, present),
+	sizeof(((struct ErrorIndication_IEs__value *)0)->present),
+	asn_MAP_value_tag2el_68,
+	8,	/* Count of tags in the map */
+	asn_MAP_value_to_canonical_68,
+	asn_MAP_value_from_canonical_68,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_68 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_68,
+	4,	/* Elements count */
+	&asn_SPC_value_specs_68	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ErrorIndication_IEs_65[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_66,  memb_id_constraint_65 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_ErrorIndication_IEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_67,  memb_criticality_constraint_65 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_68,
+		select_ErrorIndication_IEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_68,  memb_value_constraint_65 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ErrorIndication_IEs_tags_65[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_ErrorIndication_IEs_tag2el_65[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_ErrorIndication_IEs_specs_65 = {
+	sizeof(struct ErrorIndication_IEs),
+	offsetof(struct ErrorIndication_IEs, _asn_ctx),
+	asn_MAP_ErrorIndication_IEs_tag2el_65,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_ErrorIndication_IEs = {
+	"ErrorIndication-IEs",
+	"ErrorIndication-IEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_ErrorIndication_IEs_tags_65,
+	sizeof(asn_DEF_ErrorIndication_IEs_tags_65)
+		/sizeof(asn_DEF_ErrorIndication_IEs_tags_65[0]), /* 1 */
+	asn_DEF_ErrorIndication_IEs_tags_65,	/* Same as above */
+	sizeof(asn_DEF_ErrorIndication_IEs_tags_65)
+		/sizeof(asn_DEF_ErrorIndication_IEs_tags_65[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_ErrorIndication_IEs_65,
+	3,	/* Elements count */
+	&asn_SPC_ErrorIndication_IEs_specs_65	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_72[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs__value, choice.GlobalE2node_ID),
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_GlobalE2node_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"GlobalE2node-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs__value, choice.RANfunctions_List),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RANfunctions_List,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctions-List"
+		},
+};
+static const unsigned asn_MAP_value_to_canonical_72[] = { 1, 0 };
+static const unsigned asn_MAP_value_from_canonical_72[] = { 1, 0 };
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_72[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* RANfunctions-List */
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gNB */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* en-gNB */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 }, /* ng-eNB */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 } /* eNB */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_72 = {
+	sizeof(struct E2setupRequestIEs__value),
+	offsetof(struct E2setupRequestIEs__value, _asn_ctx),
+	offsetof(struct E2setupRequestIEs__value, present),
+	sizeof(((struct E2setupRequestIEs__value *)0)->present),
+	asn_MAP_value_tag2el_72,
+	5,	/* Count of tags in the map */
+	asn_MAP_value_to_canonical_72,
+	asn_MAP_value_from_canonical_72,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_72 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_72,
+	2,	/* Elements count */
+	&asn_SPC_value_specs_72	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_E2setupRequestIEs_69[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_70,  memb_id_constraint_69 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_E2setupRequestIEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_71,  memb_criticality_constraint_69 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_72,
+		select_E2setupRequestIEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_72,  memb_value_constraint_69 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2setupRequestIEs_tags_69[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2setupRequestIEs_tag2el_69[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2setupRequestIEs_specs_69 = {
+	sizeof(struct E2setupRequestIEs),
+	offsetof(struct E2setupRequestIEs, _asn_ctx),
+	asn_MAP_E2setupRequestIEs_tag2el_69,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2setupRequestIEs = {
+	"E2setupRequestIEs",
+	"E2setupRequestIEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2setupRequestIEs_tags_69,
+	sizeof(asn_DEF_E2setupRequestIEs_tags_69)
+		/sizeof(asn_DEF_E2setupRequestIEs_tags_69[0]), /* 1 */
+	asn_DEF_E2setupRequestIEs_tags_69,	/* Same as above */
+	sizeof(asn_DEF_E2setupRequestIEs_tags_69)
+		/sizeof(asn_DEF_E2setupRequestIEs_tags_69[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2setupRequestIEs_69,
+	3,	/* Elements count */
+	&asn_SPC_E2setupRequestIEs_specs_69	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_76[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.GlobalRIC_ID),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_GlobalRIC_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"GlobalRIC-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.RANfunctionsID_List),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RANfunctionsID_List,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionsID-List"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.RANfunctionsIDcause_List),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RANfunctionsIDcause_List,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionsIDcause-List"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_76[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 2 }, /* GlobalRIC-ID */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 1 }, /* RANfunctionsID-List */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 0 } /* RANfunctionsIDcause-List */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_76 = {
+	sizeof(struct E2setupResponseIEs__value),
+	offsetof(struct E2setupResponseIEs__value, _asn_ctx),
+	offsetof(struct E2setupResponseIEs__value, present),
+	sizeof(((struct E2setupResponseIEs__value *)0)->present),
+	asn_MAP_value_tag2el_76,
+	3,	/* Count of tags in the map */
+	0, 0,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_76 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_76,
+	3,	/* Elements count */
+	&asn_SPC_value_specs_76	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_E2setupResponseIEs_73[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_74,  memb_id_constraint_73 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_E2setupResponseIEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_75,  memb_criticality_constraint_73 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_76,
+		select_E2setupResponseIEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_76,  memb_value_constraint_73 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2setupResponseIEs_tags_73[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2setupResponseIEs_tag2el_73[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2setupResponseIEs_specs_73 = {
+	sizeof(struct E2setupResponseIEs),
+	offsetof(struct E2setupResponseIEs, _asn_ctx),
+	asn_MAP_E2setupResponseIEs_tag2el_73,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2setupResponseIEs = {
+	"E2setupResponseIEs",
+	"E2setupResponseIEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2setupResponseIEs_tags_73,
+	sizeof(asn_DEF_E2setupResponseIEs_tags_73)
+		/sizeof(asn_DEF_E2setupResponseIEs_tags_73[0]), /* 1 */
+	asn_DEF_E2setupResponseIEs_tags_73,	/* Same as above */
+	sizeof(asn_DEF_E2setupResponseIEs_tags_73)
+		/sizeof(asn_DEF_E2setupResponseIEs_tags_73[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2setupResponseIEs_73,
+	3,	/* Elements count */
+	&asn_SPC_E2setupResponseIEs_specs_73	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_80[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.Cause),
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_Cause,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"Cause"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.TimeToWait),
+		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
+		0,
+		&asn_DEF_TimeToWait,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"TimeToWait"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.CriticalityDiagnostics),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_CriticalityDiagnostics,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"CriticalityDiagnostics"
+		},
+};
+static const unsigned asn_MAP_value_to_canonical_80[] = { 1, 2, 0 };
+static const unsigned asn_MAP_value_from_canonical_80[] = { 2, 0, 1 };
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_80[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 }, /* TimeToWait */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, 0, 0 }, /* CriticalityDiagnostics */
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricRequest */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* ricService */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 }, /* transport */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 }, /* protocol */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 0, 0, 0 } /* misc */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_80 = {
+	sizeof(struct E2setupFailureIEs__value),
+	offsetof(struct E2setupFailureIEs__value, _asn_ctx),
+	offsetof(struct E2setupFailureIEs__value, present),
+	sizeof(((struct E2setupFailureIEs__value *)0)->present),
+	asn_MAP_value_tag2el_80,
+	7,	/* Count of tags in the map */
+	asn_MAP_value_to_canonical_80,
+	asn_MAP_value_from_canonical_80,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_80 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_80,
+	3,	/* Elements count */
+	&asn_SPC_value_specs_80	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_E2setupFailureIEs_77[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_78,  memb_id_constraint_77 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_E2setupFailureIEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_79,  memb_criticality_constraint_77 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_80,
+		select_E2setupFailureIEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_80,  memb_value_constraint_77 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2setupFailureIEs_tags_77[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2setupFailureIEs_tag2el_77[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2setupFailureIEs_specs_77 = {
+	sizeof(struct E2setupFailureIEs),
+	offsetof(struct E2setupFailureIEs, _asn_ctx),
+	asn_MAP_E2setupFailureIEs_tag2el_77,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2setupFailureIEs = {
+	"E2setupFailureIEs",
+	"E2setupFailureIEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2setupFailureIEs_tags_77,
+	sizeof(asn_DEF_E2setupFailureIEs_tags_77)
+		/sizeof(asn_DEF_E2setupFailureIEs_tags_77[0]), /* 1 */
+	asn_DEF_E2setupFailureIEs_tags_77,	/* Same as above */
+	sizeof(asn_DEF_E2setupFailureIEs_tags_77)
+		/sizeof(asn_DEF_E2setupFailureIEs_tags_77[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2setupFailureIEs_77,
+	3,	/* Elements count */
+	&asn_SPC_E2setupFailureIEs_specs_77	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_84[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs__value, choice.Cause),
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_Cause,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"Cause"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_84[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricRequest */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* ricService */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 }, /* transport */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 }, /* protocol */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 0, 0, 0 } /* misc */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_84 = {
+	sizeof(struct ResetRequestIEs__value),
+	offsetof(struct ResetRequestIEs__value, _asn_ctx),
+	offsetof(struct ResetRequestIEs__value, present),
+	sizeof(((struct ResetRequestIEs__value *)0)->present),
+	asn_MAP_value_tag2el_84,
+	5,	/* Count of tags in the map */
+	0, 0,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_84 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_84,
+	1,	/* Elements count */
+	&asn_SPC_value_specs_84	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ResetRequestIEs_81[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_82,  memb_id_constraint_81 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_ResetRequestIEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_83,  memb_criticality_constraint_81 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_84,
+		select_ResetRequestIEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_84,  memb_value_constraint_81 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ResetRequestIEs_tags_81[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_ResetRequestIEs_tag2el_81[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_ResetRequestIEs_specs_81 = {
+	sizeof(struct ResetRequestIEs),
+	offsetof(struct ResetRequestIEs, _asn_ctx),
+	asn_MAP_ResetRequestIEs_tag2el_81,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_ResetRequestIEs = {
+	"ResetRequestIEs",
+	"ResetRequestIEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_ResetRequestIEs_tags_81,
+	sizeof(asn_DEF_ResetRequestIEs_tags_81)
+		/sizeof(asn_DEF_ResetRequestIEs_tags_81[0]), /* 1 */
+	asn_DEF_ResetRequestIEs_tags_81,	/* Same as above */
+	sizeof(asn_DEF_ResetRequestIEs_tags_81)
+		/sizeof(asn_DEF_ResetRequestIEs_tags_81[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_ResetRequestIEs_81,
+	3,	/* Elements count */
+	&asn_SPC_ResetRequestIEs_specs_81	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_88[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs__value, choice.CriticalityDiagnostics),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_CriticalityDiagnostics,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"CriticalityDiagnostics"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_88[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* CriticalityDiagnostics */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_88 = {
+	sizeof(struct ResetResponseIEs__value),
+	offsetof(struct ResetResponseIEs__value, _asn_ctx),
+	offsetof(struct ResetResponseIEs__value, present),
+	sizeof(((struct ResetResponseIEs__value *)0)->present),
+	asn_MAP_value_tag2el_88,
+	1,	/* Count of tags in the map */
+	0, 0,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_88 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_88,
+	1,	/* Elements count */
+	&asn_SPC_value_specs_88	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_ResetResponseIEs_85[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_86,  memb_id_constraint_85 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_ResetResponseIEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_87,  memb_criticality_constraint_85 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_88,
+		select_ResetResponseIEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_88,  memb_value_constraint_85 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ResetResponseIEs_tags_85[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_ResetResponseIEs_tag2el_85[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_ResetResponseIEs_specs_85 = {
+	sizeof(struct ResetResponseIEs),
+	offsetof(struct ResetResponseIEs, _asn_ctx),
+	asn_MAP_ResetResponseIEs_tag2el_85,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_ResetResponseIEs = {
+	"ResetResponseIEs",
+	"ResetResponseIEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_ResetResponseIEs_tags_85,
+	sizeof(asn_DEF_ResetResponseIEs_tags_85)
+		/sizeof(asn_DEF_ResetResponseIEs_tags_85[0]), /* 1 */
+	asn_DEF_ResetResponseIEs_tags_85,	/* Same as above */
+	sizeof(asn_DEF_ResetResponseIEs_tags_85)
+		/sizeof(asn_DEF_ResetResponseIEs_tags_85[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_ResetResponseIEs_85,
+	3,	/* Elements count */
+	&asn_SPC_ResetResponseIEs_specs_85	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_92[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs__value, choice.RANfunctions_List),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RANfunctions_List,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctions-List"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs__value, choice.RANfunctionsID_List),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RANfunctionsID_List,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionsID-List"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_92[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RANfunctions-List */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 } /* RANfunctionsID-List */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_92 = {
+	sizeof(struct RICserviceUpdate_IEs__value),
+	offsetof(struct RICserviceUpdate_IEs__value, _asn_ctx),
+	offsetof(struct RICserviceUpdate_IEs__value, present),
+	sizeof(((struct RICserviceUpdate_IEs__value *)0)->present),
+	asn_MAP_value_tag2el_92,
+	2,	/* Count of tags in the map */
+	0, 0,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_92 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_92,
+	2,	/* Elements count */
+	&asn_SPC_value_specs_92	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICserviceUpdate_IEs_89[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_90,  memb_id_constraint_89 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICserviceUpdate_IEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_91,  memb_criticality_constraint_89 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_92,
+		select_RICserviceUpdate_IEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_92,  memb_value_constraint_89 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICserviceUpdate_IEs_tags_89[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdate_IEs_tag2el_89[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_IEs_specs_89 = {
+	sizeof(struct RICserviceUpdate_IEs),
+	offsetof(struct RICserviceUpdate_IEs, _asn_ctx),
+	asn_MAP_RICserviceUpdate_IEs_tag2el_89,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate_IEs = {
+	"RICserviceUpdate-IEs",
+	"RICserviceUpdate-IEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICserviceUpdate_IEs_tags_89,
+	sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89)
+		/sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89[0]), /* 1 */
+	asn_DEF_RICserviceUpdate_IEs_tags_89,	/* Same as above */
+	sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89)
+		/sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICserviceUpdate_IEs_89,
+	3,	/* Elements count */
+	&asn_SPC_RICserviceUpdate_IEs_specs_89	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_96[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs__value, choice.RANfunctionsID_List),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RANfunctionsID_List,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionsID-List"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs__value, choice.RANfunctionsIDcause_List),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RANfunctionsIDcause_List,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionsIDcause-List"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_96[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RANfunctionsID-List */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 } /* RANfunctionsIDcause-List */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_96 = {
+	sizeof(struct RICserviceUpdateAcknowledge_IEs__value),
+	offsetof(struct RICserviceUpdateAcknowledge_IEs__value, _asn_ctx),
+	offsetof(struct RICserviceUpdateAcknowledge_IEs__value, present),
+	sizeof(((struct RICserviceUpdateAcknowledge_IEs__value *)0)->present),
+	asn_MAP_value_tag2el_96,
+	2,	/* Count of tags in the map */
+	0, 0,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_96 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_96,
+	2,	/* Elements count */
+	&asn_SPC_value_specs_96	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_IEs_93[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_94,  memb_id_constraint_93 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICserviceUpdateAcknowledge_IEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_95,  memb_criticality_constraint_93 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_96,
+		select_RICserviceUpdateAcknowledge_IEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_96,  memb_value_constraint_93 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateAcknowledge_IEs_tag2el_93[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_93 = {
+	sizeof(struct RICserviceUpdateAcknowledge_IEs),
+	offsetof(struct RICserviceUpdateAcknowledge_IEs, _asn_ctx),
+	asn_MAP_RICserviceUpdateAcknowledge_IEs_tag2el_93,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge_IEs = {
+	"RICserviceUpdateAcknowledge-IEs",
+	"RICserviceUpdateAcknowledge-IEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93,
+	sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93)
+		/sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93[0]), /* 1 */
+	asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93,	/* Same as above */
+	sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93)
+		/sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICserviceUpdateAcknowledge_IEs_93,
+	3,	/* Elements count */
+	&asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_93	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_100[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs__value, choice.RANfunctionsIDcause_List),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RANfunctionsIDcause_List,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionsIDcause-List"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs__value, choice.TimeToWait),
+		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
+		0,
+		&asn_DEF_TimeToWait,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"TimeToWait"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs__value, choice.CriticalityDiagnostics),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_CriticalityDiagnostics,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"CriticalityDiagnostics"
+		},
+};
+static const unsigned asn_MAP_value_to_canonical_100[] = { 1, 0, 2 };
+static const unsigned asn_MAP_value_from_canonical_100[] = { 1, 0, 2 };
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_100[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 }, /* TimeToWait */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RANfunctionsIDcause-List */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 } /* CriticalityDiagnostics */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_100 = {
+	sizeof(struct RICserviceUpdateFailure_IEs__value),
+	offsetof(struct RICserviceUpdateFailure_IEs__value, _asn_ctx),
+	offsetof(struct RICserviceUpdateFailure_IEs__value, present),
+	sizeof(((struct RICserviceUpdateFailure_IEs__value *)0)->present),
+	asn_MAP_value_tag2el_100,
+	3,	/* Count of tags in the map */
+	asn_MAP_value_to_canonical_100,
+	asn_MAP_value_from_canonical_100,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_100 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_100,
+	3,	/* Elements count */
+	&asn_SPC_value_specs_100	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_IEs_97[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_98,  memb_id_constraint_97 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICserviceUpdateFailure_IEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_99,  memb_criticality_constraint_97 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_100,
+		select_RICserviceUpdateFailure_IEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_100,  memb_value_constraint_97 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICserviceUpdateFailure_IEs_tags_97[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateFailure_IEs_tag2el_97[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_IEs_specs_97 = {
+	sizeof(struct RICserviceUpdateFailure_IEs),
+	offsetof(struct RICserviceUpdateFailure_IEs, _asn_ctx),
+	asn_MAP_RICserviceUpdateFailure_IEs_tag2el_97,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure_IEs = {
+	"RICserviceUpdateFailure-IEs",
+	"RICserviceUpdateFailure-IEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICserviceUpdateFailure_IEs_tags_97,
+	sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97)
+		/sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97[0]), /* 1 */
+	asn_DEF_RICserviceUpdateFailure_IEs_tags_97,	/* Same as above */
+	sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97)
+		/sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICserviceUpdateFailure_IEs_97,
+	3,	/* Elements count */
+	&asn_SPC_RICserviceUpdateFailure_IEs_specs_97	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_value_104[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs__value, choice.RANfunctionsID_List),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RANfunctionsID_List,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RANfunctionsID-List"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_104[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunctionsID-List */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_104 = {
+	sizeof(struct RICserviceQuery_IEs__value),
+	offsetof(struct RICserviceQuery_IEs__value, _asn_ctx),
+	offsetof(struct RICserviceQuery_IEs__value, present),
+	sizeof(((struct RICserviceQuery_IEs__value *)0)->present),
+	asn_MAP_value_tag2el_104,
+	1,	/* Count of tags in the map */
+	0, 0,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_104 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_104,
+	1,	/* Elements count */
+	&asn_SPC_value_specs_104	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_RICserviceQuery_IEs_101[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_ID,
+		0,
+		{ 0, &asn_PER_memb_id_constr_102,  memb_id_constraint_101 },
+		0, 0, /* No default value */
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_RICserviceQuery_IEs_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_103,  memb_criticality_constraint_101 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_104,
+		select_RICserviceQuery_IEs_value_type,
+		{ 0, &asn_PER_memb_value_constr_104,  memb_value_constraint_101 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICserviceQuery_IEs_tags_101[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICserviceQuery_IEs_tag2el_101[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_IEs_specs_101 = {
+	sizeof(struct RICserviceQuery_IEs),
+	offsetof(struct RICserviceQuery_IEs, _asn_ctx),
+	asn_MAP_RICserviceQuery_IEs_tag2el_101,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICserviceQuery_IEs = {
+	"RICserviceQuery-IEs",
+	"RICserviceQuery-IEs",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICserviceQuery_IEs_tags_101,
+	sizeof(asn_DEF_RICserviceQuery_IEs_tags_101)
+		/sizeof(asn_DEF_RICserviceQuery_IEs_tags_101[0]), /* 1 */
+	asn_DEF_RICserviceQuery_IEs_tags_101,	/* Same as above */
+	sizeof(asn_DEF_RICserviceQuery_IEs_tags_101)
+		/sizeof(asn_DEF_RICserviceQuery_IEs_tags_101[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICserviceQuery_IEs_101,
+	3,	/* Elements count */
+	&asn_SPC_RICserviceQuery_IEs_specs_101	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-Field.h b/3rdparty/E2AP-v01.00.00/ProtocolIE-Field.h
new file mode 100644
index 0000000..26f3926
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-Field.h
@@ -0,0 +1,757 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-Containers"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_ProtocolIE_Field_H_
+#define	_ProtocolIE_Field_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-ID.h"
+#include "Criticality.h"
+#include "ANY.h"
+#include "asn_ioc.h"
+#include "RICaction-ToBeSetup-Item.h"
+#include "Presence.h"
+#include "OPEN_TYPE.h"
+#include "constr_CHOICE.h"
+#include "constr_SEQUENCE.h"
+#include "RICaction-Admitted-Item.h"
+#include "RICaction-NotAdmitted-Item.h"
+#include "RANfunction-Item.h"
+#include "RANfunctionID-Item.h"
+#include "RANfunctionIDcause-Item.h"
+#include "RICrequestID.h"
+#include "RANfunctionID.h"
+#include "RICsubscriptionDetails.h"
+#include "RICaction-Admitted-List.h"
+#include "RICaction-NotAdmitted-List.h"
+#include "CriticalityDiagnostics.h"
+#include "Cause.h"
+#include "RICactionID.h"
+#include "RICindicationSN.h"
+#include "RICindicationType.h"
+#include "RICindicationHeader.h"
+#include "RICindicationMessage.h"
+#include "RICcallProcessID.h"
+#include "RICcontrolHeader.h"
+#include "RICcontrolMessage.h"
+#include "RICcontrolAckRequest.h"
+#include "RICcontrolStatus.h"
+#include "RICcontrolOutcome.h"
+#include "GlobalE2node-ID.h"
+#include "RANfunctions-List.h"
+#include "GlobalRIC-ID.h"
+#include "RANfunctionsID-List.h"
+#include "RANfunctionsIDcause-List.h"
+#include "TimeToWait.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RICaction_ToBeSetup_ItemIEs__value_PR {
+	RICaction_ToBeSetup_ItemIEs__value_PR_NOTHING,	/* No components present */
+	RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item
+} RICaction_ToBeSetup_ItemIEs__value_PR;
+typedef enum RICaction_Admitted_ItemIEs__value_PR {
+	RICaction_Admitted_ItemIEs__value_PR_NOTHING,	/* No components present */
+	RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item
+} RICaction_Admitted_ItemIEs__value_PR;
+typedef enum RICaction_NotAdmitted_ItemIEs__value_PR {
+	RICaction_NotAdmitted_ItemIEs__value_PR_NOTHING,	/* No components present */
+	RICaction_NotAdmitted_ItemIEs__value_PR_RICaction_NotAdmitted_Item
+} RICaction_NotAdmitted_ItemIEs__value_PR;
+typedef enum RANfunction_ItemIEs__value_PR {
+	RANfunction_ItemIEs__value_PR_NOTHING,	/* No components present */
+	RANfunction_ItemIEs__value_PR_RANfunction_Item
+} RANfunction_ItemIEs__value_PR;
+typedef enum RANfunctionID_ItemIEs__value_PR {
+	RANfunctionID_ItemIEs__value_PR_NOTHING,	/* No components present */
+	RANfunctionID_ItemIEs__value_PR_RANfunctionID_Item
+} RANfunctionID_ItemIEs__value_PR;
+typedef enum RANfunctionIDcause_ItemIEs__value_PR {
+	RANfunctionIDcause_ItemIEs__value_PR_NOTHING,	/* No components present */
+	RANfunctionIDcause_ItemIEs__value_PR_RANfunctionIDcause_Item
+} RANfunctionIDcause_ItemIEs__value_PR;
+typedef enum RICsubscriptionRequest_IEs__value_PR {
+	RICsubscriptionRequest_IEs__value_PR_NOTHING,	/* No components present */
+	RICsubscriptionRequest_IEs__value_PR_RICrequestID,
+	RICsubscriptionRequest_IEs__value_PR_RANfunctionID,
+	RICsubscriptionRequest_IEs__value_PR_RICsubscriptionDetails
+} RICsubscriptionRequest_IEs__value_PR;
+typedef enum RICsubscriptionResponse_IEs__value_PR {
+	RICsubscriptionResponse_IEs__value_PR_NOTHING,	/* No components present */
+	RICsubscriptionResponse_IEs__value_PR_RICrequestID,
+	RICsubscriptionResponse_IEs__value_PR_RANfunctionID,
+	RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List,
+	RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List
+} RICsubscriptionResponse_IEs__value_PR;
+typedef enum RICsubscriptionFailure_IEs__value_PR {
+	RICsubscriptionFailure_IEs__value_PR_NOTHING,	/* No components present */
+	RICsubscriptionFailure_IEs__value_PR_RICrequestID,
+	RICsubscriptionFailure_IEs__value_PR_RANfunctionID,
+	RICsubscriptionFailure_IEs__value_PR_RICaction_NotAdmitted_List,
+	RICsubscriptionFailure_IEs__value_PR_CriticalityDiagnostics
+} RICsubscriptionFailure_IEs__value_PR;
+typedef enum RICsubscriptionDeleteRequest_IEs__value_PR {
+	RICsubscriptionDeleteRequest_IEs__value_PR_NOTHING,	/* No components present */
+	RICsubscriptionDeleteRequest_IEs__value_PR_RICrequestID,
+	RICsubscriptionDeleteRequest_IEs__value_PR_RANfunctionID
+} RICsubscriptionDeleteRequest_IEs__value_PR;
+typedef enum RICsubscriptionDeleteResponse_IEs__value_PR {
+	RICsubscriptionDeleteResponse_IEs__value_PR_NOTHING,	/* No components present */
+	RICsubscriptionDeleteResponse_IEs__value_PR_RICrequestID,
+	RICsubscriptionDeleteResponse_IEs__value_PR_RANfunctionID
+} RICsubscriptionDeleteResponse_IEs__value_PR;
+typedef enum RICsubscriptionDeleteFailure_IEs__value_PR {
+	RICsubscriptionDeleteFailure_IEs__value_PR_NOTHING,	/* No components present */
+	RICsubscriptionDeleteFailure_IEs__value_PR_RICrequestID,
+	RICsubscriptionDeleteFailure_IEs__value_PR_RANfunctionID,
+	RICsubscriptionDeleteFailure_IEs__value_PR_Cause,
+	RICsubscriptionDeleteFailure_IEs__value_PR_CriticalityDiagnostics
+} RICsubscriptionDeleteFailure_IEs__value_PR;
+typedef enum RICindication_IEs__value_PR {
+	RICindication_IEs__value_PR_NOTHING,	/* No components present */
+	RICindication_IEs__value_PR_RICrequestID,
+	RICindication_IEs__value_PR_RANfunctionID,
+	RICindication_IEs__value_PR_RICactionID,
+	RICindication_IEs__value_PR_RICindicationSN,
+	RICindication_IEs__value_PR_RICindicationType,
+	RICindication_IEs__value_PR_RICindicationHeader,
+	RICindication_IEs__value_PR_RICindicationMessage,
+	RICindication_IEs__value_PR_RICcallProcessID
+} RICindication_IEs__value_PR;
+typedef enum RICcontrolRequest_IEs__value_PR {
+	RICcontrolRequest_IEs__value_PR_NOTHING,	/* No components present */
+	RICcontrolRequest_IEs__value_PR_RICrequestID,
+	RICcontrolRequest_IEs__value_PR_RANfunctionID,
+	RICcontrolRequest_IEs__value_PR_RICcallProcessID,
+	RICcontrolRequest_IEs__value_PR_RICcontrolHeader,
+	RICcontrolRequest_IEs__value_PR_RICcontrolMessage,
+	RICcontrolRequest_IEs__value_PR_RICcontrolAckRequest
+} RICcontrolRequest_IEs__value_PR;
+typedef enum RICcontrolAcknowledge_IEs__value_PR {
+	RICcontrolAcknowledge_IEs__value_PR_NOTHING,	/* No components present */
+	RICcontrolAcknowledge_IEs__value_PR_RICrequestID,
+	RICcontrolAcknowledge_IEs__value_PR_RANfunctionID,
+	RICcontrolAcknowledge_IEs__value_PR_RICcallProcessID,
+	RICcontrolAcknowledge_IEs__value_PR_RICcontrolStatus,
+	RICcontrolAcknowledge_IEs__value_PR_RICcontrolOutcome
+} RICcontrolAcknowledge_IEs__value_PR;
+typedef enum RICcontrolFailure_IEs__value_PR {
+	RICcontrolFailure_IEs__value_PR_NOTHING,	/* No components present */
+	RICcontrolFailure_IEs__value_PR_RICrequestID,
+	RICcontrolFailure_IEs__value_PR_RANfunctionID,
+	RICcontrolFailure_IEs__value_PR_RICcallProcessID,
+	RICcontrolFailure_IEs__value_PR_Cause,
+	RICcontrolFailure_IEs__value_PR_RICcontrolOutcome
+} RICcontrolFailure_IEs__value_PR;
+typedef enum ErrorIndication_IEs__value_PR {
+	ErrorIndication_IEs__value_PR_NOTHING,	/* No components present */
+	ErrorIndication_IEs__value_PR_RICrequestID,
+	ErrorIndication_IEs__value_PR_RANfunctionID,
+	ErrorIndication_IEs__value_PR_Cause,
+	ErrorIndication_IEs__value_PR_CriticalityDiagnostics
+} ErrorIndication_IEs__value_PR;
+typedef enum E2setupRequestIEs__value_PR {
+	E2setupRequestIEs__value_PR_NOTHING,	/* No components present */
+	E2setupRequestIEs__value_PR_GlobalE2node_ID,
+	E2setupRequestIEs__value_PR_RANfunctions_List
+} E2setupRequestIEs__value_PR;
+typedef enum E2setupResponseIEs__value_PR {
+	E2setupResponseIEs__value_PR_NOTHING,	/* No components present */
+	E2setupResponseIEs__value_PR_GlobalRIC_ID,
+	E2setupResponseIEs__value_PR_RANfunctionsID_List,
+	E2setupResponseIEs__value_PR_RANfunctionsIDcause_List
+} E2setupResponseIEs__value_PR;
+typedef enum E2setupFailureIEs__value_PR {
+	E2setupFailureIEs__value_PR_NOTHING,	/* No components present */
+	E2setupFailureIEs__value_PR_Cause,
+	E2setupFailureIEs__value_PR_TimeToWait,
+	E2setupFailureIEs__value_PR_CriticalityDiagnostics
+} E2setupFailureIEs__value_PR;
+typedef enum ResetRequestIEs__value_PR {
+	ResetRequestIEs__value_PR_NOTHING,	/* No components present */
+	ResetRequestIEs__value_PR_Cause
+} ResetRequestIEs__value_PR;
+typedef enum ResetResponseIEs__value_PR {
+	ResetResponseIEs__value_PR_NOTHING,	/* No components present */
+	ResetResponseIEs__value_PR_CriticalityDiagnostics
+} ResetResponseIEs__value_PR;
+typedef enum RICserviceUpdate_IEs__value_PR {
+	RICserviceUpdate_IEs__value_PR_NOTHING,	/* No components present */
+	RICserviceUpdate_IEs__value_PR_RANfunctions_List,
+	RICserviceUpdate_IEs__value_PR_RANfunctionsID_List
+} RICserviceUpdate_IEs__value_PR;
+typedef enum RICserviceUpdateAcknowledge_IEs__value_PR {
+	RICserviceUpdateAcknowledge_IEs__value_PR_NOTHING,	/* No components present */
+	RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsID_List,
+	RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsIDcause_List
+} RICserviceUpdateAcknowledge_IEs__value_PR;
+typedef enum RICserviceUpdateFailure_IEs__value_PR {
+	RICserviceUpdateFailure_IEs__value_PR_NOTHING,	/* No components present */
+	RICserviceUpdateFailure_IEs__value_PR_RANfunctionsIDcause_List,
+	RICserviceUpdateFailure_IEs__value_PR_TimeToWait,
+	RICserviceUpdateFailure_IEs__value_PR_CriticalityDiagnostics
+} RICserviceUpdateFailure_IEs__value_PR;
+typedef enum RICserviceQuery_IEs__value_PR {
+	RICserviceQuery_IEs__value_PR_NOTHING,	/* No components present */
+	RICserviceQuery_IEs__value_PR_RANfunctionsID_List
+} RICserviceQuery_IEs__value_PR;
+
+/* ProtocolIE-Field */
+typedef struct RICaction_ToBeSetup_ItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICaction_ToBeSetup_ItemIEs__value {
+		RICaction_ToBeSetup_ItemIEs__value_PR present;
+		union RICaction_ToBeSetup_ItemIEs__value_u {
+			RICaction_ToBeSetup_Item_t	 RICaction_ToBeSetup_Item;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICaction_ToBeSetup_ItemIEs_t;
+typedef struct RICaction_Admitted_ItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICaction_Admitted_ItemIEs__value {
+		RICaction_Admitted_ItemIEs__value_PR present;
+		union RICaction_Admitted_ItemIEs__value_u {
+			RICaction_Admitted_Item_t	 RICaction_Admitted_Item;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICaction_Admitted_ItemIEs_t;
+typedef struct RICaction_NotAdmitted_ItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICaction_NotAdmitted_ItemIEs__value {
+		RICaction_NotAdmitted_ItemIEs__value_PR present;
+		union RICaction_NotAdmitted_ItemIEs__value_u {
+			RICaction_NotAdmitted_Item_t	 RICaction_NotAdmitted_Item;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICaction_NotAdmitted_ItemIEs_t;
+typedef struct RANfunction_ItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RANfunction_ItemIEs__value {
+		RANfunction_ItemIEs__value_PR present;
+		union RANfunction_ItemIEs__value_u {
+			RANfunction_Item_t	 RANfunction_Item;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANfunction_ItemIEs_t;
+typedef struct RANfunctionID_ItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RANfunctionID_ItemIEs__value {
+		RANfunctionID_ItemIEs__value_PR present;
+		union RANfunctionID_ItemIEs__value_u {
+			RANfunctionID_Item_t	 RANfunctionID_Item;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANfunctionID_ItemIEs_t;
+typedef struct RANfunctionIDcause_ItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RANfunctionIDcause_ItemIEs__value {
+		RANfunctionIDcause_ItemIEs__value_PR present;
+		union RANfunctionIDcause_ItemIEs__value_u {
+			RANfunctionIDcause_Item_t	 RANfunctionIDcause_Item;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANfunctionIDcause_ItemIEs_t;
+typedef struct RICsubscriptionRequest_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICsubscriptionRequest_IEs__value {
+		RICsubscriptionRequest_IEs__value_PR present;
+		union RICsubscriptionRequest_IEs__value_u {
+			RICrequestID_t	 RICrequestID;
+			RANfunctionID_t	 RANfunctionID;
+			RICsubscriptionDetails_t	 RICsubscriptionDetails;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICsubscriptionRequest_IEs_t;
+typedef struct RICsubscriptionResponse_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICsubscriptionResponse_IEs__value {
+		RICsubscriptionResponse_IEs__value_PR present;
+		union RICsubscriptionResponse_IEs__value_u {
+			RICrequestID_t	 RICrequestID;
+			RANfunctionID_t	 RANfunctionID;
+			RICaction_Admitted_List_t	 RICaction_Admitted_List;
+			RICaction_NotAdmitted_List_t	 RICaction_NotAdmitted_List;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICsubscriptionResponse_IEs_t;
+typedef struct RICsubscriptionFailure_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICsubscriptionFailure_IEs__value {
+		RICsubscriptionFailure_IEs__value_PR present;
+		union RICsubscriptionFailure_IEs__value_u {
+			RICrequestID_t	 RICrequestID;
+			RANfunctionID_t	 RANfunctionID;
+			RICaction_NotAdmitted_List_t	 RICaction_NotAdmitted_List;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICsubscriptionFailure_IEs_t;
+typedef struct RICsubscriptionDeleteRequest_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICsubscriptionDeleteRequest_IEs__value {
+		RICsubscriptionDeleteRequest_IEs__value_PR present;
+		union RICsubscriptionDeleteRequest_IEs__value_u {
+			RICrequestID_t	 RICrequestID;
+			RANfunctionID_t	 RANfunctionID;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICsubscriptionDeleteRequest_IEs_t;
+typedef struct RICsubscriptionDeleteResponse_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICsubscriptionDeleteResponse_IEs__value {
+		RICsubscriptionDeleteResponse_IEs__value_PR present;
+		union RICsubscriptionDeleteResponse_IEs__value_u {
+			RICrequestID_t	 RICrequestID;
+			RANfunctionID_t	 RANfunctionID;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICsubscriptionDeleteResponse_IEs_t;
+typedef struct RICsubscriptionDeleteFailure_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICsubscriptionDeleteFailure_IEs__value {
+		RICsubscriptionDeleteFailure_IEs__value_PR present;
+		union RICsubscriptionDeleteFailure_IEs__value_u {
+			RICrequestID_t	 RICrequestID;
+			RANfunctionID_t	 RANfunctionID;
+			Cause_t	 Cause;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICsubscriptionDeleteFailure_IEs_t;
+typedef struct RICindication_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICindication_IEs__value {
+		RICindication_IEs__value_PR present;
+		union RICindication_IEs__value_u {
+			RICrequestID_t	 RICrequestID;
+			RANfunctionID_t	 RANfunctionID;
+			RICactionID_t	 RICactionID;
+			RICindicationSN_t	 RICindicationSN;
+			RICindicationType_t	 RICindicationType;
+			RICindicationHeader_t	 RICindicationHeader;
+			RICindicationMessage_t	 RICindicationMessage;
+			RICcallProcessID_t	 RICcallProcessID;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICindication_IEs_t;
+typedef struct RICcontrolRequest_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICcontrolRequest_IEs__value {
+		RICcontrolRequest_IEs__value_PR present;
+		union RICcontrolRequest_IEs__value_u {
+			RICrequestID_t	 RICrequestID;
+			RANfunctionID_t	 RANfunctionID;
+			RICcallProcessID_t	 RICcallProcessID;
+			RICcontrolHeader_t	 RICcontrolHeader;
+			RICcontrolMessage_t	 RICcontrolMessage;
+			RICcontrolAckRequest_t	 RICcontrolAckRequest;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICcontrolRequest_IEs_t;
+typedef struct RICcontrolAcknowledge_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICcontrolAcknowledge_IEs__value {
+		RICcontrolAcknowledge_IEs__value_PR present;
+		union RICcontrolAcknowledge_IEs__value_u {
+			RICrequestID_t	 RICrequestID;
+			RANfunctionID_t	 RANfunctionID;
+			RICcallProcessID_t	 RICcallProcessID;
+			RICcontrolStatus_t	 RICcontrolStatus;
+			RICcontrolOutcome_t	 RICcontrolOutcome;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICcontrolAcknowledge_IEs_t;
+typedef struct RICcontrolFailure_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICcontrolFailure_IEs__value {
+		RICcontrolFailure_IEs__value_PR present;
+		union RICcontrolFailure_IEs__value_u {
+			RICrequestID_t	 RICrequestID;
+			RANfunctionID_t	 RANfunctionID;
+			RICcallProcessID_t	 RICcallProcessID;
+			Cause_t	 Cause;
+			RICcontrolOutcome_t	 RICcontrolOutcome;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICcontrolFailure_IEs_t;
+typedef struct ErrorIndication_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct ErrorIndication_IEs__value {
+		ErrorIndication_IEs__value_PR present;
+		union ErrorIndication_IEs__value_u {
+			RICrequestID_t	 RICrequestID;
+			RANfunctionID_t	 RANfunctionID;
+			Cause_t	 Cause;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ErrorIndication_IEs_t;
+typedef struct E2setupRequestIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E2setupRequestIEs__value {
+		E2setupRequestIEs__value_PR present;
+		union E2setupRequestIEs__value_u {
+			GlobalE2node_ID_t	 GlobalE2node_ID;
+			RANfunctions_List_t	 RANfunctions_List;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2setupRequestIEs_t;
+typedef struct E2setupResponseIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E2setupResponseIEs__value {
+		E2setupResponseIEs__value_PR present;
+		union E2setupResponseIEs__value_u {
+			GlobalRIC_ID_t	 GlobalRIC_ID;
+			RANfunctionsID_List_t	 RANfunctionsID_List;
+			RANfunctionsIDcause_List_t	 RANfunctionsIDcause_List;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2setupResponseIEs_t;
+typedef struct E2setupFailureIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E2setupFailureIEs__value {
+		E2setupFailureIEs__value_PR present;
+		union E2setupFailureIEs__value_u {
+			Cause_t	 Cause;
+			TimeToWait_t	 TimeToWait;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2setupFailureIEs_t;
+typedef struct ResetRequestIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct ResetRequestIEs__value {
+		ResetRequestIEs__value_PR present;
+		union ResetRequestIEs__value_u {
+			Cause_t	 Cause;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ResetRequestIEs_t;
+typedef struct ResetResponseIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct ResetResponseIEs__value {
+		ResetResponseIEs__value_PR present;
+		union ResetResponseIEs__value_u {
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ResetResponseIEs_t;
+typedef struct RICserviceUpdate_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICserviceUpdate_IEs__value {
+		RICserviceUpdate_IEs__value_PR present;
+		union RICserviceUpdate_IEs__value_u {
+			RANfunctions_List_t	 RANfunctions_List;
+			RANfunctionsID_List_t	 RANfunctionsID_List;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICserviceUpdate_IEs_t;
+typedef struct RICserviceUpdateAcknowledge_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICserviceUpdateAcknowledge_IEs__value {
+		RICserviceUpdateAcknowledge_IEs__value_PR present;
+		union RICserviceUpdateAcknowledge_IEs__value_u {
+			RANfunctionsID_List_t	 RANfunctionsID_List;
+			RANfunctionsIDcause_List_t	 RANfunctionsIDcause_List;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICserviceUpdateAcknowledge_IEs_t;
+typedef struct RICserviceUpdateFailure_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICserviceUpdateFailure_IEs__value {
+		RICserviceUpdateFailure_IEs__value_PR present;
+		union RICserviceUpdateFailure_IEs__value_u {
+			RANfunctionsIDcause_List_t	 RANfunctionsIDcause_List;
+			TimeToWait_t	 TimeToWait;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICserviceUpdateFailure_IEs_t;
+typedef struct RICserviceQuery_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RICserviceQuery_IEs__value {
+		RICserviceQuery_IEs__value_PR present;
+		union RICserviceQuery_IEs__value_u {
+			RANfunctionsID_List_t	 RANfunctionsID_List;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICserviceQuery_IEs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_ItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_ItemIEs_1[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_ItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICaction_Admitted_ItemIEs_specs_5;
+extern asn_TYPE_member_t asn_MBR_RICaction_Admitted_ItemIEs_5[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_ItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9;
+extern asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_ItemIEs_9[3];
+extern asn_TYPE_descriptor_t asn_DEF_RANfunction_ItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RANfunction_ItemIEs_specs_13;
+extern asn_TYPE_member_t asn_MBR_RANfunction_ItemIEs_13[3];
+extern asn_TYPE_descriptor_t asn_DEF_RANfunctionID_ItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RANfunctionID_ItemIEs_specs_17;
+extern asn_TYPE_member_t asn_MBR_RANfunctionID_ItemIEs_17[3];
+extern asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_ItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RANfunctionIDcause_ItemIEs_specs_21;
+extern asn_TYPE_member_t asn_MBR_RANfunctionIDcause_ItemIEs_21[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_IEs_specs_25;
+extern asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_IEs_25[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_IEs_specs_29;
+extern asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_IEs_29[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_IEs_specs_33;
+extern asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_IEs_33[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_37;
+extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_IEs_37[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_41;
+extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_IEs_41[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_45;
+extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_IEs_45[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICindication_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICindication_IEs_specs_49;
+extern asn_TYPE_member_t asn_MBR_RICindication_IEs_49[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_IEs_specs_53;
+extern asn_TYPE_member_t asn_MBR_RICcontrolRequest_IEs_53[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_IEs_specs_57;
+extern asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_IEs_57[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_IEs_specs_61;
+extern asn_TYPE_member_t asn_MBR_RICcontrolFailure_IEs_61[3];
+extern asn_TYPE_descriptor_t asn_DEF_ErrorIndication_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ErrorIndication_IEs_specs_65;
+extern asn_TYPE_member_t asn_MBR_ErrorIndication_IEs_65[3];
+extern asn_TYPE_descriptor_t asn_DEF_E2setupRequestIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2setupRequestIEs_specs_69;
+extern asn_TYPE_member_t asn_MBR_E2setupRequestIEs_69[3];
+extern asn_TYPE_descriptor_t asn_DEF_E2setupResponseIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2setupResponseIEs_specs_73;
+extern asn_TYPE_member_t asn_MBR_E2setupResponseIEs_73[3];
+extern asn_TYPE_descriptor_t asn_DEF_E2setupFailureIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2setupFailureIEs_specs_77;
+extern asn_TYPE_member_t asn_MBR_E2setupFailureIEs_77[3];
+extern asn_TYPE_descriptor_t asn_DEF_ResetRequestIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ResetRequestIEs_specs_81;
+extern asn_TYPE_member_t asn_MBR_ResetRequestIEs_81[3];
+extern asn_TYPE_descriptor_t asn_DEF_ResetResponseIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ResetResponseIEs_specs_85;
+extern asn_TYPE_member_t asn_MBR_ResetResponseIEs_85[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_IEs_specs_89;
+extern asn_TYPE_member_t asn_MBR_RICserviceUpdate_IEs_89[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_93;
+extern asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_IEs_93[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_IEs_specs_97;
+extern asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_IEs_97[3];
+extern asn_TYPE_descriptor_t asn_DEF_RICserviceQuery_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_IEs_specs_101;
+extern asn_TYPE_member_t asn_MBR_RICserviceQuery_IEs_101[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_Field_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-FieldPair.c b/3rdparty/E2AP-v01.00.00/ProtocolIE-FieldPair.c
new file mode 100644
index 0000000..29b623b
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-FieldPair.c
@@ -0,0 +1,9 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-Containers"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "ProtocolIE-FieldPair.h"
+
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-FieldPair.h b/3rdparty/E2AP-v01.00.00/ProtocolIE-FieldPair.h
new file mode 100644
index 0000000..89a9cc4
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-FieldPair.h
@@ -0,0 +1,23 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-Containers"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_ProtocolIE_FieldPair_H_
+#define	_ProtocolIE_FieldPair_H_
+
+
+#include "asn_application.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_FieldPair_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-ID.c b/3rdparty/E2AP-v01.00.00/ProtocolIE-ID.c
new file mode 100644
index 0000000..2c410bb
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-ID.c
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-CommonDataTypes"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "ProtocolIE-ID.h"
+
+int
+ProtocolIE_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_ProtocolIE_ID_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ID = {
+	"ProtocolIE-ID",
+	"ProtocolIE-ID",
+	&asn_OP_NativeInteger,
+	asn_DEF_ProtocolIE_ID_tags_1,
+	sizeof(asn_DEF_ProtocolIE_ID_tags_1)
+		/sizeof(asn_DEF_ProtocolIE_ID_tags_1[0]), /* 1 */
+	asn_DEF_ProtocolIE_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_ID_tags_1)
+		/sizeof(asn_DEF_ProtocolIE_ID_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_ProtocolIE_ID_constr_1, ProtocolIE_ID_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-ID.h b/3rdparty/E2AP-v01.00.00/ProtocolIE-ID.h
new file mode 100644
index 0000000..e2931c1
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-ID.h
@@ -0,0 +1,76 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-CommonDataTypes"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_ProtocolIE_ID_H_
+#define	_ProtocolIE_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ProtocolIE-ID */
+typedef long	 ProtocolIE_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ID;
+asn_struct_free_f ProtocolIE_ID_free;
+asn_struct_print_f ProtocolIE_ID_print;
+asn_constr_check_f ProtocolIE_ID_constraint;
+ber_type_decoder_f ProtocolIE_ID_decode_ber;
+der_type_encoder_f ProtocolIE_ID_encode_der;
+xer_type_decoder_f ProtocolIE_ID_decode_xer;
+xer_type_encoder_f ProtocolIE_ID_encode_xer;
+per_type_decoder_f ProtocolIE_ID_decode_uper;
+per_type_encoder_f ProtocolIE_ID_encode_uper;
+per_type_decoder_f ProtocolIE_ID_decode_aper;
+per_type_encoder_f ProtocolIE_ID_encode_aper;
+#define ProtocolIE_ID_id_Cause	((ProtocolIE_ID_t)1)
+#define ProtocolIE_ID_id_CriticalityDiagnostics	((ProtocolIE_ID_t)2)
+#define ProtocolIE_ID_id_GlobalE2node_ID	((ProtocolIE_ID_t)3)
+#define ProtocolIE_ID_id_GlobalRIC_ID	((ProtocolIE_ID_t)4)
+#define ProtocolIE_ID_id_RANfunctionID	((ProtocolIE_ID_t)5)
+#define ProtocolIE_ID_id_RANfunctionID_Item	((ProtocolIE_ID_t)6)
+#define ProtocolIE_ID_id_RANfunctionIEcause_Item	((ProtocolIE_ID_t)7)
+#define ProtocolIE_ID_id_RANfunction_Item	((ProtocolIE_ID_t)8)
+#define ProtocolIE_ID_id_RANfunctionsAccepted	((ProtocolIE_ID_t)9)
+#define ProtocolIE_ID_id_RANfunctionsAdded	((ProtocolIE_ID_t)10)
+#define ProtocolIE_ID_id_RANfunctionsDeleted	((ProtocolIE_ID_t)11)
+#define ProtocolIE_ID_id_RANfunctionsModified	((ProtocolIE_ID_t)12)
+#define ProtocolIE_ID_id_RANfunctionsRejected	((ProtocolIE_ID_t)13)
+#define ProtocolIE_ID_id_RICaction_Admitted_Item	((ProtocolIE_ID_t)14)
+#define ProtocolIE_ID_id_RICactionID	((ProtocolIE_ID_t)15)
+#define ProtocolIE_ID_id_RICaction_NotAdmitted_Item	((ProtocolIE_ID_t)16)
+#define ProtocolIE_ID_id_RICactions_Admitted	((ProtocolIE_ID_t)17)
+#define ProtocolIE_ID_id_RICactions_NotAdmitted	((ProtocolIE_ID_t)18)
+#define ProtocolIE_ID_id_RICaction_ToBeSetup_Item	((ProtocolIE_ID_t)19)
+#define ProtocolIE_ID_id_RICcallProcessID	((ProtocolIE_ID_t)20)
+#define ProtocolIE_ID_id_RICcontrolAckRequest	((ProtocolIE_ID_t)21)
+#define ProtocolIE_ID_id_RICcontrolHeader	((ProtocolIE_ID_t)22)
+#define ProtocolIE_ID_id_RICcontrolMessage	((ProtocolIE_ID_t)23)
+#define ProtocolIE_ID_id_RICcontrolStatus	((ProtocolIE_ID_t)24)
+#define ProtocolIE_ID_id_RICindicationHeader	((ProtocolIE_ID_t)25)
+#define ProtocolIE_ID_id_RICindicationMessage	((ProtocolIE_ID_t)26)
+#define ProtocolIE_ID_id_RICindicationSN	((ProtocolIE_ID_t)27)
+#define ProtocolIE_ID_id_RICindicationType	((ProtocolIE_ID_t)28)
+#define ProtocolIE_ID_id_RICrequestID	((ProtocolIE_ID_t)29)
+#define ProtocolIE_ID_id_RICsubscriptionDetails	((ProtocolIE_ID_t)30)
+#define ProtocolIE_ID_id_TimeToWait	((ProtocolIE_ID_t)31)
+#define ProtocolIE_ID_id_RICcontrolOutcome	((ProtocolIE_ID_t)32)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-SingleContainer.c b/3rdparty/E2AP-v01.00.00/ProtocolIE-SingleContainer.c
new file mode 100644
index 0000000..f3b8307
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-SingleContainer.c
@@ -0,0 +1,147 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-Containers"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "ProtocolIE-SingleContainer.h"
+
+/*
+ * This type is implemented using RICaction_ToBeSetup_ItemIEs,
+ * so here we adjust the DEF accordingly.
+ */
+/*
+ * This type is implemented using RICaction_Admitted_ItemIEs,
+ * so here we adjust the DEF accordingly.
+ */
+/*
+ * This type is implemented using RICaction_NotAdmitted_ItemIEs,
+ * so here we adjust the DEF accordingly.
+ */
+/*
+ * This type is implemented using RANfunction_ItemIEs,
+ * so here we adjust the DEF accordingly.
+ */
+/*
+ * This type is implemented using RANfunctionID_ItemIEs,
+ * so here we adjust the DEF accordingly.
+ */
+/*
+ * This type is implemented using RANfunctionIDcause_ItemIEs,
+ * so here we adjust the DEF accordingly.
+ */
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_1547P0_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_1547P0 = {
+	"ProtocolIE-SingleContainer",
+	"ProtocolIE-SingleContainer",
+	&asn_OP_SEQUENCE,
+	asn_DEF_ProtocolIE_SingleContainer_1547P0_tags_1,
+	sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P0_tags_1)
+		/sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P0_tags_1[0]), /* 1 */
+	asn_DEF_ProtocolIE_SingleContainer_1547P0_tags_1,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P0_tags_1)
+		/sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P0_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICaction_ToBeSetup_ItemIEs_1,
+	3,	/* Elements count */
+	&asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1	/* Additional specs */
+};
+
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_1547P1_tags_2[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_1547P1 = {
+	"ProtocolIE-SingleContainer",
+	"ProtocolIE-SingleContainer",
+	&asn_OP_SEQUENCE,
+	asn_DEF_ProtocolIE_SingleContainer_1547P1_tags_2,
+	sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P1_tags_2)
+		/sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P1_tags_2[0]), /* 1 */
+	asn_DEF_ProtocolIE_SingleContainer_1547P1_tags_2,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P1_tags_2)
+		/sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P1_tags_2[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICaction_Admitted_ItemIEs_5,
+	3,	/* Elements count */
+	&asn_SPC_RICaction_Admitted_ItemIEs_specs_5	/* Additional specs */
+};
+
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_1547P2_tags_3[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_1547P2 = {
+	"ProtocolIE-SingleContainer",
+	"ProtocolIE-SingleContainer",
+	&asn_OP_SEQUENCE,
+	asn_DEF_ProtocolIE_SingleContainer_1547P2_tags_3,
+	sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P2_tags_3)
+		/sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P2_tags_3[0]), /* 1 */
+	asn_DEF_ProtocolIE_SingleContainer_1547P2_tags_3,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P2_tags_3)
+		/sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P2_tags_3[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICaction_NotAdmitted_ItemIEs_9,
+	3,	/* Elements count */
+	&asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9	/* Additional specs */
+};
+
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_1547P3_tags_4[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_1547P3 = {
+	"ProtocolIE-SingleContainer",
+	"ProtocolIE-SingleContainer",
+	&asn_OP_SEQUENCE,
+	asn_DEF_ProtocolIE_SingleContainer_1547P3_tags_4,
+	sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P3_tags_4)
+		/sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P3_tags_4[0]), /* 1 */
+	asn_DEF_ProtocolIE_SingleContainer_1547P3_tags_4,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P3_tags_4)
+		/sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P3_tags_4[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RANfunction_ItemIEs_13,
+	3,	/* Elements count */
+	&asn_SPC_RANfunction_ItemIEs_specs_13	/* Additional specs */
+};
+
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_1547P4_tags_5[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_1547P4 = {
+	"ProtocolIE-SingleContainer",
+	"ProtocolIE-SingleContainer",
+	&asn_OP_SEQUENCE,
+	asn_DEF_ProtocolIE_SingleContainer_1547P4_tags_5,
+	sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P4_tags_5)
+		/sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P4_tags_5[0]), /* 1 */
+	asn_DEF_ProtocolIE_SingleContainer_1547P4_tags_5,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P4_tags_5)
+		/sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P4_tags_5[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RANfunctionID_ItemIEs_17,
+	3,	/* Elements count */
+	&asn_SPC_RANfunctionID_ItemIEs_specs_17	/* Additional specs */
+};
+
+static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainer_1547P5_tags_6[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_1547P5 = {
+	"ProtocolIE-SingleContainer",
+	"ProtocolIE-SingleContainer",
+	&asn_OP_SEQUENCE,
+	asn_DEF_ProtocolIE_SingleContainer_1547P5_tags_6,
+	sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P5_tags_6)
+		/sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P5_tags_6[0]), /* 1 */
+	asn_DEF_ProtocolIE_SingleContainer_1547P5_tags_6,	/* Same as above */
+	sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P5_tags_6)
+		/sizeof(asn_DEF_ProtocolIE_SingleContainer_1547P5_tags_6[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RANfunctionIDcause_ItemIEs_21,
+	3,	/* Elements count */
+	&asn_SPC_RANfunctionIDcause_ItemIEs_specs_21	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/ProtocolIE-SingleContainer.h b/3rdparty/E2AP-v01.00.00/ProtocolIE-SingleContainer.h
new file mode 100644
index 0000000..965b1d5
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ProtocolIE-SingleContainer.h
@@ -0,0 +1,108 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-Containers"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_ProtocolIE_SingleContainer_H_
+#define	_ProtocolIE_SingleContainer_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Field.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ProtocolIE-SingleContainer */
+typedef RICaction_ToBeSetup_ItemIEs_t	 ProtocolIE_SingleContainer_1547P0_t;
+typedef RICaction_Admitted_ItemIEs_t	 ProtocolIE_SingleContainer_1547P1_t;
+typedef RICaction_NotAdmitted_ItemIEs_t	 ProtocolIE_SingleContainer_1547P2_t;
+typedef RANfunction_ItemIEs_t	 ProtocolIE_SingleContainer_1547P3_t;
+typedef RANfunctionID_ItemIEs_t	 ProtocolIE_SingleContainer_1547P4_t;
+typedef RANfunctionIDcause_ItemIEs_t	 ProtocolIE_SingleContainer_1547P5_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_1547P0;
+asn_struct_free_f ProtocolIE_SingleContainer_1547P0_free;
+asn_struct_print_f ProtocolIE_SingleContainer_1547P0_print;
+asn_constr_check_f ProtocolIE_SingleContainer_1547P0_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_1547P0_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_1547P0_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_1547P0_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_1547P0_encode_xer;
+per_type_decoder_f ProtocolIE_SingleContainer_1547P0_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_1547P0_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_1547P0_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_1547P0_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_1547P1;
+asn_struct_free_f ProtocolIE_SingleContainer_1547P1_free;
+asn_struct_print_f ProtocolIE_SingleContainer_1547P1_print;
+asn_constr_check_f ProtocolIE_SingleContainer_1547P1_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_1547P1_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_1547P1_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_1547P1_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_1547P1_encode_xer;
+per_type_decoder_f ProtocolIE_SingleContainer_1547P1_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_1547P1_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_1547P1_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_1547P1_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_1547P2;
+asn_struct_free_f ProtocolIE_SingleContainer_1547P2_free;
+asn_struct_print_f ProtocolIE_SingleContainer_1547P2_print;
+asn_constr_check_f ProtocolIE_SingleContainer_1547P2_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_1547P2_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_1547P2_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_1547P2_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_1547P2_encode_xer;
+per_type_decoder_f ProtocolIE_SingleContainer_1547P2_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_1547P2_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_1547P2_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_1547P2_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_1547P3;
+asn_struct_free_f ProtocolIE_SingleContainer_1547P3_free;
+asn_struct_print_f ProtocolIE_SingleContainer_1547P3_print;
+asn_constr_check_f ProtocolIE_SingleContainer_1547P3_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_1547P3_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_1547P3_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_1547P3_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_1547P3_encode_xer;
+per_type_decoder_f ProtocolIE_SingleContainer_1547P3_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_1547P3_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_1547P3_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_1547P3_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_1547P4;
+asn_struct_free_f ProtocolIE_SingleContainer_1547P4_free;
+asn_struct_print_f ProtocolIE_SingleContainer_1547P4_print;
+asn_constr_check_f ProtocolIE_SingleContainer_1547P4_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_1547P4_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_1547P4_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_1547P4_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_1547P4_encode_xer;
+per_type_decoder_f ProtocolIE_SingleContainer_1547P4_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_1547P4_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_1547P4_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_1547P4_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_1547P5;
+asn_struct_free_f ProtocolIE_SingleContainer_1547P5_free;
+asn_struct_print_f ProtocolIE_SingleContainer_1547P5_print;
+asn_constr_check_f ProtocolIE_SingleContainer_1547P5_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_1547P5_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_1547P5_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_1547P5_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_1547P5_encode_xer;
+per_type_decoder_f ProtocolIE_SingleContainer_1547P5_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_1547P5_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_1547P5_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_1547P5_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_SingleContainer_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RANfunction-Item.c b/3rdparty/E2AP-v01.00.00/RANfunction-Item.c
new file mode 100644
index 0000000..a5126a8
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunction-Item.c
@@ -0,0 +1,70 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RANfunction-Item.h"
+
+static asn_TYPE_member_t asn_MBR_RANfunction_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunction_Item, ranFunctionID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANfunctionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ranFunctionID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunction_Item, ranFunctionDefinition),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANfunctionDefinition,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ranFunctionDefinition"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunction_Item, ranFunctionRevision),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANfunctionRevision,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ranFunctionRevision"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANfunction_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANfunction_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranFunctionID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ranFunctionDefinition */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ranFunctionRevision */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANfunction_Item_specs_1 = {
+	sizeof(struct RANfunction_Item),
+	offsetof(struct RANfunction_Item, _asn_ctx),
+	asn_MAP_RANfunction_Item_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	3,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RANfunction_Item = {
+	"RANfunction-Item",
+	"RANfunction-Item",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RANfunction_Item_tags_1,
+	sizeof(asn_DEF_RANfunction_Item_tags_1)
+		/sizeof(asn_DEF_RANfunction_Item_tags_1[0]), /* 1 */
+	asn_DEF_RANfunction_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANfunction_Item_tags_1)
+		/sizeof(asn_DEF_RANfunction_Item_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RANfunction_Item_1,
+	3,	/* Elements count */
+	&asn_SPC_RANfunction_Item_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RANfunction-Item.h b/3rdparty/E2AP-v01.00.00/RANfunction-Item.h
new file mode 100644
index 0000000..493fa92
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunction-Item.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RANfunction_Item_H_
+#define	_RANfunction_Item_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "RANfunctionID.h"
+#include "RANfunctionDefinition.h"
+#include "RANfunctionRevision.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANfunction-Item */
+typedef struct RANfunction_Item {
+	RANfunctionID_t	 ranFunctionID;
+	RANfunctionDefinition_t	 ranFunctionDefinition;
+	RANfunctionRevision_t	 ranFunctionRevision;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANfunction_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANfunction_Item;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANfunction_Item_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctionDefinition.c b/3rdparty/E2AP-v01.00.00/RANfunctionDefinition.c
new file mode 100644
index 0000000..305f870
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctionDefinition.c
@@ -0,0 +1,31 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RANfunctionDefinition.h"
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static const ber_tlv_tag_t asn_DEF_RANfunctionDefinition_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANfunctionDefinition = {
+	"RANfunctionDefinition",
+	"RANfunctionDefinition",
+	&asn_OP_OCTET_STRING,
+	asn_DEF_RANfunctionDefinition_tags_1,
+	sizeof(asn_DEF_RANfunctionDefinition_tags_1)
+		/sizeof(asn_DEF_RANfunctionDefinition_tags_1[0]), /* 1 */
+	asn_DEF_RANfunctionDefinition_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANfunctionDefinition_tags_1)
+		/sizeof(asn_DEF_RANfunctionDefinition_tags_1[0]), /* 1 */
+	{ 0, 0, OCTET_STRING_constraint },
+	0, 0,	/* No members */
+	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctionDefinition.h b/3rdparty/E2AP-v01.00.00/RANfunctionDefinition.h
new file mode 100644
index 0000000..19e695b
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctionDefinition.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RANfunctionDefinition_H_
+#define	_RANfunctionDefinition_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "OCTET_STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANfunctionDefinition */
+typedef OCTET_STRING_t	 RANfunctionDefinition_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANfunctionDefinition;
+asn_struct_free_f RANfunctionDefinition_free;
+asn_struct_print_f RANfunctionDefinition_print;
+asn_constr_check_f RANfunctionDefinition_constraint;
+ber_type_decoder_f RANfunctionDefinition_decode_ber;
+der_type_encoder_f RANfunctionDefinition_encode_der;
+xer_type_decoder_f RANfunctionDefinition_decode_xer;
+xer_type_encoder_f RANfunctionDefinition_encode_xer;
+per_type_decoder_f RANfunctionDefinition_decode_uper;
+per_type_encoder_f RANfunctionDefinition_encode_uper;
+per_type_decoder_f RANfunctionDefinition_decode_aper;
+per_type_encoder_f RANfunctionDefinition_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANfunctionDefinition_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctionID-Item.c b/3rdparty/E2AP-v01.00.00/RANfunctionID-Item.c
new file mode 100644
index 0000000..1a29f0f
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctionID-Item.c
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RANfunctionID-Item.h"
+
+static asn_TYPE_member_t asn_MBR_RANfunctionID_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_Item, ranFunctionID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANfunctionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ranFunctionID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_Item, ranFunctionRevision),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANfunctionRevision,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ranFunctionRevision"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANfunctionID_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANfunctionID_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranFunctionID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ranFunctionRevision */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANfunctionID_Item_specs_1 = {
+	sizeof(struct RANfunctionID_Item),
+	offsetof(struct RANfunctionID_Item, _asn_ctx),
+	asn_MAP_RANfunctionID_Item_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RANfunctionID_Item = {
+	"RANfunctionID-Item",
+	"RANfunctionID-Item",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RANfunctionID_Item_tags_1,
+	sizeof(asn_DEF_RANfunctionID_Item_tags_1)
+		/sizeof(asn_DEF_RANfunctionID_Item_tags_1[0]), /* 1 */
+	asn_DEF_RANfunctionID_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANfunctionID_Item_tags_1)
+		/sizeof(asn_DEF_RANfunctionID_Item_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RANfunctionID_Item_1,
+	2,	/* Elements count */
+	&asn_SPC_RANfunctionID_Item_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctionID-Item.h b/3rdparty/E2AP-v01.00.00/RANfunctionID-Item.h
new file mode 100644
index 0000000..4ca8a3c
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctionID-Item.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RANfunctionID_Item_H_
+#define	_RANfunctionID_Item_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "RANfunctionID.h"
+#include "RANfunctionRevision.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANfunctionID-Item */
+typedef struct RANfunctionID_Item {
+	RANfunctionID_t	 ranFunctionID;
+	RANfunctionRevision_t	 ranFunctionRevision;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANfunctionID_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANfunctionID_Item;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANfunctionID_Item_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctionID.c b/3rdparty/E2AP-v01.00.00/RANfunctionID.c
new file mode 100644
index 0000000..0aec77e
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctionID.c
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RANfunctionID.h"
+
+int
+RANfunctionID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 4095)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_RANfunctionID_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 12,  12,  0,  4095 }	/* (0..4095) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANfunctionID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANfunctionID = {
+	"RANfunctionID",
+	"RANfunctionID",
+	&asn_OP_NativeInteger,
+	asn_DEF_RANfunctionID_tags_1,
+	sizeof(asn_DEF_RANfunctionID_tags_1)
+		/sizeof(asn_DEF_RANfunctionID_tags_1[0]), /* 1 */
+	asn_DEF_RANfunctionID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANfunctionID_tags_1)
+		/sizeof(asn_DEF_RANfunctionID_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RANfunctionID_constr_1, RANfunctionID_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctionID.h b/3rdparty/E2AP-v01.00.00/RANfunctionID.h
new file mode 100644
index 0000000..ba46505
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctionID.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RANfunctionID_H_
+#define	_RANfunctionID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANfunctionID */
+typedef long	 RANfunctionID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_RANfunctionID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_RANfunctionID;
+asn_struct_free_f RANfunctionID_free;
+asn_struct_print_f RANfunctionID_print;
+asn_constr_check_f RANfunctionID_constraint;
+ber_type_decoder_f RANfunctionID_decode_ber;
+der_type_encoder_f RANfunctionID_encode_der;
+xer_type_decoder_f RANfunctionID_decode_xer;
+xer_type_encoder_f RANfunctionID_encode_xer;
+per_type_decoder_f RANfunctionID_decode_uper;
+per_type_encoder_f RANfunctionID_encode_uper;
+per_type_decoder_f RANfunctionID_decode_aper;
+per_type_encoder_f RANfunctionID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANfunctionID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctionIDcause-Item.c b/3rdparty/E2AP-v01.00.00/RANfunctionIDcause-Item.c
new file mode 100644
index 0000000..36ffadb
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctionIDcause-Item.c
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RANfunctionIDcause-Item.h"
+
+static asn_TYPE_member_t asn_MBR_RANfunctionIDcause_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_Item, ranFunctionID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANfunctionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ranFunctionID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_Item, cause),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_Cause,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"cause"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANfunctionIDcause_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANfunctionIDcause_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranFunctionID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* cause */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANfunctionIDcause_Item_specs_1 = {
+	sizeof(struct RANfunctionIDcause_Item),
+	offsetof(struct RANfunctionIDcause_Item, _asn_ctx),
+	asn_MAP_RANfunctionIDcause_Item_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_Item = {
+	"RANfunctionIDcause-Item",
+	"RANfunctionIDcause-Item",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RANfunctionIDcause_Item_tags_1,
+	sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1)
+		/sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1[0]), /* 1 */
+	asn_DEF_RANfunctionIDcause_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1)
+		/sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RANfunctionIDcause_Item_1,
+	2,	/* Elements count */
+	&asn_SPC_RANfunctionIDcause_Item_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctionIDcause-Item.h b/3rdparty/E2AP-v01.00.00/RANfunctionIDcause-Item.h
new file mode 100644
index 0000000..fca8e13
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctionIDcause-Item.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RANfunctionIDcause_Item_H_
+#define	_RANfunctionIDcause_Item_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "RANfunctionID.h"
+#include "Cause.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANfunctionIDcause-Item */
+typedef struct RANfunctionIDcause_Item {
+	RANfunctionID_t	 ranFunctionID;
+	Cause_t	 cause;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANfunctionIDcause_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_Item;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANfunctionIDcause_Item_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctionRevision.c b/3rdparty/E2AP-v01.00.00/RANfunctionRevision.c
new file mode 100644
index 0000000..baaa864
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctionRevision.c
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RANfunctionRevision.h"
+
+int
+RANfunctionRevision_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 4095)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_RANfunctionRevision_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 12,  12,  0,  4095 }	/* (0..4095) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANfunctionRevision_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANfunctionRevision = {
+	"RANfunctionRevision",
+	"RANfunctionRevision",
+	&asn_OP_NativeInteger,
+	asn_DEF_RANfunctionRevision_tags_1,
+	sizeof(asn_DEF_RANfunctionRevision_tags_1)
+		/sizeof(asn_DEF_RANfunctionRevision_tags_1[0]), /* 1 */
+	asn_DEF_RANfunctionRevision_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANfunctionRevision_tags_1)
+		/sizeof(asn_DEF_RANfunctionRevision_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RANfunctionRevision_constr_1, RANfunctionRevision_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctionRevision.h b/3rdparty/E2AP-v01.00.00/RANfunctionRevision.h
new file mode 100644
index 0000000..e17e042
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctionRevision.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RANfunctionRevision_H_
+#define	_RANfunctionRevision_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANfunctionRevision */
+typedef long	 RANfunctionRevision_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_RANfunctionRevision_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_RANfunctionRevision;
+asn_struct_free_f RANfunctionRevision_free;
+asn_struct_print_f RANfunctionRevision_print;
+asn_constr_check_f RANfunctionRevision_constraint;
+ber_type_decoder_f RANfunctionRevision_decode_ber;
+der_type_encoder_f RANfunctionRevision_encode_der;
+xer_type_decoder_f RANfunctionRevision_decode_xer;
+xer_type_encoder_f RANfunctionRevision_encode_xer;
+per_type_decoder_f RANfunctionRevision_decode_uper;
+per_type_encoder_f RANfunctionRevision_encode_uper;
+per_type_decoder_f RANfunctionRevision_decode_aper;
+per_type_encoder_f RANfunctionRevision_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANfunctionRevision_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctions-List.c b/3rdparty/E2AP-v01.00.00/RANfunctions-List.c
new file mode 100644
index 0000000..e1539c3
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctions-List.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RANfunctions-List.h"
+
+#include "ProtocolIE-SingleContainer.h"
+static asn_per_constraints_t asn_PER_type_RANfunctions_List_constr_1 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 9,  9,  0,  256 }	/* (SIZE(0..256)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANfunctions_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_ProtocolIE_SingleContainer_1547P3,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANfunctions_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANfunctions_List_specs_1 = {
+	sizeof(struct RANfunctions_List),
+	offsetof(struct RANfunctions_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANfunctions_List = {
+	"RANfunctions-List",
+	"RANfunctions-List",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_RANfunctions_List_tags_1,
+	sizeof(asn_DEF_RANfunctions_List_tags_1)
+		/sizeof(asn_DEF_RANfunctions_List_tags_1[0]), /* 1 */
+	asn_DEF_RANfunctions_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANfunctions_List_tags_1)
+		/sizeof(asn_DEF_RANfunctions_List_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RANfunctions_List_constr_1, SEQUENCE_OF_constraint },
+	asn_MBR_RANfunctions_List_1,
+	1,	/* Single element */
+	&asn_SPC_RANfunctions_List_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctions-List.h b/3rdparty/E2AP-v01.00.00/RANfunctions-List.h
new file mode 100644
index 0000000..755b13a
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctions-List.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RANfunctions_List_H_
+#define	_RANfunctions_List_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "asn_SEQUENCE_OF.h"
+#include "constr_SEQUENCE_OF.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* RANfunctions-List */
+typedef struct RANfunctions_List {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANfunctions_List_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANfunctions_List;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANfunctions_List_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctionsID-List.c b/3rdparty/E2AP-v01.00.00/RANfunctionsID-List.c
new file mode 100644
index 0000000..8d10347
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctionsID-List.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RANfunctionsID-List.h"
+
+#include "ProtocolIE-SingleContainer.h"
+static asn_per_constraints_t asn_PER_type_RANfunctionsID_List_constr_1 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 9,  9,  0,  256 }	/* (SIZE(0..256)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANfunctionsID_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_ProtocolIE_SingleContainer_1547P4,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANfunctionsID_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANfunctionsID_List_specs_1 = {
+	sizeof(struct RANfunctionsID_List),
+	offsetof(struct RANfunctionsID_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANfunctionsID_List = {
+	"RANfunctionsID-List",
+	"RANfunctionsID-List",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_RANfunctionsID_List_tags_1,
+	sizeof(asn_DEF_RANfunctionsID_List_tags_1)
+		/sizeof(asn_DEF_RANfunctionsID_List_tags_1[0]), /* 1 */
+	asn_DEF_RANfunctionsID_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANfunctionsID_List_tags_1)
+		/sizeof(asn_DEF_RANfunctionsID_List_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RANfunctionsID_List_constr_1, SEQUENCE_OF_constraint },
+	asn_MBR_RANfunctionsID_List_1,
+	1,	/* Single element */
+	&asn_SPC_RANfunctionsID_List_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctionsID-List.h b/3rdparty/E2AP-v01.00.00/RANfunctionsID-List.h
new file mode 100644
index 0000000..688d528
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctionsID-List.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RANfunctionsID_List_H_
+#define	_RANfunctionsID_List_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "asn_SEQUENCE_OF.h"
+#include "constr_SEQUENCE_OF.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* RANfunctionsID-List */
+typedef struct RANfunctionsID_List {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANfunctionsID_List_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANfunctionsID_List;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANfunctionsID_List_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctionsIDcause-List.c b/3rdparty/E2AP-v01.00.00/RANfunctionsIDcause-List.c
new file mode 100644
index 0000000..43f7c61
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctionsIDcause-List.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RANfunctionsIDcause-List.h"
+
+#include "ProtocolIE-SingleContainer.h"
+static asn_per_constraints_t asn_PER_type_RANfunctionsIDcause_List_constr_1 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 9,  9,  0,  256 }	/* (SIZE(0..256)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANfunctionsIDcause_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_ProtocolIE_SingleContainer_1547P5,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANfunctionsIDcause_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANfunctionsIDcause_List_specs_1 = {
+	sizeof(struct RANfunctionsIDcause_List),
+	offsetof(struct RANfunctionsIDcause_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANfunctionsIDcause_List = {
+	"RANfunctionsIDcause-List",
+	"RANfunctionsIDcause-List",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_RANfunctionsIDcause_List_tags_1,
+	sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1)
+		/sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1[0]), /* 1 */
+	asn_DEF_RANfunctionsIDcause_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1)
+		/sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RANfunctionsIDcause_List_constr_1, SEQUENCE_OF_constraint },
+	asn_MBR_RANfunctionsIDcause_List_1,
+	1,	/* Single element */
+	&asn_SPC_RANfunctionsIDcause_List_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RANfunctionsIDcause-List.h b/3rdparty/E2AP-v01.00.00/RANfunctionsIDcause-List.h
new file mode 100644
index 0000000..18b1551
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RANfunctionsIDcause-List.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RANfunctionsIDcause_List_H_
+#define	_RANfunctionsIDcause_List_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "asn_SEQUENCE_OF.h"
+#include "constr_SEQUENCE_OF.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* RANfunctionsIDcause-List */
+typedef struct RANfunctionsIDcause_List {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANfunctionsIDcause_List_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANfunctionsIDcause_List;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANfunctionsIDcause_List_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICaction-Admitted-Item.c b/3rdparty/E2AP-v01.00.00/RICaction-Admitted-Item.c
new file mode 100644
index 0000000..3ab5d81
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICaction-Admitted-Item.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICaction-Admitted-Item.h"
+
+static asn_TYPE_member_t asn_MBR_RICaction_Admitted_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_Item, ricActionID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RICactionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ricActionID"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICaction_Admitted_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICaction_Admitted_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* ricActionID */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RICaction_Admitted_Item_specs_1 = {
+	sizeof(struct RICaction_Admitted_Item),
+	offsetof(struct RICaction_Admitted_Item, _asn_ctx),
+	asn_MAP_RICaction_Admitted_Item_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_Item = {
+	"RICaction-Admitted-Item",
+	"RICaction-Admitted-Item",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICaction_Admitted_Item_tags_1,
+	sizeof(asn_DEF_RICaction_Admitted_Item_tags_1)
+		/sizeof(asn_DEF_RICaction_Admitted_Item_tags_1[0]), /* 1 */
+	asn_DEF_RICaction_Admitted_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICaction_Admitted_Item_tags_1)
+		/sizeof(asn_DEF_RICaction_Admitted_Item_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICaction_Admitted_Item_1,
+	1,	/* Elements count */
+	&asn_SPC_RICaction_Admitted_Item_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICaction-Admitted-Item.h b/3rdparty/E2AP-v01.00.00/RICaction-Admitted-Item.h
new file mode 100644
index 0000000..2a975d6
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICaction-Admitted-Item.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICaction_Admitted_Item_H_
+#define	_RICaction_Admitted_Item_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "RICactionID.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICaction-Admitted-Item */
+typedef struct RICaction_Admitted_Item {
+	RICactionID_t	 ricActionID;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICaction_Admitted_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_Item;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICaction_Admitted_Item_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICaction-Admitted-List.c b/3rdparty/E2AP-v01.00.00/RICaction-Admitted-List.c
new file mode 100644
index 0000000..f4a6cdf
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICaction-Admitted-List.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICaction-Admitted-List.h"
+
+#include "ProtocolIE-SingleContainer.h"
+static asn_per_constraints_t asn_PER_type_RICaction_Admitted_List_constr_1 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1,  16 }	/* (SIZE(1..16)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RICaction_Admitted_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_ProtocolIE_SingleContainer_1547P1,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICaction_Admitted_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RICaction_Admitted_List_specs_1 = {
+	sizeof(struct RICaction_Admitted_List),
+	offsetof(struct RICaction_Admitted_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_List = {
+	"RICaction-Admitted-List",
+	"RICaction-Admitted-List",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_RICaction_Admitted_List_tags_1,
+	sizeof(asn_DEF_RICaction_Admitted_List_tags_1)
+		/sizeof(asn_DEF_RICaction_Admitted_List_tags_1[0]), /* 1 */
+	asn_DEF_RICaction_Admitted_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICaction_Admitted_List_tags_1)
+		/sizeof(asn_DEF_RICaction_Admitted_List_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RICaction_Admitted_List_constr_1, SEQUENCE_OF_constraint },
+	asn_MBR_RICaction_Admitted_List_1,
+	1,	/* Single element */
+	&asn_SPC_RICaction_Admitted_List_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICaction-Admitted-List.h b/3rdparty/E2AP-v01.00.00/RICaction-Admitted-List.h
new file mode 100644
index 0000000..2e7409f
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICaction-Admitted-List.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICaction_Admitted_List_H_
+#define	_RICaction_Admitted_List_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "asn_SEQUENCE_OF.h"
+#include "constr_SEQUENCE_OF.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* RICaction-Admitted-List */
+typedef struct RICaction_Admitted_List {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICaction_Admitted_List_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_List;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICaction_Admitted_List_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICaction-NotAdmitted-Item.c b/3rdparty/E2AP-v01.00.00/RICaction-NotAdmitted-Item.c
new file mode 100644
index 0000000..88a91bf
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICaction-NotAdmitted-Item.c
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICaction-NotAdmitted-Item.h"
+
+static asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_Item, ricActionID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RICactionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ricActionID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_Item, cause),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_Cause,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"cause"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICaction_NotAdmitted_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICaction_NotAdmitted_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricActionID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* cause */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RICaction_NotAdmitted_Item_specs_1 = {
+	sizeof(struct RICaction_NotAdmitted_Item),
+	offsetof(struct RICaction_NotAdmitted_Item, _asn_ctx),
+	asn_MAP_RICaction_NotAdmitted_Item_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_Item = {
+	"RICaction-NotAdmitted-Item",
+	"RICaction-NotAdmitted-Item",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICaction_NotAdmitted_Item_tags_1,
+	sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1)
+		/sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1[0]), /* 1 */
+	asn_DEF_RICaction_NotAdmitted_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1)
+		/sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICaction_NotAdmitted_Item_1,
+	2,	/* Elements count */
+	&asn_SPC_RICaction_NotAdmitted_Item_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICaction-NotAdmitted-Item.h b/3rdparty/E2AP-v01.00.00/RICaction-NotAdmitted-Item.h
new file mode 100644
index 0000000..212f134
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICaction-NotAdmitted-Item.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICaction_NotAdmitted_Item_H_
+#define	_RICaction_NotAdmitted_Item_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "RICactionID.h"
+#include "Cause.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICaction-NotAdmitted-Item */
+typedef struct RICaction_NotAdmitted_Item {
+	RICactionID_t	 ricActionID;
+	Cause_t	 cause;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICaction_NotAdmitted_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_Item;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICaction_NotAdmitted_Item_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICaction-NotAdmitted-List.c b/3rdparty/E2AP-v01.00.00/RICaction-NotAdmitted-List.c
new file mode 100644
index 0000000..1d1e480
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICaction-NotAdmitted-List.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICaction-NotAdmitted-List.h"
+
+#include "ProtocolIE-SingleContainer.h"
+static asn_per_constraints_t asn_PER_type_RICaction_NotAdmitted_List_constr_1 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 5,  5,  0,  16 }	/* (SIZE(0..16)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_ProtocolIE_SingleContainer_1547P2,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICaction_NotAdmitted_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RICaction_NotAdmitted_List_specs_1 = {
+	sizeof(struct RICaction_NotAdmitted_List),
+	offsetof(struct RICaction_NotAdmitted_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_List = {
+	"RICaction-NotAdmitted-List",
+	"RICaction-NotAdmitted-List",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_RICaction_NotAdmitted_List_tags_1,
+	sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1)
+		/sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1[0]), /* 1 */
+	asn_DEF_RICaction_NotAdmitted_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1)
+		/sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RICaction_NotAdmitted_List_constr_1, SEQUENCE_OF_constraint },
+	asn_MBR_RICaction_NotAdmitted_List_1,
+	1,	/* Single element */
+	&asn_SPC_RICaction_NotAdmitted_List_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICaction-NotAdmitted-List.h b/3rdparty/E2AP-v01.00.00/RICaction-NotAdmitted-List.h
new file mode 100644
index 0000000..1c466bb
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICaction-NotAdmitted-List.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICaction_NotAdmitted_List_H_
+#define	_RICaction_NotAdmitted_List_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "asn_SEQUENCE_OF.h"
+#include "constr_SEQUENCE_OF.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* RICaction-NotAdmitted-List */
+typedef struct RICaction_NotAdmitted_List {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICaction_NotAdmitted_List_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_List;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICaction_NotAdmitted_List_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICaction-ToBeSetup-Item.c b/3rdparty/E2AP-v01.00.00/RICaction-ToBeSetup-Item.c
new file mode 100644
index 0000000..9353828
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICaction-ToBeSetup-Item.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICaction-ToBeSetup-Item.h"
+
+#include "RICsubsequentAction.h"
+static asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_Item, ricActionID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RICactionID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ricActionID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_Item, ricActionType),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RICactionType,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ricActionType"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RICaction_ToBeSetup_Item, ricActionDefinition),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RICactionDefinition,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ricActionDefinition"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RICaction_ToBeSetup_Item, ricSubsequentAction),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RICsubsequentAction,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ricSubsequentAction"
+		},
+};
+static const int asn_MAP_RICaction_ToBeSetup_Item_oms_1[] = { 2, 3 };
+static const ber_tlv_tag_t asn_DEF_RICaction_ToBeSetup_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICaction_ToBeSetup_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricActionID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ricActionType */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ricActionDefinition */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* ricSubsequentAction */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RICaction_ToBeSetup_Item_specs_1 = {
+	sizeof(struct RICaction_ToBeSetup_Item),
+	offsetof(struct RICaction_ToBeSetup_Item, _asn_ctx),
+	asn_MAP_RICaction_ToBeSetup_Item_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RICaction_ToBeSetup_Item_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	4,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_Item = {
+	"RICaction-ToBeSetup-Item",
+	"RICaction-ToBeSetup-Item",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICaction_ToBeSetup_Item_tags_1,
+	sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1)
+		/sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1[0]), /* 1 */
+	asn_DEF_RICaction_ToBeSetup_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1)
+		/sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICaction_ToBeSetup_Item_1,
+	4,	/* Elements count */
+	&asn_SPC_RICaction_ToBeSetup_Item_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICaction-ToBeSetup-Item.h b/3rdparty/E2AP-v01.00.00/RICaction-ToBeSetup-Item.h
new file mode 100644
index 0000000..0af75a5
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICaction-ToBeSetup-Item.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICaction_ToBeSetup_Item_H_
+#define	_RICaction_ToBeSetup_Item_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "RICactionID.h"
+#include "RICactionType.h"
+#include "RICactionDefinition.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct RICsubsequentAction;
+
+/* RICaction-ToBeSetup-Item */
+typedef struct RICaction_ToBeSetup_Item {
+	RICactionID_t	 ricActionID;
+	RICactionType_t	 ricActionType;
+	RICactionDefinition_t	*ricActionDefinition;	/* OPTIONAL */
+	struct RICsubsequentAction	*ricSubsequentAction;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICaction_ToBeSetup_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_Item;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICaction_ToBeSetup_Item_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICactionDefinition.c b/3rdparty/E2AP-v01.00.00/RICactionDefinition.c
new file mode 100644
index 0000000..9efbe34
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICactionDefinition.c
@@ -0,0 +1,31 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICactionDefinition.h"
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static const ber_tlv_tag_t asn_DEF_RICactionDefinition_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICactionDefinition = {
+	"RICactionDefinition",
+	"RICactionDefinition",
+	&asn_OP_OCTET_STRING,
+	asn_DEF_RICactionDefinition_tags_1,
+	sizeof(asn_DEF_RICactionDefinition_tags_1)
+		/sizeof(asn_DEF_RICactionDefinition_tags_1[0]), /* 1 */
+	asn_DEF_RICactionDefinition_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICactionDefinition_tags_1)
+		/sizeof(asn_DEF_RICactionDefinition_tags_1[0]), /* 1 */
+	{ 0, 0, OCTET_STRING_constraint },
+	0, 0,	/* No members */
+	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICactionDefinition.h b/3rdparty/E2AP-v01.00.00/RICactionDefinition.h
new file mode 100644
index 0000000..32e105b
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICactionDefinition.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICactionDefinition_H_
+#define	_RICactionDefinition_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "OCTET_STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICactionDefinition */
+typedef OCTET_STRING_t	 RICactionDefinition_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICactionDefinition;
+asn_struct_free_f RICactionDefinition_free;
+asn_struct_print_f RICactionDefinition_print;
+asn_constr_check_f RICactionDefinition_constraint;
+ber_type_decoder_f RICactionDefinition_decode_ber;
+der_type_encoder_f RICactionDefinition_encode_der;
+xer_type_decoder_f RICactionDefinition_decode_xer;
+xer_type_encoder_f RICactionDefinition_encode_xer;
+per_type_decoder_f RICactionDefinition_decode_uper;
+per_type_encoder_f RICactionDefinition_encode_uper;
+per_type_decoder_f RICactionDefinition_decode_aper;
+per_type_encoder_f RICactionDefinition_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICactionDefinition_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICactionID.c b/3rdparty/E2AP-v01.00.00/RICactionID.c
new file mode 100644
index 0000000..992850d
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICactionID.c
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICactionID.h"
+
+int
+RICactionID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 255)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_RICactionID_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0,  255 }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RICactionID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICactionID = {
+	"RICactionID",
+	"RICactionID",
+	&asn_OP_NativeInteger,
+	asn_DEF_RICactionID_tags_1,
+	sizeof(asn_DEF_RICactionID_tags_1)
+		/sizeof(asn_DEF_RICactionID_tags_1[0]), /* 1 */
+	asn_DEF_RICactionID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICactionID_tags_1)
+		/sizeof(asn_DEF_RICactionID_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RICactionID_constr_1, RICactionID_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICactionID.h b/3rdparty/E2AP-v01.00.00/RICactionID.h
new file mode 100644
index 0000000..d637b02
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICactionID.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICactionID_H_
+#define	_RICactionID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICactionID */
+typedef long	 RICactionID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_RICactionID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_RICactionID;
+asn_struct_free_f RICactionID_free;
+asn_struct_print_f RICactionID_print;
+asn_constr_check_f RICactionID_constraint;
+ber_type_decoder_f RICactionID_decode_ber;
+der_type_encoder_f RICactionID_encode_der;
+xer_type_decoder_f RICactionID_decode_xer;
+xer_type_encoder_f RICactionID_encode_xer;
+per_type_decoder_f RICactionID_decode_uper;
+per_type_encoder_f RICactionID_encode_uper;
+per_type_decoder_f RICactionID_decode_aper;
+per_type_encoder_f RICactionID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICactionID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICactionType.c b/3rdparty/E2AP-v01.00.00/RICactionType.c
new file mode 100644
index 0000000..6f0ac6f
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICactionType.c
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICactionType.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_RICactionType_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RICactionType_value2enum_1[] = {
+	{ 0,	6,	"report" },
+	{ 1,	6,	"insert" },
+	{ 2,	6,	"policy" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RICactionType_enum2value_1[] = {
+	1,	/* insert(1) */
+	2,	/* policy(2) */
+	0	/* report(0) */
+	/* This list is extensible */
+};
+const asn_INTEGER_specifics_t asn_SPC_RICactionType_specs_1 = {
+	asn_MAP_RICactionType_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RICactionType_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	4,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RICactionType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICactionType = {
+	"RICactionType",
+	"RICactionType",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_RICactionType_tags_1,
+	sizeof(asn_DEF_RICactionType_tags_1)
+		/sizeof(asn_DEF_RICactionType_tags_1[0]), /* 1 */
+	asn_DEF_RICactionType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICactionType_tags_1)
+		/sizeof(asn_DEF_RICactionType_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RICactionType_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RICactionType_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICactionType.h b/3rdparty/E2AP-v01.00.00/RICactionType.h
new file mode 100644
index 0000000..986db35
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICactionType.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICactionType_H_
+#define	_RICactionType_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RICactionType {
+	RICactionType_report	= 0,
+	RICactionType_insert	= 1,
+	RICactionType_policy	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RICactionType;
+
+/* RICactionType */
+typedef long	 RICactionType_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_RICactionType_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_RICactionType;
+extern const asn_INTEGER_specifics_t asn_SPC_RICactionType_specs_1;
+asn_struct_free_f RICactionType_free;
+asn_struct_print_f RICactionType_print;
+asn_constr_check_f RICactionType_constraint;
+ber_type_decoder_f RICactionType_decode_ber;
+der_type_encoder_f RICactionType_encode_der;
+xer_type_decoder_f RICactionType_decode_xer;
+xer_type_encoder_f RICactionType_encode_xer;
+per_type_decoder_f RICactionType_decode_uper;
+per_type_encoder_f RICactionType_encode_uper;
+per_type_decoder_f RICactionType_decode_aper;
+per_type_encoder_f RICactionType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICactionType_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICactions-ToBeSetup-List.c b/3rdparty/E2AP-v01.00.00/RICactions-ToBeSetup-List.c
new file mode 100644
index 0000000..163c656
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICactions-ToBeSetup-List.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICactions-ToBeSetup-List.h"
+
+#include "ProtocolIE-SingleContainer.h"
+asn_per_constraints_t asn_PER_type_RICactions_ToBeSetup_List_constr_1 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1,  16 }	/* (SIZE(1..16)) */,
+	0, 0	/* No PER value map */
+};
+asn_TYPE_member_t asn_MBR_RICactions_ToBeSetup_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_ProtocolIE_SingleContainer_1547P0,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICactions_ToBeSetup_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_SET_OF_specifics_t asn_SPC_RICactions_ToBeSetup_List_specs_1 = {
+	sizeof(struct RICactions_ToBeSetup_List),
+	offsetof(struct RICactions_ToBeSetup_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RICactions_ToBeSetup_List = {
+	"RICactions-ToBeSetup-List",
+	"RICactions-ToBeSetup-List",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_RICactions_ToBeSetup_List_tags_1,
+	sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1)
+		/sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1[0]), /* 1 */
+	asn_DEF_RICactions_ToBeSetup_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1)
+		/sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RICactions_ToBeSetup_List_constr_1, SEQUENCE_OF_constraint },
+	asn_MBR_RICactions_ToBeSetup_List_1,
+	1,	/* Single element */
+	&asn_SPC_RICactions_ToBeSetup_List_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICactions-ToBeSetup-List.h b/3rdparty/E2AP-v01.00.00/RICactions-ToBeSetup-List.h
new file mode 100644
index 0000000..3a3178b
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICactions-ToBeSetup-List.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICactions_ToBeSetup_List_H_
+#define	_RICactions_ToBeSetup_List_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "asn_SEQUENCE_OF.h"
+#include "constr_SEQUENCE_OF.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* RICactions-ToBeSetup-List */
+typedef struct RICactions_ToBeSetup_List {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICactions_ToBeSetup_List_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICactions_ToBeSetup_List;
+extern asn_SET_OF_specifics_t asn_SPC_RICactions_ToBeSetup_List_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICactions_ToBeSetup_List_1[1];
+extern asn_per_constraints_t asn_PER_type_RICactions_ToBeSetup_List_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICactions_ToBeSetup_List_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICcallProcessID.c b/3rdparty/E2AP-v01.00.00/RICcallProcessID.c
new file mode 100644
index 0000000..96bf622
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcallProcessID.c
@@ -0,0 +1,31 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICcallProcessID.h"
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static const ber_tlv_tag_t asn_DEF_RICcallProcessID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICcallProcessID = {
+	"RICcallProcessID",
+	"RICcallProcessID",
+	&asn_OP_OCTET_STRING,
+	asn_DEF_RICcallProcessID_tags_1,
+	sizeof(asn_DEF_RICcallProcessID_tags_1)
+		/sizeof(asn_DEF_RICcallProcessID_tags_1[0]), /* 1 */
+	asn_DEF_RICcallProcessID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICcallProcessID_tags_1)
+		/sizeof(asn_DEF_RICcallProcessID_tags_1[0]), /* 1 */
+	{ 0, 0, OCTET_STRING_constraint },
+	0, 0,	/* No members */
+	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICcallProcessID.h b/3rdparty/E2AP-v01.00.00/RICcallProcessID.h
new file mode 100644
index 0000000..a46e4e1
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcallProcessID.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICcallProcessID_H_
+#define	_RICcallProcessID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "OCTET_STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICcallProcessID */
+typedef OCTET_STRING_t	 RICcallProcessID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICcallProcessID;
+asn_struct_free_f RICcallProcessID_free;
+asn_struct_print_f RICcallProcessID_print;
+asn_constr_check_f RICcallProcessID_constraint;
+ber_type_decoder_f RICcallProcessID_decode_ber;
+der_type_encoder_f RICcallProcessID_encode_der;
+xer_type_decoder_f RICcallProcessID_decode_xer;
+xer_type_encoder_f RICcallProcessID_encode_xer;
+per_type_decoder_f RICcallProcessID_decode_uper;
+per_type_encoder_f RICcallProcessID_encode_uper;
+per_type_decoder_f RICcallProcessID_decode_aper;
+per_type_encoder_f RICcallProcessID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICcallProcessID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolAckRequest.c b/3rdparty/E2AP-v01.00.00/RICcontrolAckRequest.c
new file mode 100644
index 0000000..383e28a
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolAckRequest.c
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICcontrolAckRequest.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static asn_per_constraints_t asn_PER_type_RICcontrolAckRequest_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RICcontrolAckRequest_value2enum_1[] = {
+	{ 0,	5,	"noAck" },
+	{ 1,	3,	"ack" },
+	{ 2,	4,	"nAck" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RICcontrolAckRequest_enum2value_1[] = {
+	1,	/* ack(1) */
+	2,	/* nAck(2) */
+	0	/* noAck(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RICcontrolAckRequest_specs_1 = {
+	asn_MAP_RICcontrolAckRequest_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RICcontrolAckRequest_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	4,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RICcontrolAckRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICcontrolAckRequest = {
+	"RICcontrolAckRequest",
+	"RICcontrolAckRequest",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_RICcontrolAckRequest_tags_1,
+	sizeof(asn_DEF_RICcontrolAckRequest_tags_1)
+		/sizeof(asn_DEF_RICcontrolAckRequest_tags_1[0]), /* 1 */
+	asn_DEF_RICcontrolAckRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICcontrolAckRequest_tags_1)
+		/sizeof(asn_DEF_RICcontrolAckRequest_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RICcontrolAckRequest_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RICcontrolAckRequest_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolAckRequest.h b/3rdparty/E2AP-v01.00.00/RICcontrolAckRequest.h
new file mode 100644
index 0000000..5afa2c4
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolAckRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICcontrolAckRequest_H_
+#define	_RICcontrolAckRequest_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RICcontrolAckRequest {
+	RICcontrolAckRequest_noAck	= 0,
+	RICcontrolAckRequest_ack	= 1,
+	RICcontrolAckRequest_nAck	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RICcontrolAckRequest;
+
+/* RICcontrolAckRequest */
+typedef long	 RICcontrolAckRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICcontrolAckRequest;
+asn_struct_free_f RICcontrolAckRequest_free;
+asn_struct_print_f RICcontrolAckRequest_print;
+asn_constr_check_f RICcontrolAckRequest_constraint;
+ber_type_decoder_f RICcontrolAckRequest_decode_ber;
+der_type_encoder_f RICcontrolAckRequest_encode_der;
+xer_type_decoder_f RICcontrolAckRequest_decode_xer;
+xer_type_encoder_f RICcontrolAckRequest_encode_xer;
+per_type_decoder_f RICcontrolAckRequest_decode_uper;
+per_type_encoder_f RICcontrolAckRequest_encode_uper;
+per_type_decoder_f RICcontrolAckRequest_decode_aper;
+per_type_encoder_f RICcontrolAckRequest_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICcontrolAckRequest_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolAcknowledge.c b/3rdparty/E2AP-v01.00.00/RICcontrolAcknowledge.c
new file mode 100644
index 0000000..567025a
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolAcknowledge.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICcontrolAcknowledge.h"
+
+asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P8,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICcontrolAcknowledge_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICcontrolAcknowledge_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_specs_1 = {
+	sizeof(struct RICcontrolAcknowledge),
+	offsetof(struct RICcontrolAcknowledge, _asn_ctx),
+	asn_MAP_RICcontrolAcknowledge_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge = {
+	"RICcontrolAcknowledge",
+	"RICcontrolAcknowledge",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICcontrolAcknowledge_tags_1,
+	sizeof(asn_DEF_RICcontrolAcknowledge_tags_1)
+		/sizeof(asn_DEF_RICcontrolAcknowledge_tags_1[0]), /* 1 */
+	asn_DEF_RICcontrolAcknowledge_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICcontrolAcknowledge_tags_1)
+		/sizeof(asn_DEF_RICcontrolAcknowledge_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICcontrolAcknowledge_1,
+	1,	/* Elements count */
+	&asn_SPC_RICcontrolAcknowledge_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolAcknowledge.h b/3rdparty/E2AP-v01.00.00/RICcontrolAcknowledge.h
new file mode 100644
index 0000000..4942504
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolAcknowledge.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICcontrolAcknowledge_H_
+#define	_RICcontrolAcknowledge_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICcontrolAcknowledge */
+typedef struct RICcontrolAcknowledge {
+	ProtocolIE_Container_1544P8_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICcontrolAcknowledge_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICcontrolAcknowledge_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolFailure.c b/3rdparty/E2AP-v01.00.00/RICcontrolFailure.c
new file mode 100644
index 0000000..6e814cb
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolFailure.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICcontrolFailure.h"
+
+asn_TYPE_member_t asn_MBR_RICcontrolFailure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P9,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICcontrolFailure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICcontrolFailure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_specs_1 = {
+	sizeof(struct RICcontrolFailure),
+	offsetof(struct RICcontrolFailure, _asn_ctx),
+	asn_MAP_RICcontrolFailure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure = {
+	"RICcontrolFailure",
+	"RICcontrolFailure",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICcontrolFailure_tags_1,
+	sizeof(asn_DEF_RICcontrolFailure_tags_1)
+		/sizeof(asn_DEF_RICcontrolFailure_tags_1[0]), /* 1 */
+	asn_DEF_RICcontrolFailure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICcontrolFailure_tags_1)
+		/sizeof(asn_DEF_RICcontrolFailure_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICcontrolFailure_1,
+	1,	/* Elements count */
+	&asn_SPC_RICcontrolFailure_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolFailure.h b/3rdparty/E2AP-v01.00.00/RICcontrolFailure.h
new file mode 100644
index 0000000..70e81e0
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolFailure.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICcontrolFailure_H_
+#define	_RICcontrolFailure_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICcontrolFailure */
+typedef struct RICcontrolFailure {
+	ProtocolIE_Container_1544P9_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICcontrolFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICcontrolFailure_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICcontrolFailure_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolHeader.c b/3rdparty/E2AP-v01.00.00/RICcontrolHeader.c
new file mode 100644
index 0000000..858f55a
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolHeader.c
@@ -0,0 +1,31 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICcontrolHeader.h"
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static const ber_tlv_tag_t asn_DEF_RICcontrolHeader_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICcontrolHeader = {
+	"RICcontrolHeader",
+	"RICcontrolHeader",
+	&asn_OP_OCTET_STRING,
+	asn_DEF_RICcontrolHeader_tags_1,
+	sizeof(asn_DEF_RICcontrolHeader_tags_1)
+		/sizeof(asn_DEF_RICcontrolHeader_tags_1[0]), /* 1 */
+	asn_DEF_RICcontrolHeader_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICcontrolHeader_tags_1)
+		/sizeof(asn_DEF_RICcontrolHeader_tags_1[0]), /* 1 */
+	{ 0, 0, OCTET_STRING_constraint },
+	0, 0,	/* No members */
+	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolHeader.h b/3rdparty/E2AP-v01.00.00/RICcontrolHeader.h
new file mode 100644
index 0000000..8ffa7ce
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolHeader.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICcontrolHeader_H_
+#define	_RICcontrolHeader_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "OCTET_STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICcontrolHeader */
+typedef OCTET_STRING_t	 RICcontrolHeader_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICcontrolHeader;
+asn_struct_free_f RICcontrolHeader_free;
+asn_struct_print_f RICcontrolHeader_print;
+asn_constr_check_f RICcontrolHeader_constraint;
+ber_type_decoder_f RICcontrolHeader_decode_ber;
+der_type_encoder_f RICcontrolHeader_encode_der;
+xer_type_decoder_f RICcontrolHeader_decode_xer;
+xer_type_encoder_f RICcontrolHeader_encode_xer;
+per_type_decoder_f RICcontrolHeader_decode_uper;
+per_type_encoder_f RICcontrolHeader_encode_uper;
+per_type_decoder_f RICcontrolHeader_decode_aper;
+per_type_encoder_f RICcontrolHeader_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICcontrolHeader_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolMessage.c b/3rdparty/E2AP-v01.00.00/RICcontrolMessage.c
new file mode 100644
index 0000000..cb2d624
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolMessage.c
@@ -0,0 +1,31 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICcontrolMessage.h"
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static const ber_tlv_tag_t asn_DEF_RICcontrolMessage_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICcontrolMessage = {
+	"RICcontrolMessage",
+	"RICcontrolMessage",
+	&asn_OP_OCTET_STRING,
+	asn_DEF_RICcontrolMessage_tags_1,
+	sizeof(asn_DEF_RICcontrolMessage_tags_1)
+		/sizeof(asn_DEF_RICcontrolMessage_tags_1[0]), /* 1 */
+	asn_DEF_RICcontrolMessage_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICcontrolMessage_tags_1)
+		/sizeof(asn_DEF_RICcontrolMessage_tags_1[0]), /* 1 */
+	{ 0, 0, OCTET_STRING_constraint },
+	0, 0,	/* No members */
+	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolMessage.h b/3rdparty/E2AP-v01.00.00/RICcontrolMessage.h
new file mode 100644
index 0000000..689bd34
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolMessage.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICcontrolMessage_H_
+#define	_RICcontrolMessage_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "OCTET_STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICcontrolMessage */
+typedef OCTET_STRING_t	 RICcontrolMessage_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICcontrolMessage;
+asn_struct_free_f RICcontrolMessage_free;
+asn_struct_print_f RICcontrolMessage_print;
+asn_constr_check_f RICcontrolMessage_constraint;
+ber_type_decoder_f RICcontrolMessage_decode_ber;
+der_type_encoder_f RICcontrolMessage_encode_der;
+xer_type_decoder_f RICcontrolMessage_decode_xer;
+xer_type_encoder_f RICcontrolMessage_encode_xer;
+per_type_decoder_f RICcontrolMessage_decode_uper;
+per_type_encoder_f RICcontrolMessage_encode_uper;
+per_type_decoder_f RICcontrolMessage_decode_aper;
+per_type_encoder_f RICcontrolMessage_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICcontrolMessage_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolOutcome.c b/3rdparty/E2AP-v01.00.00/RICcontrolOutcome.c
new file mode 100644
index 0000000..9b24690
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolOutcome.c
@@ -0,0 +1,31 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICcontrolOutcome.h"
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static const ber_tlv_tag_t asn_DEF_RICcontrolOutcome_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICcontrolOutcome = {
+	"RICcontrolOutcome",
+	"RICcontrolOutcome",
+	&asn_OP_OCTET_STRING,
+	asn_DEF_RICcontrolOutcome_tags_1,
+	sizeof(asn_DEF_RICcontrolOutcome_tags_1)
+		/sizeof(asn_DEF_RICcontrolOutcome_tags_1[0]), /* 1 */
+	asn_DEF_RICcontrolOutcome_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICcontrolOutcome_tags_1)
+		/sizeof(asn_DEF_RICcontrolOutcome_tags_1[0]), /* 1 */
+	{ 0, 0, OCTET_STRING_constraint },
+	0, 0,	/* No members */
+	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolOutcome.h b/3rdparty/E2AP-v01.00.00/RICcontrolOutcome.h
new file mode 100644
index 0000000..f52f3a3
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolOutcome.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICcontrolOutcome_H_
+#define	_RICcontrolOutcome_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "OCTET_STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICcontrolOutcome */
+typedef OCTET_STRING_t	 RICcontrolOutcome_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICcontrolOutcome;
+asn_struct_free_f RICcontrolOutcome_free;
+asn_struct_print_f RICcontrolOutcome_print;
+asn_constr_check_f RICcontrolOutcome_constraint;
+ber_type_decoder_f RICcontrolOutcome_decode_ber;
+der_type_encoder_f RICcontrolOutcome_encode_der;
+xer_type_decoder_f RICcontrolOutcome_decode_xer;
+xer_type_encoder_f RICcontrolOutcome_encode_xer;
+per_type_decoder_f RICcontrolOutcome_decode_uper;
+per_type_encoder_f RICcontrolOutcome_encode_uper;
+per_type_decoder_f RICcontrolOutcome_decode_aper;
+per_type_encoder_f RICcontrolOutcome_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICcontrolOutcome_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolRequest.c b/3rdparty/E2AP-v01.00.00/RICcontrolRequest.c
new file mode 100644
index 0000000..4d6d765
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolRequest.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICcontrolRequest.h"
+
+asn_TYPE_member_t asn_MBR_RICcontrolRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P7,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICcontrolRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICcontrolRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_specs_1 = {
+	sizeof(struct RICcontrolRequest),
+	offsetof(struct RICcontrolRequest, _asn_ctx),
+	asn_MAP_RICcontrolRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest = {
+	"RICcontrolRequest",
+	"RICcontrolRequest",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICcontrolRequest_tags_1,
+	sizeof(asn_DEF_RICcontrolRequest_tags_1)
+		/sizeof(asn_DEF_RICcontrolRequest_tags_1[0]), /* 1 */
+	asn_DEF_RICcontrolRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICcontrolRequest_tags_1)
+		/sizeof(asn_DEF_RICcontrolRequest_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICcontrolRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RICcontrolRequest_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolRequest.h b/3rdparty/E2AP-v01.00.00/RICcontrolRequest.h
new file mode 100644
index 0000000..ee0eb5e
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolRequest.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICcontrolRequest_H_
+#define	_RICcontrolRequest_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICcontrolRequest */
+typedef struct RICcontrolRequest {
+	ProtocolIE_Container_1544P7_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICcontrolRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICcontrolRequest_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICcontrolRequest_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolStatus.c b/3rdparty/E2AP-v01.00.00/RICcontrolStatus.c
new file mode 100644
index 0000000..3266ac4
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolStatus.c
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICcontrolStatus.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static asn_per_constraints_t asn_PER_type_RICcontrolStatus_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RICcontrolStatus_value2enum_1[] = {
+	{ 0,	7,	"success" },
+	{ 1,	8,	"rejected" },
+	{ 2,	6,	"failed" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RICcontrolStatus_enum2value_1[] = {
+	2,	/* failed(2) */
+	1,	/* rejected(1) */
+	0	/* success(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RICcontrolStatus_specs_1 = {
+	asn_MAP_RICcontrolStatus_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RICcontrolStatus_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	4,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RICcontrolStatus_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICcontrolStatus = {
+	"RICcontrolStatus",
+	"RICcontrolStatus",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_RICcontrolStatus_tags_1,
+	sizeof(asn_DEF_RICcontrolStatus_tags_1)
+		/sizeof(asn_DEF_RICcontrolStatus_tags_1[0]), /* 1 */
+	asn_DEF_RICcontrolStatus_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICcontrolStatus_tags_1)
+		/sizeof(asn_DEF_RICcontrolStatus_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RICcontrolStatus_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RICcontrolStatus_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICcontrolStatus.h b/3rdparty/E2AP-v01.00.00/RICcontrolStatus.h
new file mode 100644
index 0000000..217d175
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICcontrolStatus.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICcontrolStatus_H_
+#define	_RICcontrolStatus_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RICcontrolStatus {
+	RICcontrolStatus_success	= 0,
+	RICcontrolStatus_rejected	= 1,
+	RICcontrolStatus_failed	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RICcontrolStatus;
+
+/* RICcontrolStatus */
+typedef long	 RICcontrolStatus_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICcontrolStatus;
+asn_struct_free_f RICcontrolStatus_free;
+asn_struct_print_f RICcontrolStatus_print;
+asn_constr_check_f RICcontrolStatus_constraint;
+ber_type_decoder_f RICcontrolStatus_decode_ber;
+der_type_encoder_f RICcontrolStatus_encode_der;
+xer_type_decoder_f RICcontrolStatus_decode_xer;
+xer_type_encoder_f RICcontrolStatus_encode_xer;
+per_type_decoder_f RICcontrolStatus_decode_uper;
+per_type_encoder_f RICcontrolStatus_encode_uper;
+per_type_decoder_f RICcontrolStatus_decode_aper;
+per_type_encoder_f RICcontrolStatus_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICcontrolStatus_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICeventTriggerDefinition.c b/3rdparty/E2AP-v01.00.00/RICeventTriggerDefinition.c
new file mode 100644
index 0000000..77782c6
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICeventTriggerDefinition.c
@@ -0,0 +1,31 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICeventTriggerDefinition.h"
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static const ber_tlv_tag_t asn_DEF_RICeventTriggerDefinition_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICeventTriggerDefinition = {
+	"RICeventTriggerDefinition",
+	"RICeventTriggerDefinition",
+	&asn_OP_OCTET_STRING,
+	asn_DEF_RICeventTriggerDefinition_tags_1,
+	sizeof(asn_DEF_RICeventTriggerDefinition_tags_1)
+		/sizeof(asn_DEF_RICeventTriggerDefinition_tags_1[0]), /* 1 */
+	asn_DEF_RICeventTriggerDefinition_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICeventTriggerDefinition_tags_1)
+		/sizeof(asn_DEF_RICeventTriggerDefinition_tags_1[0]), /* 1 */
+	{ 0, 0, OCTET_STRING_constraint },
+	0, 0,	/* No members */
+	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICeventTriggerDefinition.h b/3rdparty/E2AP-v01.00.00/RICeventTriggerDefinition.h
new file mode 100644
index 0000000..260bebd
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICeventTriggerDefinition.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICeventTriggerDefinition_H_
+#define	_RICeventTriggerDefinition_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "OCTET_STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICeventTriggerDefinition */
+typedef OCTET_STRING_t	 RICeventTriggerDefinition_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICeventTriggerDefinition;
+asn_struct_free_f RICeventTriggerDefinition_free;
+asn_struct_print_f RICeventTriggerDefinition_print;
+asn_constr_check_f RICeventTriggerDefinition_constraint;
+ber_type_decoder_f RICeventTriggerDefinition_decode_ber;
+der_type_encoder_f RICeventTriggerDefinition_encode_der;
+xer_type_decoder_f RICeventTriggerDefinition_decode_xer;
+xer_type_encoder_f RICeventTriggerDefinition_encode_xer;
+per_type_decoder_f RICeventTriggerDefinition_decode_uper;
+per_type_encoder_f RICeventTriggerDefinition_encode_uper;
+per_type_decoder_f RICeventTriggerDefinition_decode_aper;
+per_type_encoder_f RICeventTriggerDefinition_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICeventTriggerDefinition_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICindication.c b/3rdparty/E2AP-v01.00.00/RICindication.c
new file mode 100644
index 0000000..0bac621
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICindication.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICindication.h"
+
+asn_TYPE_member_t asn_MBR_RICindication_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICindication, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P6,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICindication_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICindication_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICindication_specs_1 = {
+	sizeof(struct RICindication),
+	offsetof(struct RICindication, _asn_ctx),
+	asn_MAP_RICindication_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICindication = {
+	"RICindication",
+	"RICindication",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICindication_tags_1,
+	sizeof(asn_DEF_RICindication_tags_1)
+		/sizeof(asn_DEF_RICindication_tags_1[0]), /* 1 */
+	asn_DEF_RICindication_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICindication_tags_1)
+		/sizeof(asn_DEF_RICindication_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICindication_1,
+	1,	/* Elements count */
+	&asn_SPC_RICindication_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICindication.h b/3rdparty/E2AP-v01.00.00/RICindication.h
new file mode 100644
index 0000000..8a27a31
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICindication.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICindication_H_
+#define	_RICindication_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICindication */
+typedef struct RICindication {
+	ProtocolIE_Container_1544P6_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICindication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICindication;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICindication_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICindication_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICindication_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICindicationHeader.c b/3rdparty/E2AP-v01.00.00/RICindicationHeader.c
new file mode 100644
index 0000000..dbd9c74
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICindicationHeader.c
@@ -0,0 +1,31 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICindicationHeader.h"
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static const ber_tlv_tag_t asn_DEF_RICindicationHeader_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICindicationHeader = {
+	"RICindicationHeader",
+	"RICindicationHeader",
+	&asn_OP_OCTET_STRING,
+	asn_DEF_RICindicationHeader_tags_1,
+	sizeof(asn_DEF_RICindicationHeader_tags_1)
+		/sizeof(asn_DEF_RICindicationHeader_tags_1[0]), /* 1 */
+	asn_DEF_RICindicationHeader_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICindicationHeader_tags_1)
+		/sizeof(asn_DEF_RICindicationHeader_tags_1[0]), /* 1 */
+	{ 0, 0, OCTET_STRING_constraint },
+	0, 0,	/* No members */
+	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICindicationHeader.h b/3rdparty/E2AP-v01.00.00/RICindicationHeader.h
new file mode 100644
index 0000000..f3df15a
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICindicationHeader.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICindicationHeader_H_
+#define	_RICindicationHeader_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "OCTET_STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICindicationHeader */
+typedef OCTET_STRING_t	 RICindicationHeader_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICindicationHeader;
+asn_struct_free_f RICindicationHeader_free;
+asn_struct_print_f RICindicationHeader_print;
+asn_constr_check_f RICindicationHeader_constraint;
+ber_type_decoder_f RICindicationHeader_decode_ber;
+der_type_encoder_f RICindicationHeader_encode_der;
+xer_type_decoder_f RICindicationHeader_decode_xer;
+xer_type_encoder_f RICindicationHeader_encode_xer;
+per_type_decoder_f RICindicationHeader_decode_uper;
+per_type_encoder_f RICindicationHeader_encode_uper;
+per_type_decoder_f RICindicationHeader_decode_aper;
+per_type_encoder_f RICindicationHeader_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICindicationHeader_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICindicationMessage.c b/3rdparty/E2AP-v01.00.00/RICindicationMessage.c
new file mode 100644
index 0000000..90d879a
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICindicationMessage.c
@@ -0,0 +1,31 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICindicationMessage.h"
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static const ber_tlv_tag_t asn_DEF_RICindicationMessage_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICindicationMessage = {
+	"RICindicationMessage",
+	"RICindicationMessage",
+	&asn_OP_OCTET_STRING,
+	asn_DEF_RICindicationMessage_tags_1,
+	sizeof(asn_DEF_RICindicationMessage_tags_1)
+		/sizeof(asn_DEF_RICindicationMessage_tags_1[0]), /* 1 */
+	asn_DEF_RICindicationMessage_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICindicationMessage_tags_1)
+		/sizeof(asn_DEF_RICindicationMessage_tags_1[0]), /* 1 */
+	{ 0, 0, OCTET_STRING_constraint },
+	0, 0,	/* No members */
+	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICindicationMessage.h b/3rdparty/E2AP-v01.00.00/RICindicationMessage.h
new file mode 100644
index 0000000..5c78c98
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICindicationMessage.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICindicationMessage_H_
+#define	_RICindicationMessage_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "OCTET_STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICindicationMessage */
+typedef OCTET_STRING_t	 RICindicationMessage_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICindicationMessage;
+asn_struct_free_f RICindicationMessage_free;
+asn_struct_print_f RICindicationMessage_print;
+asn_constr_check_f RICindicationMessage_constraint;
+ber_type_decoder_f RICindicationMessage_decode_ber;
+der_type_encoder_f RICindicationMessage_encode_der;
+xer_type_decoder_f RICindicationMessage_decode_xer;
+xer_type_encoder_f RICindicationMessage_encode_xer;
+per_type_decoder_f RICindicationMessage_decode_uper;
+per_type_encoder_f RICindicationMessage_encode_uper;
+per_type_decoder_f RICindicationMessage_decode_aper;
+per_type_encoder_f RICindicationMessage_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICindicationMessage_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICindicationSN.c b/3rdparty/E2AP-v01.00.00/RICindicationSN.c
new file mode 100644
index 0000000..c5f06a8
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICindicationSN.c
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICindicationSN.h"
+
+int
+RICindicationSN_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static asn_per_constraints_t asn_PER_type_RICindicationSN_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RICindicationSN_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICindicationSN = {
+	"RICindicationSN",
+	"RICindicationSN",
+	&asn_OP_NativeInteger,
+	asn_DEF_RICindicationSN_tags_1,
+	sizeof(asn_DEF_RICindicationSN_tags_1)
+		/sizeof(asn_DEF_RICindicationSN_tags_1[0]), /* 1 */
+	asn_DEF_RICindicationSN_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICindicationSN_tags_1)
+		/sizeof(asn_DEF_RICindicationSN_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RICindicationSN_constr_1, RICindicationSN_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICindicationSN.h b/3rdparty/E2AP-v01.00.00/RICindicationSN.h
new file mode 100644
index 0000000..f02e8dd
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICindicationSN.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICindicationSN_H_
+#define	_RICindicationSN_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICindicationSN */
+typedef long	 RICindicationSN_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICindicationSN;
+asn_struct_free_f RICindicationSN_free;
+asn_struct_print_f RICindicationSN_print;
+asn_constr_check_f RICindicationSN_constraint;
+ber_type_decoder_f RICindicationSN_decode_ber;
+der_type_encoder_f RICindicationSN_encode_der;
+xer_type_decoder_f RICindicationSN_decode_xer;
+xer_type_encoder_f RICindicationSN_encode_xer;
+per_type_decoder_f RICindicationSN_decode_uper;
+per_type_encoder_f RICindicationSN_encode_uper;
+per_type_decoder_f RICindicationSN_decode_aper;
+per_type_encoder_f RICindicationSN_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICindicationSN_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICindicationType.c b/3rdparty/E2AP-v01.00.00/RICindicationType.c
new file mode 100644
index 0000000..22d2e46
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICindicationType.c
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICindicationType.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static asn_per_constraints_t asn_PER_type_RICindicationType_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RICindicationType_value2enum_1[] = {
+	{ 0,	6,	"report" },
+	{ 1,	6,	"insert" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RICindicationType_enum2value_1[] = {
+	1,	/* insert(1) */
+	0	/* report(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RICindicationType_specs_1 = {
+	asn_MAP_RICindicationType_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RICindicationType_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RICindicationType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICindicationType = {
+	"RICindicationType",
+	"RICindicationType",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_RICindicationType_tags_1,
+	sizeof(asn_DEF_RICindicationType_tags_1)
+		/sizeof(asn_DEF_RICindicationType_tags_1[0]), /* 1 */
+	asn_DEF_RICindicationType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICindicationType_tags_1)
+		/sizeof(asn_DEF_RICindicationType_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RICindicationType_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RICindicationType_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICindicationType.h b/3rdparty/E2AP-v01.00.00/RICindicationType.h
new file mode 100644
index 0000000..1198257
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICindicationType.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICindicationType_H_
+#define	_RICindicationType_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RICindicationType {
+	RICindicationType_report	= 0,
+	RICindicationType_insert	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RICindicationType;
+
+/* RICindicationType */
+typedef long	 RICindicationType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICindicationType;
+asn_struct_free_f RICindicationType_free;
+asn_struct_print_f RICindicationType_print;
+asn_constr_check_f RICindicationType_constraint;
+ber_type_decoder_f RICindicationType_decode_ber;
+der_type_encoder_f RICindicationType_encode_der;
+xer_type_decoder_f RICindicationType_decode_xer;
+xer_type_encoder_f RICindicationType_encode_xer;
+per_type_decoder_f RICindicationType_decode_uper;
+per_type_encoder_f RICindicationType_encode_uper;
+per_type_decoder_f RICindicationType_decode_aper;
+per_type_encoder_f RICindicationType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICindicationType_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICrequestID.c b/3rdparty/E2AP-v01.00.00/RICrequestID.c
new file mode 100644
index 0000000..29da41b
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICrequestID.c
@@ -0,0 +1,120 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICrequestID.h"
+
+static int
+memb_ricRequestorID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_ricInstanceID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_ricRequestorID_constr_2 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_ricInstanceID_constr_3 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+asn_TYPE_member_t asn_MBR_RICrequestID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICrequestID, ricRequestorID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		0,
+		{ 0, &asn_PER_memb_ricRequestorID_constr_2,  memb_ricRequestorID_constraint_1 },
+		0, 0, /* No default value */
+		"ricRequestorID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICrequestID, ricInstanceID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		0,
+		{ 0, &asn_PER_memb_ricInstanceID_constr_3,  memb_ricInstanceID_constraint_1 },
+		0, 0, /* No default value */
+		"ricInstanceID"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICrequestID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICrequestID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricRequestorID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ricInstanceID */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICrequestID_specs_1 = {
+	sizeof(struct RICrequestID),
+	offsetof(struct RICrequestID, _asn_ctx),
+	asn_MAP_RICrequestID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICrequestID = {
+	"RICrequestID",
+	"RICrequestID",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICrequestID_tags_1,
+	sizeof(asn_DEF_RICrequestID_tags_1)
+		/sizeof(asn_DEF_RICrequestID_tags_1[0]), /* 1 */
+	asn_DEF_RICrequestID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICrequestID_tags_1)
+		/sizeof(asn_DEF_RICrequestID_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICrequestID_1,
+	2,	/* Elements count */
+	&asn_SPC_RICrequestID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICrequestID.h b/3rdparty/E2AP-v01.00.00/RICrequestID.h
new file mode 100644
index 0000000..1d1db74
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICrequestID.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICrequestID_H_
+#define	_RICrequestID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICrequestID */
+typedef struct RICrequestID {
+	long	 ricRequestorID;
+	long	 ricInstanceID;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICrequestID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICrequestID;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICrequestID_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICrequestID_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICrequestID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICserviceQuery.c b/3rdparty/E2AP-v01.00.00/RICserviceQuery.c
new file mode 100644
index 0000000..7f98a6b
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICserviceQuery.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICserviceQuery.h"
+
+asn_TYPE_member_t asn_MBR_RICserviceQuery_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P19,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICserviceQuery_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICserviceQuery_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_specs_1 = {
+	sizeof(struct RICserviceQuery),
+	offsetof(struct RICserviceQuery, _asn_ctx),
+	asn_MAP_RICserviceQuery_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICserviceQuery = {
+	"RICserviceQuery",
+	"RICserviceQuery",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICserviceQuery_tags_1,
+	sizeof(asn_DEF_RICserviceQuery_tags_1)
+		/sizeof(asn_DEF_RICserviceQuery_tags_1[0]), /* 1 */
+	asn_DEF_RICserviceQuery_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICserviceQuery_tags_1)
+		/sizeof(asn_DEF_RICserviceQuery_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICserviceQuery_1,
+	1,	/* Elements count */
+	&asn_SPC_RICserviceQuery_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICserviceQuery.h b/3rdparty/E2AP-v01.00.00/RICserviceQuery.h
new file mode 100644
index 0000000..77e8e8e
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICserviceQuery.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICserviceQuery_H_
+#define	_RICserviceQuery_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICserviceQuery */
+typedef struct RICserviceQuery {
+	ProtocolIE_Container_1544P19_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICserviceQuery_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICserviceQuery;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICserviceQuery_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICserviceQuery_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICserviceUpdate.c b/3rdparty/E2AP-v01.00.00/RICserviceUpdate.c
new file mode 100644
index 0000000..403f434
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICserviceUpdate.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICserviceUpdate.h"
+
+asn_TYPE_member_t asn_MBR_RICserviceUpdate_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P16,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICserviceUpdate_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdate_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_specs_1 = {
+	sizeof(struct RICserviceUpdate),
+	offsetof(struct RICserviceUpdate, _asn_ctx),
+	asn_MAP_RICserviceUpdate_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate = {
+	"RICserviceUpdate",
+	"RICserviceUpdate",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICserviceUpdate_tags_1,
+	sizeof(asn_DEF_RICserviceUpdate_tags_1)
+		/sizeof(asn_DEF_RICserviceUpdate_tags_1[0]), /* 1 */
+	asn_DEF_RICserviceUpdate_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICserviceUpdate_tags_1)
+		/sizeof(asn_DEF_RICserviceUpdate_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICserviceUpdate_1,
+	1,	/* Elements count */
+	&asn_SPC_RICserviceUpdate_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICserviceUpdate.h b/3rdparty/E2AP-v01.00.00/RICserviceUpdate.h
new file mode 100644
index 0000000..915809c
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICserviceUpdate.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICserviceUpdate_H_
+#define	_RICserviceUpdate_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICserviceUpdate */
+typedef struct RICserviceUpdate {
+	ProtocolIE_Container_1544P16_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICserviceUpdate_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICserviceUpdate_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICserviceUpdate_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICserviceUpdateAcknowledge.c b/3rdparty/E2AP-v01.00.00/RICserviceUpdateAcknowledge.c
new file mode 100644
index 0000000..08f5fcc
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICserviceUpdateAcknowledge.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICserviceUpdateAcknowledge.h"
+
+asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P17,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICserviceUpdateAcknowledge_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateAcknowledge_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_specs_1 = {
+	sizeof(struct RICserviceUpdateAcknowledge),
+	offsetof(struct RICserviceUpdateAcknowledge, _asn_ctx),
+	asn_MAP_RICserviceUpdateAcknowledge_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge = {
+	"RICserviceUpdateAcknowledge",
+	"RICserviceUpdateAcknowledge",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICserviceUpdateAcknowledge_tags_1,
+	sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1)
+		/sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1[0]), /* 1 */
+	asn_DEF_RICserviceUpdateAcknowledge_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1)
+		/sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICserviceUpdateAcknowledge_1,
+	1,	/* Elements count */
+	&asn_SPC_RICserviceUpdateAcknowledge_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICserviceUpdateAcknowledge.h b/3rdparty/E2AP-v01.00.00/RICserviceUpdateAcknowledge.h
new file mode 100644
index 0000000..f53a9d7
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICserviceUpdateAcknowledge.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICserviceUpdateAcknowledge_H_
+#define	_RICserviceUpdateAcknowledge_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICserviceUpdateAcknowledge */
+typedef struct RICserviceUpdateAcknowledge {
+	ProtocolIE_Container_1544P17_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICserviceUpdateAcknowledge_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICserviceUpdateAcknowledge_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICserviceUpdateFailure.c b/3rdparty/E2AP-v01.00.00/RICserviceUpdateFailure.c
new file mode 100644
index 0000000..9668eaf
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICserviceUpdateFailure.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICserviceUpdateFailure.h"
+
+asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P18,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICserviceUpdateFailure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateFailure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_specs_1 = {
+	sizeof(struct RICserviceUpdateFailure),
+	offsetof(struct RICserviceUpdateFailure, _asn_ctx),
+	asn_MAP_RICserviceUpdateFailure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure = {
+	"RICserviceUpdateFailure",
+	"RICserviceUpdateFailure",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICserviceUpdateFailure_tags_1,
+	sizeof(asn_DEF_RICserviceUpdateFailure_tags_1)
+		/sizeof(asn_DEF_RICserviceUpdateFailure_tags_1[0]), /* 1 */
+	asn_DEF_RICserviceUpdateFailure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICserviceUpdateFailure_tags_1)
+		/sizeof(asn_DEF_RICserviceUpdateFailure_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICserviceUpdateFailure_1,
+	1,	/* Elements count */
+	&asn_SPC_RICserviceUpdateFailure_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICserviceUpdateFailure.h b/3rdparty/E2AP-v01.00.00/RICserviceUpdateFailure.h
new file mode 100644
index 0000000..56179c1
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICserviceUpdateFailure.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICserviceUpdateFailure_H_
+#define	_RICserviceUpdateFailure_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICserviceUpdateFailure */
+typedef struct RICserviceUpdateFailure {
+	ProtocolIE_Container_1544P18_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICserviceUpdateFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICserviceUpdateFailure_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteFailure.c b/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteFailure.c
new file mode 100644
index 0000000..276720b
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteFailure.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICsubscriptionDeleteFailure.h"
+
+asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P5,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteFailure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteFailure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_specs_1 = {
+	sizeof(struct RICsubscriptionDeleteFailure),
+	offsetof(struct RICsubscriptionDeleteFailure, _asn_ctx),
+	asn_MAP_RICsubscriptionDeleteFailure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure = {
+	"RICsubscriptionDeleteFailure",
+	"RICsubscriptionDeleteFailure",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICsubscriptionDeleteFailure_tags_1,
+	sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1)
+		/sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1[0]), /* 1 */
+	asn_DEF_RICsubscriptionDeleteFailure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1)
+		/sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICsubscriptionDeleteFailure_1,
+	1,	/* Elements count */
+	&asn_SPC_RICsubscriptionDeleteFailure_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteFailure.h b/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteFailure.h
new file mode 100644
index 0000000..5459635
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteFailure.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICsubscriptionDeleteFailure_H_
+#define	_RICsubscriptionDeleteFailure_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICsubscriptionDeleteFailure */
+typedef struct RICsubscriptionDeleteFailure {
+	ProtocolIE_Container_1544P5_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICsubscriptionDeleteFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICsubscriptionDeleteFailure_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteRequest.c b/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteRequest.c
new file mode 100644
index 0000000..0621fc6
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteRequest.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICsubscriptionDeleteRequest.h"
+
+asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P3,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_specs_1 = {
+	sizeof(struct RICsubscriptionDeleteRequest),
+	offsetof(struct RICsubscriptionDeleteRequest, _asn_ctx),
+	asn_MAP_RICsubscriptionDeleteRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest = {
+	"RICsubscriptionDeleteRequest",
+	"RICsubscriptionDeleteRequest",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICsubscriptionDeleteRequest_tags_1,
+	sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1)
+		/sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1[0]), /* 1 */
+	asn_DEF_RICsubscriptionDeleteRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1)
+		/sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICsubscriptionDeleteRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RICsubscriptionDeleteRequest_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteRequest.h b/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteRequest.h
new file mode 100644
index 0000000..6cd0201
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteRequest.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICsubscriptionDeleteRequest_H_
+#define	_RICsubscriptionDeleteRequest_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICsubscriptionDeleteRequest */
+typedef struct RICsubscriptionDeleteRequest {
+	ProtocolIE_Container_1544P3_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICsubscriptionDeleteRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICsubscriptionDeleteRequest_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteResponse.c b/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteResponse.c
new file mode 100644
index 0000000..6716a71
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteResponse.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICsubscriptionDeleteResponse.h"
+
+asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P4,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_specs_1 = {
+	sizeof(struct RICsubscriptionDeleteResponse),
+	offsetof(struct RICsubscriptionDeleteResponse, _asn_ctx),
+	asn_MAP_RICsubscriptionDeleteResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse = {
+	"RICsubscriptionDeleteResponse",
+	"RICsubscriptionDeleteResponse",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICsubscriptionDeleteResponse_tags_1,
+	sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1)
+		/sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1[0]), /* 1 */
+	asn_DEF_RICsubscriptionDeleteResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1)
+		/sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICsubscriptionDeleteResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RICsubscriptionDeleteResponse_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteResponse.h b/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteResponse.h
new file mode 100644
index 0000000..8495c3e
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubscriptionDeleteResponse.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICsubscriptionDeleteResponse_H_
+#define	_RICsubscriptionDeleteResponse_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICsubscriptionDeleteResponse */
+typedef struct RICsubscriptionDeleteResponse {
+	ProtocolIE_Container_1544P4_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICsubscriptionDeleteResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICsubscriptionDeleteResponse_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICsubscriptionDetails.c b/3rdparty/E2AP-v01.00.00/RICsubscriptionDetails.c
new file mode 100644
index 0000000..ee7dbd6
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubscriptionDetails.c
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICsubscriptionDetails.h"
+
+static asn_TYPE_member_t asn_MBR_RICsubscriptionDetails_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDetails, ricEventTriggerDefinition),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RICeventTriggerDefinition,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ricEventTriggerDefinition"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDetails, ricAction_ToBeSetup_List),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RICactions_ToBeSetup_List,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ricAction-ToBeSetup-List"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICsubscriptionDetails_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDetails_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricEventTriggerDefinition */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ricAction-ToBeSetup-List */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDetails_specs_1 = {
+	sizeof(struct RICsubscriptionDetails),
+	offsetof(struct RICsubscriptionDetails, _asn_ctx),
+	asn_MAP_RICsubscriptionDetails_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDetails = {
+	"RICsubscriptionDetails",
+	"RICsubscriptionDetails",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICsubscriptionDetails_tags_1,
+	sizeof(asn_DEF_RICsubscriptionDetails_tags_1)
+		/sizeof(asn_DEF_RICsubscriptionDetails_tags_1[0]), /* 1 */
+	asn_DEF_RICsubscriptionDetails_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICsubscriptionDetails_tags_1)
+		/sizeof(asn_DEF_RICsubscriptionDetails_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICsubscriptionDetails_1,
+	2,	/* Elements count */
+	&asn_SPC_RICsubscriptionDetails_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICsubscriptionDetails.h b/3rdparty/E2AP-v01.00.00/RICsubscriptionDetails.h
new file mode 100644
index 0000000..b7b1cbf
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubscriptionDetails.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICsubscriptionDetails_H_
+#define	_RICsubscriptionDetails_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "RICeventTriggerDefinition.h"
+#include "RICactions-ToBeSetup-List.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICsubscriptionDetails */
+typedef struct RICsubscriptionDetails {
+	RICeventTriggerDefinition_t	 ricEventTriggerDefinition;
+	RICactions_ToBeSetup_List_t	 ricAction_ToBeSetup_List;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICsubscriptionDetails_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDetails;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICsubscriptionDetails_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICsubscriptionFailure.c b/3rdparty/E2AP-v01.00.00/RICsubscriptionFailure.c
new file mode 100644
index 0000000..81d9507
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubscriptionFailure.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICsubscriptionFailure.h"
+
+asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P2,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICsubscriptionFailure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionFailure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_specs_1 = {
+	sizeof(struct RICsubscriptionFailure),
+	offsetof(struct RICsubscriptionFailure, _asn_ctx),
+	asn_MAP_RICsubscriptionFailure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure = {
+	"RICsubscriptionFailure",
+	"RICsubscriptionFailure",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICsubscriptionFailure_tags_1,
+	sizeof(asn_DEF_RICsubscriptionFailure_tags_1)
+		/sizeof(asn_DEF_RICsubscriptionFailure_tags_1[0]), /* 1 */
+	asn_DEF_RICsubscriptionFailure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICsubscriptionFailure_tags_1)
+		/sizeof(asn_DEF_RICsubscriptionFailure_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICsubscriptionFailure_1,
+	1,	/* Elements count */
+	&asn_SPC_RICsubscriptionFailure_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICsubscriptionFailure.h b/3rdparty/E2AP-v01.00.00/RICsubscriptionFailure.h
new file mode 100644
index 0000000..b03e9e5
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubscriptionFailure.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICsubscriptionFailure_H_
+#define	_RICsubscriptionFailure_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICsubscriptionFailure */
+typedef struct RICsubscriptionFailure {
+	ProtocolIE_Container_1544P2_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICsubscriptionFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICsubscriptionFailure_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICsubscriptionRequest.c b/3rdparty/E2AP-v01.00.00/RICsubscriptionRequest.c
new file mode 100644
index 0000000..88bc373
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubscriptionRequest.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICsubscriptionRequest.h"
+
+asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P0,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICsubscriptionRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_specs_1 = {
+	sizeof(struct RICsubscriptionRequest),
+	offsetof(struct RICsubscriptionRequest, _asn_ctx),
+	asn_MAP_RICsubscriptionRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest = {
+	"RICsubscriptionRequest",
+	"RICsubscriptionRequest",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICsubscriptionRequest_tags_1,
+	sizeof(asn_DEF_RICsubscriptionRequest_tags_1)
+		/sizeof(asn_DEF_RICsubscriptionRequest_tags_1[0]), /* 1 */
+	asn_DEF_RICsubscriptionRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICsubscriptionRequest_tags_1)
+		/sizeof(asn_DEF_RICsubscriptionRequest_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICsubscriptionRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RICsubscriptionRequest_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICsubscriptionRequest.h b/3rdparty/E2AP-v01.00.00/RICsubscriptionRequest.h
new file mode 100644
index 0000000..6549ec6
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubscriptionRequest.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICsubscriptionRequest_H_
+#define	_RICsubscriptionRequest_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICsubscriptionRequest */
+typedef struct RICsubscriptionRequest {
+	ProtocolIE_Container_1544P0_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICsubscriptionRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICsubscriptionRequest_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICsubscriptionResponse.c b/3rdparty/E2AP-v01.00.00/RICsubscriptionResponse.c
new file mode 100644
index 0000000..fa556a0
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubscriptionResponse.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICsubscriptionResponse.h"
+
+asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P1,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICsubscriptionResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_specs_1 = {
+	sizeof(struct RICsubscriptionResponse),
+	offsetof(struct RICsubscriptionResponse, _asn_ctx),
+	asn_MAP_RICsubscriptionResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse = {
+	"RICsubscriptionResponse",
+	"RICsubscriptionResponse",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICsubscriptionResponse_tags_1,
+	sizeof(asn_DEF_RICsubscriptionResponse_tags_1)
+		/sizeof(asn_DEF_RICsubscriptionResponse_tags_1[0]), /* 1 */
+	asn_DEF_RICsubscriptionResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICsubscriptionResponse_tags_1)
+		/sizeof(asn_DEF_RICsubscriptionResponse_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICsubscriptionResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RICsubscriptionResponse_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICsubscriptionResponse.h b/3rdparty/E2AP-v01.00.00/RICsubscriptionResponse.h
new file mode 100644
index 0000000..08bc9a6
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubscriptionResponse.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICsubscriptionResponse_H_
+#define	_RICsubscriptionResponse_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICsubscriptionResponse */
+typedef struct RICsubscriptionResponse {
+	ProtocolIE_Container_1544P1_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICsubscriptionResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICsubscriptionResponse_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICsubsequentAction.c b/3rdparty/E2AP-v01.00.00/RICsubsequentAction.c
new file mode 100644
index 0000000..ef73fd4
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubsequentAction.c
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICsubsequentAction.h"
+
+asn_TYPE_member_t asn_MBR_RICsubsequentAction_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubsequentAction, ricSubsequentActionType),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RICsubsequentActionType,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ricSubsequentActionType"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RICsubsequentAction, ricTimeToWait),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RICtimeToWait,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ricTimeToWait"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RICsubsequentAction_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RICsubsequentAction_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricSubsequentActionType */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ricTimeToWait */
+};
+asn_SEQUENCE_specifics_t asn_SPC_RICsubsequentAction_specs_1 = {
+	sizeof(struct RICsubsequentAction),
+	offsetof(struct RICsubsequentAction, _asn_ctx),
+	asn_MAP_RICsubsequentAction_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_RICsubsequentAction = {
+	"RICsubsequentAction",
+	"RICsubsequentAction",
+	&asn_OP_SEQUENCE,
+	asn_DEF_RICsubsequentAction_tags_1,
+	sizeof(asn_DEF_RICsubsequentAction_tags_1)
+		/sizeof(asn_DEF_RICsubsequentAction_tags_1[0]), /* 1 */
+	asn_DEF_RICsubsequentAction_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICsubsequentAction_tags_1)
+		/sizeof(asn_DEF_RICsubsequentAction_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_RICsubsequentAction_1,
+	2,	/* Elements count */
+	&asn_SPC_RICsubsequentAction_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICsubsequentAction.h b/3rdparty/E2AP-v01.00.00/RICsubsequentAction.h
new file mode 100644
index 0000000..93f1ced
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubsequentAction.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICsubsequentAction_H_
+#define	_RICsubsequentAction_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "RICsubsequentActionType.h"
+#include "RICtimeToWait.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RICsubsequentAction */
+typedef struct RICsubsequentAction {
+	RICsubsequentActionType_t	 ricSubsequentActionType;
+	RICtimeToWait_t	 ricTimeToWait;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RICsubsequentAction_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RICsubsequentAction;
+extern asn_SEQUENCE_specifics_t asn_SPC_RICsubsequentAction_specs_1;
+extern asn_TYPE_member_t asn_MBR_RICsubsequentAction_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICsubsequentAction_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICsubsequentActionType.c b/3rdparty/E2AP-v01.00.00/RICsubsequentActionType.c
new file mode 100644
index 0000000..0ca3807
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubsequentActionType.c
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICsubsequentActionType.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_RICsubsequentActionType_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RICsubsequentActionType_value2enum_1[] = {
+	{ 0,	8,	"continue" },
+	{ 1,	4,	"wait" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RICsubsequentActionType_enum2value_1[] = {
+	0,	/* continue(0) */
+	1	/* wait(1) */
+	/* This list is extensible */
+};
+const asn_INTEGER_specifics_t asn_SPC_RICsubsequentActionType_specs_1 = {
+	asn_MAP_RICsubsequentActionType_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RICsubsequentActionType_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RICsubsequentActionType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICsubsequentActionType = {
+	"RICsubsequentActionType",
+	"RICsubsequentActionType",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_RICsubsequentActionType_tags_1,
+	sizeof(asn_DEF_RICsubsequentActionType_tags_1)
+		/sizeof(asn_DEF_RICsubsequentActionType_tags_1[0]), /* 1 */
+	asn_DEF_RICsubsequentActionType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICsubsequentActionType_tags_1)
+		/sizeof(asn_DEF_RICsubsequentActionType_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RICsubsequentActionType_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RICsubsequentActionType_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICsubsequentActionType.h b/3rdparty/E2AP-v01.00.00/RICsubsequentActionType.h
new file mode 100644
index 0000000..181e409
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICsubsequentActionType.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICsubsequentActionType_H_
+#define	_RICsubsequentActionType_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RICsubsequentActionType {
+	RICsubsequentActionType_continue	= 0,
+	RICsubsequentActionType_wait	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RICsubsequentActionType;
+
+/* RICsubsequentActionType */
+typedef long	 RICsubsequentActionType_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_RICsubsequentActionType_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_RICsubsequentActionType;
+extern const asn_INTEGER_specifics_t asn_SPC_RICsubsequentActionType_specs_1;
+asn_struct_free_f RICsubsequentActionType_free;
+asn_struct_print_f RICsubsequentActionType_print;
+asn_constr_check_f RICsubsequentActionType_constraint;
+ber_type_decoder_f RICsubsequentActionType_decode_ber;
+der_type_encoder_f RICsubsequentActionType_encode_der;
+xer_type_decoder_f RICsubsequentActionType_decode_xer;
+xer_type_encoder_f RICsubsequentActionType_encode_xer;
+per_type_decoder_f RICsubsequentActionType_decode_uper;
+per_type_encoder_f RICsubsequentActionType_encode_uper;
+per_type_decoder_f RICsubsequentActionType_decode_aper;
+per_type_encoder_f RICsubsequentActionType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICsubsequentActionType_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/RICtimeToWait.c b/3rdparty/E2AP-v01.00.00/RICtimeToWait.c
new file mode 100644
index 0000000..d70b8e6
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICtimeToWait.c
@@ -0,0 +1,87 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "RICtimeToWait.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_RICtimeToWait_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  5,  5,  0,  17 }	/* (0..17,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RICtimeToWait_value2enum_1[] = {
+	{ 0,	4,	"zero" },
+	{ 1,	4,	"w1ms" },
+	{ 2,	4,	"w2ms" },
+	{ 3,	4,	"w5ms" },
+	{ 4,	5,	"w10ms" },
+	{ 5,	5,	"w20ms" },
+	{ 6,	5,	"w30ms" },
+	{ 7,	5,	"w40ms" },
+	{ 8,	5,	"w50ms" },
+	{ 9,	6,	"w100ms" },
+	{ 10,	6,	"w200ms" },
+	{ 11,	6,	"w500ms" },
+	{ 12,	3,	"w1s" },
+	{ 13,	3,	"w2s" },
+	{ 14,	3,	"w5s" },
+	{ 15,	4,	"w10s" },
+	{ 16,	4,	"w20s" },
+	{ 17,	4,	"w60s" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RICtimeToWait_enum2value_1[] = {
+	9,	/* w100ms(9) */
+	4,	/* w10ms(4) */
+	15,	/* w10s(15) */
+	1,	/* w1ms(1) */
+	12,	/* w1s(12) */
+	10,	/* w200ms(10) */
+	5,	/* w20ms(5) */
+	16,	/* w20s(16) */
+	2,	/* w2ms(2) */
+	13,	/* w2s(13) */
+	6,	/* w30ms(6) */
+	7,	/* w40ms(7) */
+	11,	/* w500ms(11) */
+	8,	/* w50ms(8) */
+	3,	/* w5ms(3) */
+	14,	/* w5s(14) */
+	17,	/* w60s(17) */
+	0	/* zero(0) */
+	/* This list is extensible */
+};
+const asn_INTEGER_specifics_t asn_SPC_RICtimeToWait_specs_1 = {
+	asn_MAP_RICtimeToWait_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RICtimeToWait_enum2value_1,	/* N => "tag"; sorted by N */
+	18,	/* Number of elements in the maps */
+	19,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RICtimeToWait_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RICtimeToWait = {
+	"RICtimeToWait",
+	"RICtimeToWait",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_RICtimeToWait_tags_1,
+	sizeof(asn_DEF_RICtimeToWait_tags_1)
+		/sizeof(asn_DEF_RICtimeToWait_tags_1[0]), /* 1 */
+	asn_DEF_RICtimeToWait_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RICtimeToWait_tags_1)
+		/sizeof(asn_DEF_RICtimeToWait_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_RICtimeToWait_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RICtimeToWait_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/RICtimeToWait.h b/3rdparty/E2AP-v01.00.00/RICtimeToWait.h
new file mode 100644
index 0000000..25fbcd2
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/RICtimeToWait.h
@@ -0,0 +1,70 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_RICtimeToWait_H_
+#define	_RICtimeToWait_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RICtimeToWait {
+	RICtimeToWait_zero	= 0,
+	RICtimeToWait_w1ms	= 1,
+	RICtimeToWait_w2ms	= 2,
+	RICtimeToWait_w5ms	= 3,
+	RICtimeToWait_w10ms	= 4,
+	RICtimeToWait_w20ms	= 5,
+	RICtimeToWait_w30ms	= 6,
+	RICtimeToWait_w40ms	= 7,
+	RICtimeToWait_w50ms	= 8,
+	RICtimeToWait_w100ms	= 9,
+	RICtimeToWait_w200ms	= 10,
+	RICtimeToWait_w500ms	= 11,
+	RICtimeToWait_w1s	= 12,
+	RICtimeToWait_w2s	= 13,
+	RICtimeToWait_w5s	= 14,
+	RICtimeToWait_w10s	= 15,
+	RICtimeToWait_w20s	= 16,
+	RICtimeToWait_w60s	= 17
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RICtimeToWait;
+
+/* RICtimeToWait */
+typedef long	 RICtimeToWait_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_RICtimeToWait_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_RICtimeToWait;
+extern const asn_INTEGER_specifics_t asn_SPC_RICtimeToWait_specs_1;
+asn_struct_free_f RICtimeToWait_free;
+asn_struct_print_f RICtimeToWait_print;
+asn_constr_check_f RICtimeToWait_constraint;
+ber_type_decoder_f RICtimeToWait_decode_ber;
+der_type_encoder_f RICtimeToWait_encode_der;
+xer_type_decoder_f RICtimeToWait_decode_xer;
+xer_type_encoder_f RICtimeToWait_encode_xer;
+per_type_decoder_f RICtimeToWait_decode_uper;
+per_type_encoder_f RICtimeToWait_encode_uper;
+per_type_decoder_f RICtimeToWait_decode_aper;
+per_type_encoder_f RICtimeToWait_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RICtimeToWait_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/ResetRequest.c b/3rdparty/E2AP-v01.00.00/ResetRequest.c
new file mode 100644
index 0000000..07c48d4
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ResetRequest.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "ResetRequest.h"
+
+asn_TYPE_member_t asn_MBR_ResetRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct ResetRequest, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P14,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ResetRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_ResetRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_ResetRequest_specs_1 = {
+	sizeof(struct ResetRequest),
+	offsetof(struct ResetRequest, _asn_ctx),
+	asn_MAP_ResetRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_ResetRequest = {
+	"ResetRequest",
+	"ResetRequest",
+	&asn_OP_SEQUENCE,
+	asn_DEF_ResetRequest_tags_1,
+	sizeof(asn_DEF_ResetRequest_tags_1)
+		/sizeof(asn_DEF_ResetRequest_tags_1[0]), /* 1 */
+	asn_DEF_ResetRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_ResetRequest_tags_1)
+		/sizeof(asn_DEF_ResetRequest_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_ResetRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_ResetRequest_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/ResetRequest.h b/3rdparty/E2AP-v01.00.00/ResetRequest.h
new file mode 100644
index 0000000..c706221
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ResetRequest.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_ResetRequest_H_
+#define	_ResetRequest_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ResetRequest */
+typedef struct ResetRequest {
+	ProtocolIE_Container_1544P14_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ResetRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ResetRequest;
+extern asn_SEQUENCE_specifics_t asn_SPC_ResetRequest_specs_1;
+extern asn_TYPE_member_t asn_MBR_ResetRequest_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ResetRequest_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/ResetResponse.c b/3rdparty/E2AP-v01.00.00/ResetResponse.c
new file mode 100644
index 0000000..f53570f
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ResetResponse.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "ResetResponse.h"
+
+asn_TYPE_member_t asn_MBR_ResetResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct ResetResponse, protocolIEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProtocolIE_Container_1544P15,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"protocolIEs"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ResetResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_ResetResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
+};
+asn_SEQUENCE_specifics_t asn_SPC_ResetResponse_specs_1 = {
+	sizeof(struct ResetResponse),
+	offsetof(struct ResetResponse, _asn_ctx),
+	asn_MAP_ResetResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_ResetResponse = {
+	"ResetResponse",
+	"ResetResponse",
+	&asn_OP_SEQUENCE,
+	asn_DEF_ResetResponse_tags_1,
+	sizeof(asn_DEF_ResetResponse_tags_1)
+		/sizeof(asn_DEF_ResetResponse_tags_1[0]), /* 1 */
+	asn_DEF_ResetResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_ResetResponse_tags_1)
+		/sizeof(asn_DEF_ResetResponse_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_ResetResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_ResetResponse_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/ResetResponse.h b/3rdparty/E2AP-v01.00.00/ResetResponse.h
new file mode 100644
index 0000000..6d823dd
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/ResetResponse.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Contents"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_ResetResponse_H_
+#define	_ResetResponse_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ResetResponse */
+typedef struct ResetResponse {
+	ProtocolIE_Container_1544P15_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ResetResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ResetResponse;
+extern asn_SEQUENCE_specifics_t asn_SPC_ResetResponse_specs_1;
+extern asn_TYPE_member_t asn_MBR_ResetResponse_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ResetResponse_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/SuccessfulOutcome.c b/3rdparty/E2AP-v01.00.00/SuccessfulOutcome.c
new file mode 100644
index 0000000..82c0cb7
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/SuccessfulOutcome.c
@@ -0,0 +1,359 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Descriptions"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "SuccessfulOutcome.h"
+
+static const long asn_VAL_1_id_RICsubscription = 8;
+static const long asn_VAL_1_reject = 0;
+static const long asn_VAL_2_id_RICsubscriptionDelete = 9;
+static const long asn_VAL_2_reject = 0;
+static const long asn_VAL_3_id_RICserviceUpdate = 7;
+static const long asn_VAL_3_reject = 0;
+static const long asn_VAL_4_id_RICcontrol = 4;
+static const long asn_VAL_4_reject = 0;
+static const long asn_VAL_5_id_E2setup = 1;
+static const long asn_VAL_5_reject = 0;
+static const long asn_VAL_6_id_Reset = 3;
+static const long asn_VAL_6_reject = 0;
+static const long asn_VAL_7_id_RICindication = 5;
+static const long asn_VAL_7_ignore = 1;
+static const long asn_VAL_8_id_RICserviceQuery = 6;
+static const long asn_VAL_8_ignore = 1;
+static const long asn_VAL_9_id_ErrorIndication = 2;
+static const long asn_VAL_9_ignore = 1;
+static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = {
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionRequest },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionResponse },
+	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionFailure },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_1_id_RICsubscription },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_1_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionDeleteRequest },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionDeleteResponse },
+	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionDeleteFailure },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_2_id_RICsubscriptionDelete },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_2_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICserviceUpdate },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICserviceUpdateAcknowledge },
+	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICserviceUpdateFailure },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_3_id_RICserviceUpdate },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_3_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICcontrolRequest },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICcontrolAcknowledge },
+	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICcontrolFailure },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_4_id_RICcontrol },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_4_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_E2setupRequest },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_E2setupResponse },
+	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_E2setupFailure },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_5_id_E2setup },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_5_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_ResetRequest },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ResetResponse },
+	{ "&UnsuccessfulOutcome",  },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_6_id_Reset },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICindication },
+	{ "&SuccessfulOutcome",  },
+	{ "&UnsuccessfulOutcome",  },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_7_id_RICindication },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_ignore },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICserviceQuery },
+	{ "&SuccessfulOutcome",  },
+	{ "&UnsuccessfulOutcome",  },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_8_id_RICserviceQuery },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_ignore },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_ErrorIndication },
+	{ "&SuccessfulOutcome",  },
+	{ "&UnsuccessfulOutcome",  },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_9_id_ErrorIndication },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_ignore }
+};
+static const asn_ioc_set_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1[] = {
+	{ 9, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows }
+};
+static int
+memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 255)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_SuccessfulOutcome_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1;
+	size_t constraining_column = 3; /* &procedureCode */
+	size_t for_column = 4; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct SuccessfulOutcome, procedureCode));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_SuccessfulOutcome_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1;
+	size_t constraining_column = 3; /* &procedureCode */
+	size_t for_column = 1; /* &SuccessfulOutcome */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct SuccessfulOutcome, procedureCode));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_per_constraints_t asn_PER_memb_procedureCode_constr_2 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0,  255 }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_value_4[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcome__value, choice.RICsubscriptionResponse),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICsubscriptionResponse,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICsubscriptionResponse"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcome__value, choice.RICsubscriptionDeleteResponse),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICsubscriptionDeleteResponse,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICsubscriptionDeleteResponse"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcome__value, choice.RICserviceUpdateAcknowledge),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICserviceUpdateAcknowledge,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICserviceUpdateAcknowledge"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcome__value, choice.RICcontrolAcknowledge),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICcontrolAcknowledge,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICcontrolAcknowledge"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcome__value, choice.E2setupResponse),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_E2setupResponse,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"E2setupResponse"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcome__value, choice.ResetResponse),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_ResetResponse,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ResetResponse"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 5 }, /* RICsubscriptionResponse */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 4 }, /* RICsubscriptionDeleteResponse */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 3 }, /* RICserviceUpdateAcknowledge */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 2 }, /* RICcontrolAcknowledge */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 1 }, /* E2setupResponse */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 5, -5, 0 } /* ResetResponse */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = {
+	sizeof(struct SuccessfulOutcome__value),
+	offsetof(struct SuccessfulOutcome__value, _asn_ctx),
+	offsetof(struct SuccessfulOutcome__value, present),
+	sizeof(((struct SuccessfulOutcome__value *)0)->present),
+	asn_MAP_value_tag2el_4,
+	6,	/* Count of tags in the map */
+	0, 0,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_4 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_4,
+	6,	/* Elements count */
+	&asn_SPC_value_specs_4	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_SuccessfulOutcome_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcome, procedureCode),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProcedureCode,
+		0,
+		{ 0, &asn_PER_memb_procedureCode_constr_2,  memb_procedureCode_constraint_1 },
+		0, 0, /* No default value */
+		"procedureCode"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcome, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_SuccessfulOutcome_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_3,  memb_criticality_constraint_1 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcome, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_4,
+		select_SuccessfulOutcome_value_type,
+		{ 0, &asn_PER_memb_value_constr_4,  memb_value_constraint_1 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SuccessfulOutcome_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SuccessfulOutcome_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_SuccessfulOutcome_specs_1 = {
+	sizeof(struct SuccessfulOutcome),
+	offsetof(struct SuccessfulOutcome, _asn_ctx),
+	asn_MAP_SuccessfulOutcome_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_SuccessfulOutcome = {
+	"SuccessfulOutcome",
+	"SuccessfulOutcome",
+	&asn_OP_SEQUENCE,
+	asn_DEF_SuccessfulOutcome_tags_1,
+	sizeof(asn_DEF_SuccessfulOutcome_tags_1)
+		/sizeof(asn_DEF_SuccessfulOutcome_tags_1[0]), /* 1 */
+	asn_DEF_SuccessfulOutcome_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SuccessfulOutcome_tags_1)
+		/sizeof(asn_DEF_SuccessfulOutcome_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_SuccessfulOutcome_1,
+	3,	/* Elements count */
+	&asn_SPC_SuccessfulOutcome_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/SuccessfulOutcome.h b/3rdparty/E2AP-v01.00.00/SuccessfulOutcome.h
new file mode 100644
index 0000000..8b313a8
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/SuccessfulOutcome.h
@@ -0,0 +1,91 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Descriptions"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_SuccessfulOutcome_H_
+#define	_SuccessfulOutcome_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProcedureCode.h"
+#include "Criticality.h"
+#include "ANY.h"
+#include "asn_ioc.h"
+#include "RICsubscriptionRequest.h"
+#include "RICsubscriptionResponse.h"
+#include "RICsubscriptionFailure.h"
+#include "RICsubscriptionDeleteRequest.h"
+#include "RICsubscriptionDeleteResponse.h"
+#include "RICsubscriptionDeleteFailure.h"
+#include "RICserviceUpdate.h"
+#include "RICserviceUpdateAcknowledge.h"
+#include "RICserviceUpdateFailure.h"
+#include "RICcontrolRequest.h"
+#include "RICcontrolAcknowledge.h"
+#include "RICcontrolFailure.h"
+#include "E2setupRequest.h"
+#include "E2setupResponse.h"
+#include "E2setupFailure.h"
+#include "ResetRequest.h"
+#include "ResetResponse.h"
+#include "RICindication.h"
+#include "RICserviceQuery.h"
+#include "ErrorIndication.h"
+#include "OPEN_TYPE.h"
+#include "constr_CHOICE.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum SuccessfulOutcome__value_PR {
+	SuccessfulOutcome__value_PR_NOTHING,	/* No components present */
+	SuccessfulOutcome__value_PR_RICsubscriptionResponse,
+	SuccessfulOutcome__value_PR_RICsubscriptionDeleteResponse,
+	SuccessfulOutcome__value_PR_RICserviceUpdateAcknowledge,
+	SuccessfulOutcome__value_PR_RICcontrolAcknowledge,
+	SuccessfulOutcome__value_PR_E2setupResponse,
+	SuccessfulOutcome__value_PR_ResetResponse
+} SuccessfulOutcome__value_PR;
+
+/* SuccessfulOutcome */
+typedef struct SuccessfulOutcome {
+	ProcedureCode_t	 procedureCode;
+	Criticality_t	 criticality;
+	struct SuccessfulOutcome__value {
+		SuccessfulOutcome__value_PR present;
+		union SuccessfulOutcome__value_u {
+			RICsubscriptionResponse_t	 RICsubscriptionResponse;
+			RICsubscriptionDeleteResponse_t	 RICsubscriptionDeleteResponse;
+			RICserviceUpdateAcknowledge_t	 RICserviceUpdateAcknowledge;
+			RICcontrolAcknowledge_t	 RICcontrolAcknowledge;
+			E2setupResponse_t	 E2setupResponse;
+			ResetResponse_t	 ResetResponse;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SuccessfulOutcome_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SuccessfulOutcome;
+extern asn_SEQUENCE_specifics_t asn_SPC_SuccessfulOutcome_specs_1;
+extern asn_TYPE_member_t asn_MBR_SuccessfulOutcome_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SuccessfulOutcome_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/TimeToWait.c b/3rdparty/E2AP-v01.00.00/TimeToWait.c
new file mode 100644
index 0000000..f865028
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/TimeToWait.c
@@ -0,0 +1,63 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "TimeToWait.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static asn_per_constraints_t asn_PER_type_TimeToWait_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  5 }	/* (0..5,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_TimeToWait_value2enum_1[] = {
+	{ 0,	3,	"v1s" },
+	{ 1,	3,	"v2s" },
+	{ 2,	3,	"v5s" },
+	{ 3,	4,	"v10s" },
+	{ 4,	4,	"v20s" },
+	{ 5,	4,	"v60s" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_TimeToWait_enum2value_1[] = {
+	3,	/* v10s(3) */
+	0,	/* v1s(0) */
+	4,	/* v20s(4) */
+	1,	/* v2s(1) */
+	2,	/* v5s(2) */
+	5	/* v60s(5) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_TimeToWait_specs_1 = {
+	asn_MAP_TimeToWait_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_TimeToWait_enum2value_1,	/* N => "tag"; sorted by N */
+	6,	/* Number of elements in the maps */
+	7,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_TimeToWait_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_TimeToWait = {
+	"TimeToWait",
+	"TimeToWait",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_TimeToWait_tags_1,
+	sizeof(asn_DEF_TimeToWait_tags_1)
+		/sizeof(asn_DEF_TimeToWait_tags_1[0]), /* 1 */
+	asn_DEF_TimeToWait_tags_1,	/* Same as above */
+	sizeof(asn_DEF_TimeToWait_tags_1)
+		/sizeof(asn_DEF_TimeToWait_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_TimeToWait_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_TimeToWait_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/TimeToWait.h b/3rdparty/E2AP-v01.00.00/TimeToWait.h
new file mode 100644
index 0000000..a7496fc
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/TimeToWait.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_TimeToWait_H_
+#define	_TimeToWait_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum TimeToWait {
+	TimeToWait_v1s	= 0,
+	TimeToWait_v2s	= 1,
+	TimeToWait_v5s	= 2,
+	TimeToWait_v10s	= 3,
+	TimeToWait_v20s	= 4,
+	TimeToWait_v60s	= 5
+	/*
+	 * Enumeration is extensible
+	 */
+} e_TimeToWait;
+
+/* TimeToWait */
+typedef long	 TimeToWait_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TimeToWait;
+asn_struct_free_f TimeToWait_free;
+asn_struct_print_f TimeToWait_print;
+asn_constr_check_f TimeToWait_constraint;
+ber_type_decoder_f TimeToWait_decode_ber;
+der_type_encoder_f TimeToWait_encode_der;
+xer_type_decoder_f TimeToWait_decode_xer;
+xer_type_encoder_f TimeToWait_encode_xer;
+per_type_decoder_f TimeToWait_decode_uper;
+per_type_encoder_f TimeToWait_encode_uper;
+per_type_decoder_f TimeToWait_decode_aper;
+per_type_encoder_f TimeToWait_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TimeToWait_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/TriggeringMessage.c b/3rdparty/E2AP-v01.00.00/TriggeringMessage.c
new file mode 100644
index 0000000..69fbb17
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/TriggeringMessage.c
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-CommonDataTypes"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "TriggeringMessage.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_TriggeringMessage_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_TriggeringMessage_value2enum_1[] = {
+	{ 0,	18,	"initiating-message" },
+	{ 1,	18,	"successful-outcome" },
+	{ 2,	21,	"unsuccessfull-outcome" }
+};
+static const unsigned int asn_MAP_TriggeringMessage_enum2value_1[] = {
+	0,	/* initiating-message(0) */
+	1,	/* successful-outcome(1) */
+	2	/* unsuccessfull-outcome(2) */
+};
+const asn_INTEGER_specifics_t asn_SPC_TriggeringMessage_specs_1 = {
+	asn_MAP_TriggeringMessage_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_TriggeringMessage_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_TriggeringMessage_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_TriggeringMessage = {
+	"TriggeringMessage",
+	"TriggeringMessage",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_TriggeringMessage_tags_1,
+	sizeof(asn_DEF_TriggeringMessage_tags_1)
+		/sizeof(asn_DEF_TriggeringMessage_tags_1[0]), /* 1 */
+	asn_DEF_TriggeringMessage_tags_1,	/* Same as above */
+	sizeof(asn_DEF_TriggeringMessage_tags_1)
+		/sizeof(asn_DEF_TriggeringMessage_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_TriggeringMessage_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_TriggeringMessage_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/TriggeringMessage.h b/3rdparty/E2AP-v01.00.00/TriggeringMessage.h
new file mode 100644
index 0000000..4b8b0bf
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/TriggeringMessage.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-CommonDataTypes"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_TriggeringMessage_H_
+#define	_TriggeringMessage_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum TriggeringMessage {
+	TriggeringMessage_initiating_message	= 0,
+	TriggeringMessage_successful_outcome	= 1,
+	TriggeringMessage_unsuccessfull_outcome	= 2
+} e_TriggeringMessage;
+
+/* TriggeringMessage */
+typedef long	 TriggeringMessage_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_TriggeringMessage_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_TriggeringMessage;
+extern const asn_INTEGER_specifics_t asn_SPC_TriggeringMessage_specs_1;
+asn_struct_free_f TriggeringMessage_free;
+asn_struct_print_f TriggeringMessage_print;
+asn_constr_check_f TriggeringMessage_constraint;
+ber_type_decoder_f TriggeringMessage_decode_ber;
+der_type_encoder_f TriggeringMessage_encode_der;
+xer_type_decoder_f TriggeringMessage_decode_xer;
+xer_type_encoder_f TriggeringMessage_encode_xer;
+per_type_decoder_f TriggeringMessage_decode_uper;
+per_type_encoder_f TriggeringMessage_encode_uper;
+per_type_decoder_f TriggeringMessage_decode_aper;
+per_type_encoder_f TriggeringMessage_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TriggeringMessage_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/TypeOfError.c b/3rdparty/E2AP-v01.00.00/TypeOfError.c
new file mode 100644
index 0000000..1a0dbc0
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/TypeOfError.c
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "TypeOfError.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_TypeOfError_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_TypeOfError_value2enum_1[] = {
+	{ 0,	14,	"not-understood" },
+	{ 1,	7,	"missing" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_TypeOfError_enum2value_1[] = {
+	1,	/* missing(1) */
+	0	/* not-understood(0) */
+	/* This list is extensible */
+};
+const asn_INTEGER_specifics_t asn_SPC_TypeOfError_specs_1 = {
+	asn_MAP_TypeOfError_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_TypeOfError_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_TypeOfError_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_TypeOfError = {
+	"TypeOfError",
+	"TypeOfError",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_TypeOfError_tags_1,
+	sizeof(asn_DEF_TypeOfError_tags_1)
+		/sizeof(asn_DEF_TypeOfError_tags_1[0]), /* 1 */
+	asn_DEF_TypeOfError_tags_1,	/* Same as above */
+	sizeof(asn_DEF_TypeOfError_tags_1)
+		/sizeof(asn_DEF_TypeOfError_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_TypeOfError_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_TypeOfError_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/TypeOfError.h b/3rdparty/E2AP-v01.00.00/TypeOfError.h
new file mode 100644
index 0000000..d8fb9f8
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/TypeOfError.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-IEs"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_TypeOfError_H_
+#define	_TypeOfError_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum TypeOfError {
+	TypeOfError_not_understood	= 0,
+	TypeOfError_missing	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_TypeOfError;
+
+/* TypeOfError */
+typedef long	 TypeOfError_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_TypeOfError_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_TypeOfError;
+extern const asn_INTEGER_specifics_t asn_SPC_TypeOfError_specs_1;
+asn_struct_free_f TypeOfError_free;
+asn_struct_print_f TypeOfError_print;
+asn_constr_check_f TypeOfError_constraint;
+ber_type_decoder_f TypeOfError_decode_ber;
+der_type_encoder_f TypeOfError_encode_der;
+xer_type_decoder_f TypeOfError_decode_xer;
+xer_type_encoder_f TypeOfError_encode_xer;
+per_type_decoder_f TypeOfError_decode_uper;
+per_type_encoder_f TypeOfError_encode_uper;
+per_type_decoder_f TypeOfError_decode_aper;
+per_type_encoder_f TypeOfError_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TypeOfError_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2AP-v01.00.00/UnsuccessfulOutcome.c b/3rdparty/E2AP-v01.00.00/UnsuccessfulOutcome.c
new file mode 100644
index 0000000..1dbc884
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/UnsuccessfulOutcome.c
@@ -0,0 +1,349 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Descriptions"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "UnsuccessfulOutcome.h"
+
+static const long asn_VAL_1_id_RICsubscription = 8;
+static const long asn_VAL_1_reject = 0;
+static const long asn_VAL_2_id_RICsubscriptionDelete = 9;
+static const long asn_VAL_2_reject = 0;
+static const long asn_VAL_3_id_RICserviceUpdate = 7;
+static const long asn_VAL_3_reject = 0;
+static const long asn_VAL_4_id_RICcontrol = 4;
+static const long asn_VAL_4_reject = 0;
+static const long asn_VAL_5_id_E2setup = 1;
+static const long asn_VAL_5_reject = 0;
+static const long asn_VAL_6_id_Reset = 3;
+static const long asn_VAL_6_reject = 0;
+static const long asn_VAL_7_id_RICindication = 5;
+static const long asn_VAL_7_ignore = 1;
+static const long asn_VAL_8_id_RICserviceQuery = 6;
+static const long asn_VAL_8_ignore = 1;
+static const long asn_VAL_9_id_ErrorIndication = 2;
+static const long asn_VAL_9_ignore = 1;
+static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = {
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionRequest },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionResponse },
+	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionFailure },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_1_id_RICsubscription },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_1_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionDeleteRequest },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionDeleteResponse },
+	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionDeleteFailure },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_2_id_RICsubscriptionDelete },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_2_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICserviceUpdate },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICserviceUpdateAcknowledge },
+	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICserviceUpdateFailure },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_3_id_RICserviceUpdate },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_3_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICcontrolRequest },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICcontrolAcknowledge },
+	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICcontrolFailure },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_4_id_RICcontrol },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_4_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_E2setupRequest },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_E2setupResponse },
+	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_E2setupFailure },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_5_id_E2setup },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_5_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_ResetRequest },
+	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ResetResponse },
+	{ "&UnsuccessfulOutcome",  },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_6_id_Reset },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_reject },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICindication },
+	{ "&SuccessfulOutcome",  },
+	{ "&UnsuccessfulOutcome",  },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_7_id_RICindication },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_ignore },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICserviceQuery },
+	{ "&SuccessfulOutcome",  },
+	{ "&UnsuccessfulOutcome",  },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_8_id_RICserviceQuery },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_ignore },
+	{ "&InitiatingMessage", aioc__type, &asn_DEF_ErrorIndication },
+	{ "&SuccessfulOutcome",  },
+	{ "&UnsuccessfulOutcome",  },
+	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_9_id_ErrorIndication },
+	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_ignore }
+};
+static const asn_ioc_set_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1[] = {
+	{ 9, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows }
+};
+static int
+memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 255)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_type_selector_result_t
+select_UnsuccessfulOutcome_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1;
+	size_t constraining_column = 3; /* &procedureCode */
+	size_t for_column = 4; /* &criticality */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct UnsuccessfulOutcome, procedureCode));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_type_selector_result_t
+select_UnsuccessfulOutcome_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
+	asn_type_selector_result_t result = {0, 0};
+	const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1;
+	size_t constraining_column = 3; /* &procedureCode */
+	size_t for_column = 2; /* &UnsuccessfulOutcome */
+	size_t row, presence_index = 0;
+	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct UnsuccessfulOutcome, procedureCode));
+	
+	for(row=0; row < itable->rows_count; row++) {
+	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
+	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
+	
+	    if(type_cell->cell_kind == aioc__undefined)
+	        continue;
+	
+	    presence_index++;
+	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
+	        result.type_descriptor = type_cell->type_descriptor;
+	        result.presence_index = presence_index;
+	        break;
+	    }
+	}
+	
+	return result;
+}
+
+static int
+memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+}
+
+static asn_per_constraints_t asn_PER_memb_procedureCode_constr_2 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0,  255 }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_value_4[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcome__value, choice.RICsubscriptionFailure),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICsubscriptionFailure,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICsubscriptionFailure"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcome__value, choice.RICsubscriptionDeleteFailure),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICsubscriptionDeleteFailure,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICsubscriptionDeleteFailure"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcome__value, choice.RICserviceUpdateFailure),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICserviceUpdateFailure,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICserviceUpdateFailure"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcome__value, choice.RICcontrolFailure),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_RICcontrolFailure,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"RICcontrolFailure"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcome__value, choice.E2setupFailure),
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_E2setupFailure,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"E2setupFailure"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 4 }, /* RICsubscriptionFailure */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 3 }, /* RICsubscriptionDeleteFailure */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 2 }, /* RICserviceUpdateFailure */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 1 }, /* RICcontrolFailure */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 0 } /* E2setupFailure */
+};
+static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = {
+	sizeof(struct UnsuccessfulOutcome__value),
+	offsetof(struct UnsuccessfulOutcome__value, _asn_ctx),
+	offsetof(struct UnsuccessfulOutcome__value, present),
+	sizeof(((struct UnsuccessfulOutcome__value *)0)->present),
+	asn_MAP_value_tag2el_4,
+	5,	/* Count of tags in the map */
+	0, 0,
+	-1	/* Extensions start */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_value_4 = {
+	"value",
+	"value",
+	&asn_OP_OPEN_TYPE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, 0, OPEN_TYPE_constraint },
+	asn_MBR_value_4,
+	5,	/* Elements count */
+	&asn_SPC_value_specs_4	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_UnsuccessfulOutcome_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcome, procedureCode),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_ProcedureCode,
+		0,
+		{ 0, &asn_PER_memb_procedureCode_constr_2,  memb_procedureCode_constraint_1 },
+		0, 0, /* No default value */
+		"procedureCode"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcome, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_Criticality,
+		select_UnsuccessfulOutcome_criticality_type,
+		{ 0, &asn_PER_memb_criticality_constr_3,  memb_criticality_constraint_1 },
+		0, 0, /* No default value */
+		"criticality"
+		},
+	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcome, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_value_4,
+		select_UnsuccessfulOutcome_value_type,
+		{ 0, &asn_PER_memb_value_constr_4,  memb_value_constraint_1 },
+		0, 0, /* No default value */
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_UnsuccessfulOutcome_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_UnsuccessfulOutcome_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_UnsuccessfulOutcome_specs_1 = {
+	sizeof(struct UnsuccessfulOutcome),
+	offsetof(struct UnsuccessfulOutcome, _asn_ctx),
+	asn_MAP_UnsuccessfulOutcome_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_UnsuccessfulOutcome = {
+	"UnsuccessfulOutcome",
+	"UnsuccessfulOutcome",
+	&asn_OP_SEQUENCE,
+	asn_DEF_UnsuccessfulOutcome_tags_1,
+	sizeof(asn_DEF_UnsuccessfulOutcome_tags_1)
+		/sizeof(asn_DEF_UnsuccessfulOutcome_tags_1[0]), /* 1 */
+	asn_DEF_UnsuccessfulOutcome_tags_1,	/* Same as above */
+	sizeof(asn_DEF_UnsuccessfulOutcome_tags_1)
+		/sizeof(asn_DEF_UnsuccessfulOutcome_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_UnsuccessfulOutcome_1,
+	3,	/* Elements count */
+	&asn_SPC_UnsuccessfulOutcome_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2AP-v01.00.00/UnsuccessfulOutcome.h b/3rdparty/E2AP-v01.00.00/UnsuccessfulOutcome.h
new file mode 100644
index 0000000..0ff1652
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/UnsuccessfulOutcome.h
@@ -0,0 +1,89 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2AP-PDU-Descriptions"
+ * 	found in "spec/e2ap-v01.00.00.asn"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_UnsuccessfulOutcome_H_
+#define	_UnsuccessfulOutcome_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "ProcedureCode.h"
+#include "Criticality.h"
+#include "ANY.h"
+#include "asn_ioc.h"
+#include "RICsubscriptionRequest.h"
+#include "RICsubscriptionResponse.h"
+#include "RICsubscriptionFailure.h"
+#include "RICsubscriptionDeleteRequest.h"
+#include "RICsubscriptionDeleteResponse.h"
+#include "RICsubscriptionDeleteFailure.h"
+#include "RICserviceUpdate.h"
+#include "RICserviceUpdateAcknowledge.h"
+#include "RICserviceUpdateFailure.h"
+#include "RICcontrolRequest.h"
+#include "RICcontrolAcknowledge.h"
+#include "RICcontrolFailure.h"
+#include "E2setupRequest.h"
+#include "E2setupResponse.h"
+#include "E2setupFailure.h"
+#include "ResetRequest.h"
+#include "ResetResponse.h"
+#include "RICindication.h"
+#include "RICserviceQuery.h"
+#include "ErrorIndication.h"
+#include "OPEN_TYPE.h"
+#include "constr_CHOICE.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum UnsuccessfulOutcome__value_PR {
+	UnsuccessfulOutcome__value_PR_NOTHING,	/* No components present */
+	UnsuccessfulOutcome__value_PR_RICsubscriptionFailure,
+	UnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure,
+	UnsuccessfulOutcome__value_PR_RICserviceUpdateFailure,
+	UnsuccessfulOutcome__value_PR_RICcontrolFailure,
+	UnsuccessfulOutcome__value_PR_E2setupFailure
+} UnsuccessfulOutcome__value_PR;
+
+/* UnsuccessfulOutcome */
+typedef struct UnsuccessfulOutcome {
+	ProcedureCode_t	 procedureCode;
+	Criticality_t	 criticality;
+	struct UnsuccessfulOutcome__value {
+		UnsuccessfulOutcome__value_PR present;
+		union UnsuccessfulOutcome__value_u {
+			RICsubscriptionFailure_t	 RICsubscriptionFailure;
+			RICsubscriptionDeleteFailure_t	 RICsubscriptionDeleteFailure;
+			RICserviceUpdateFailure_t	 RICserviceUpdateFailure;
+			RICcontrolFailure_t	 RICcontrolFailure;
+			E2setupFailure_t	 E2setupFailure;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UnsuccessfulOutcome_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UnsuccessfulOutcome;
+extern asn_SEQUENCE_specifics_t asn_SPC_UnsuccessfulOutcome_specs_1;
+extern asn_TYPE_member_t asn_MBR_UnsuccessfulOutcome_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UnsuccessfulOutcome_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/asn_SEQUENCE_OF.c b/3rdparty/E2AP-v01.00.00/asn_SEQUENCE_OF.c
similarity index 100%
rename from 3rdparty/libe2ap/asn_SEQUENCE_OF.c
rename to 3rdparty/E2AP-v01.00.00/asn_SEQUENCE_OF.c
diff --git a/3rdparty/libe2ap/asn_SEQUENCE_OF.h b/3rdparty/E2AP-v01.00.00/asn_SEQUENCE_OF.h
similarity index 100%
rename from 3rdparty/libe2ap/asn_SEQUENCE_OF.h
rename to 3rdparty/E2AP-v01.00.00/asn_SEQUENCE_OF.h
diff --git a/3rdparty/libe2ap/asn_SET_OF.c b/3rdparty/E2AP-v01.00.00/asn_SET_OF.c
similarity index 100%
rename from 3rdparty/libe2ap/asn_SET_OF.c
rename to 3rdparty/E2AP-v01.00.00/asn_SET_OF.c
diff --git a/3rdparty/libe2ap/asn_SET_OF.h b/3rdparty/E2AP-v01.00.00/asn_SET_OF.h
similarity index 100%
rename from 3rdparty/libe2ap/asn_SET_OF.h
rename to 3rdparty/E2AP-v01.00.00/asn_SET_OF.h
diff --git a/3rdparty/libe2ap/asn_application.c b/3rdparty/E2AP-v01.00.00/asn_application.c
similarity index 100%
rename from 3rdparty/libe2ap/asn_application.c
rename to 3rdparty/E2AP-v01.00.00/asn_application.c
diff --git a/3rdparty/libe2ap/asn_application.h b/3rdparty/E2AP-v01.00.00/asn_application.h
similarity index 100%
rename from 3rdparty/libe2ap/asn_application.h
rename to 3rdparty/E2AP-v01.00.00/asn_application.h
diff --git a/3rdparty/libe2ap/asn_bit_data.c b/3rdparty/E2AP-v01.00.00/asn_bit_data.c
similarity index 100%
rename from 3rdparty/libe2ap/asn_bit_data.c
rename to 3rdparty/E2AP-v01.00.00/asn_bit_data.c
diff --git a/3rdparty/libe2ap/asn_bit_data.h b/3rdparty/E2AP-v01.00.00/asn_bit_data.h
similarity index 100%
rename from 3rdparty/libe2ap/asn_bit_data.h
rename to 3rdparty/E2AP-v01.00.00/asn_bit_data.h
diff --git a/3rdparty/libe2ap/asn_codecs.h b/3rdparty/E2AP-v01.00.00/asn_codecs.h
similarity index 100%
rename from 3rdparty/libe2ap/asn_codecs.h
rename to 3rdparty/E2AP-v01.00.00/asn_codecs.h
diff --git a/3rdparty/libe2ap/asn_codecs_prim.c b/3rdparty/E2AP-v01.00.00/asn_codecs_prim.c
similarity index 100%
rename from 3rdparty/libe2ap/asn_codecs_prim.c
rename to 3rdparty/E2AP-v01.00.00/asn_codecs_prim.c
diff --git a/3rdparty/libe2ap/asn_codecs_prim.h b/3rdparty/E2AP-v01.00.00/asn_codecs_prim.h
similarity index 100%
rename from 3rdparty/libe2ap/asn_codecs_prim.h
rename to 3rdparty/E2AP-v01.00.00/asn_codecs_prim.h
diff --git a/3rdparty/E2AP-v01.00.00/asn_constant.h b/3rdparty/E2AP-v01.00.00/asn_constant.h
new file mode 100644
index 0000000..a6f348c
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/asn_constant.h
@@ -0,0 +1,22 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ */
+
+#ifndef _ASN_CONSTANT_H
+#define _ASN_CONSTANT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define maxProtocolIEs (65535)
+#define maxnoofErrors (256)
+#define maxofRANfunctionID (256)
+#define maxofRICactionID (16)
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ASN_CONSTANT_H */
diff --git a/3rdparty/libe2ap/asn_internal.c b/3rdparty/E2AP-v01.00.00/asn_internal.c
similarity index 100%
rename from 3rdparty/libe2ap/asn_internal.c
rename to 3rdparty/E2AP-v01.00.00/asn_internal.c
diff --git a/3rdparty/libe2ap/asn_internal.h b/3rdparty/E2AP-v01.00.00/asn_internal.h
similarity index 100%
rename from 3rdparty/libe2ap/asn_internal.h
rename to 3rdparty/E2AP-v01.00.00/asn_internal.h
diff --git a/3rdparty/libe2ap/asn_ioc.h b/3rdparty/E2AP-v01.00.00/asn_ioc.h
similarity index 100%
rename from 3rdparty/libe2ap/asn_ioc.h
rename to 3rdparty/E2AP-v01.00.00/asn_ioc.h
diff --git a/3rdparty/libe2ap/asn_random_fill.c b/3rdparty/E2AP-v01.00.00/asn_random_fill.c
similarity index 100%
rename from 3rdparty/libe2ap/asn_random_fill.c
rename to 3rdparty/E2AP-v01.00.00/asn_random_fill.c
diff --git a/3rdparty/libe2ap/asn_random_fill.h b/3rdparty/E2AP-v01.00.00/asn_random_fill.h
similarity index 100%
rename from 3rdparty/libe2ap/asn_random_fill.h
rename to 3rdparty/E2AP-v01.00.00/asn_random_fill.h
diff --git a/3rdparty/libe2ap/asn_system.h b/3rdparty/E2AP-v01.00.00/asn_system.h
similarity index 100%
rename from 3rdparty/libe2ap/asn_system.h
rename to 3rdparty/E2AP-v01.00.00/asn_system.h
diff --git a/3rdparty/libe2ap/ber_decoder.c b/3rdparty/E2AP-v01.00.00/ber_decoder.c
similarity index 100%
rename from 3rdparty/libe2ap/ber_decoder.c
rename to 3rdparty/E2AP-v01.00.00/ber_decoder.c
diff --git a/3rdparty/libe2ap/ber_decoder.h b/3rdparty/E2AP-v01.00.00/ber_decoder.h
similarity index 100%
rename from 3rdparty/libe2ap/ber_decoder.h
rename to 3rdparty/E2AP-v01.00.00/ber_decoder.h
diff --git a/3rdparty/libe2ap/ber_tlv_length.c b/3rdparty/E2AP-v01.00.00/ber_tlv_length.c
similarity index 100%
rename from 3rdparty/libe2ap/ber_tlv_length.c
rename to 3rdparty/E2AP-v01.00.00/ber_tlv_length.c
diff --git a/3rdparty/libe2ap/ber_tlv_length.h b/3rdparty/E2AP-v01.00.00/ber_tlv_length.h
similarity index 100%
rename from 3rdparty/libe2ap/ber_tlv_length.h
rename to 3rdparty/E2AP-v01.00.00/ber_tlv_length.h
diff --git a/3rdparty/libe2ap/ber_tlv_tag.c b/3rdparty/E2AP-v01.00.00/ber_tlv_tag.c
similarity index 100%
rename from 3rdparty/libe2ap/ber_tlv_tag.c
rename to 3rdparty/E2AP-v01.00.00/ber_tlv_tag.c
diff --git a/3rdparty/libe2ap/ber_tlv_tag.h b/3rdparty/E2AP-v01.00.00/ber_tlv_tag.h
similarity index 100%
rename from 3rdparty/libe2ap/ber_tlv_tag.h
rename to 3rdparty/E2AP-v01.00.00/ber_tlv_tag.h
diff --git a/3rdparty/E2AP-v01.00.00/constr_CHOICE.c b/3rdparty/E2AP-v01.00.00/constr_CHOICE.c
new file mode 100644
index 0000000..613e6ea
--- /dev/null
+++ b/3rdparty/E2AP-v01.00.00/constr_CHOICE.c
@@ -0,0 +1,1511 @@
+/*
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#include <asn_internal.h>
+#include <constr_CHOICE.h>
+#include <per_opentype.h>
+
+/*
+ * Number of bytes left for this structure.
+ * (ctx->left) indicates the number of bytes _transferred_ for the structure.
+ * (size) contains the number of bytes in the buffer passed.
+ */
+#define	LEFT	((size<(size_t)ctx->left)?size:(size_t)ctx->left)
+
+/*
+ * If the subprocessor function returns with an indication that it wants
+ * more data, it may well be a fatal decoding problem, because the
+ * size is constrained by the <TLV>'s L, even if the buffer size allows
+ * reading more data.
+ * For example, consider the buffer containing the following TLVs:
+ * <T:5><L:1><V> <T:6>...
+ * The TLV length clearly indicates that one byte is expected in V, but
+ * if the V processor returns with "want more data" even if the buffer
+ * contains way more data than the V processor have seen.
+ */
+#define	SIZE_VIOLATION	(ctx->left >= 0 && (size_t)ctx->left <= size)
+
+/*
+ * This macro "eats" the part of the buffer which is definitely "consumed",
+ * i.e. was correctly converted into local representation or rightfully skipped.
+ */
+#undef	ADVANCE
+#define	ADVANCE(num_bytes)	do {		\
+		size_t num = num_bytes;		\
+		ptr = ((const char *)ptr) + num;\
+		size -= num;			\
+		if(ctx->left >= 0)		\
+			ctx->left -= num;	\
+		consumed_myself += num;		\
+	} while(0)
+
+/*
+ * Switch to the next phase of parsing.
+ */
+#undef	NEXT_PHASE
+#define	NEXT_PHASE(ctx)	do {			\
+		ctx->phase++;			\
+		ctx->step = 0;			\
+	} while(0)
+
+/*
+ * Return a standardized complex structure.
+ */
+#undef	RETURN
+#define	RETURN(_code)	do {			\
+		rval.code = _code;		\
+		rval.consumed = consumed_myself;\
+		return rval;			\
+	} while(0)
+
+/*
+ * See the definitions.
+ */
+static unsigned _fetch_present_idx(const void *struct_ptr, unsigned off,
+                                   unsigned size);
+static void _set_present_idx(void *sptr, unsigned offset, unsigned size,
+                             unsigned pres);
+static const void *_get_member_ptr(const asn_TYPE_descriptor_t *,
+                                   const void *sptr, asn_TYPE_member_t **elm,
+                                   unsigned *present);
+
+/*
+ * Tags are canonically sorted in the tag to member table.
+ */
+static int
+_search4tag(const void *ap, const void *bp) {
+	const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap;
+	const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp;
+
+	int a_class = BER_TAG_CLASS(a->el_tag);
+	int b_class = BER_TAG_CLASS(b->el_tag);
+
+	if(a_class == b_class) {
+		ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag);
+		ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag);
+
+		if(a_value == b_value)
+			return 0;
+		else if(a_value < b_value)
+			return -1;
+		else
+			return 1;
+	} else if(a_class < b_class) {
+		return -1;
+	} else {
+		return 1;
+	}
+}
+
+/*
+ * The decoder of the CHOICE type.
+ */
+asn_dec_rval_t
+CHOICE_decode_ber(const asn_codec_ctx_t *opt_codec_ctx,
+                  const asn_TYPE_descriptor_t *td, void **struct_ptr,
+                  const void *ptr, size_t size, int tag_mode) {
+    /*
+	 * Bring closer parts of structure description.
+	 */
+	const asn_CHOICE_specifics_t *specs =
+		(const asn_CHOICE_specifics_t *)td->specifics;
+	asn_TYPE_member_t *elements = td->elements;
+
+	/*
+	 * Parts of the structure being constructed.
+	 */
+	void *st = *struct_ptr;	/* Target structure. */
+	asn_struct_ctx_t *ctx;	/* Decoder context */
+
+	ber_tlv_tag_t tlv_tag;	/* T from TLV */
+	ssize_t tag_len;	/* Length of TLV's T */
+	asn_dec_rval_t rval;	/* Return code from subparsers */
+
+	ssize_t consumed_myself = 0;	/* Consumed bytes from ptr */
+
+	ASN_DEBUG("Decoding %s as CHOICE", td->name);
+
+	/*
+	 * Create the target structure if it is not present already.
+	 */
+	if(st == 0) {
+		st = *struct_ptr = CALLOC(1, specs->struct_size);
+		if(st == 0) {
+			RETURN(RC_FAIL);
+		}
+	}
+
+	/*
+	 * Restore parsing context.
+	 */
+	ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
+	
+	/*
+	 * Start to parse where left previously
+	 */
+	switch(ctx->phase) {
+	case 0:
+		/*
+		 * PHASE 0.
+		 * Check that the set of tags associated with given structure
+		 * perfectly fits our expectations.
+		 */
+
+		if(tag_mode || td->tags_count) {
+			rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size,
+				tag_mode, -1, &ctx->left, 0);
+			if(rval.code != RC_OK) {
+				ASN_DEBUG("%s tagging check failed: %d",
+					td->name, rval.code);
+				return rval;
+			}
+
+			if(ctx->left >= 0) {
+				/* ?Substracted below! */
+				ctx->left += rval.consumed;
+			}
+			ADVANCE(rval.consumed);
+		} else {
+			ctx->left = -1;
+		}
+
+		NEXT_PHASE(ctx);
+
+		ASN_DEBUG("Structure consumes %ld bytes, buffer %ld",
+			(long)ctx->left, (long)size);
+
+		/* Fall through */
+	case 1:
+		/*
+		 * Fetch the T from TLV.
+		 */
+		tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag);
+		ASN_DEBUG("In %s CHOICE tag length %d", td->name, (int)tag_len);
+		switch(tag_len) {
+		case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE);
+			/* Fall through */
+		case -1: RETURN(RC_FAIL);
+		}
+
+		do {
+			const asn_TYPE_tag2member_t *t2m;
+			asn_TYPE_tag2member_t key;
+
+			key.el_tag = tlv_tag;
+			t2m = (const asn_TYPE_tag2member_t *)bsearch(&key,
+					specs->tag2el, specs->tag2el_count,
+					sizeof(specs->tag2el[0]), _search4tag);
+			if(t2m) {
+				/*
+				 * Found the element corresponding to the tag.
+				 */
+				NEXT_PHASE(ctx);
+				ctx->step = t2m->el_no;
+				break;
+			} else if(specs->ext_start == -1) {
+				ASN_DEBUG("Unexpected tag %s "
+					"in non-extensible CHOICE %s",
+					ber_tlv_tag_string(tlv_tag), td->name);
+				RETURN(RC_FAIL);
+			} else {
+				/* Skip this tag */
+				ssize_t skip;
+
+				ASN_DEBUG("Skipping unknown tag %s",
+					ber_tlv_tag_string(tlv_tag));
+
+				skip = ber_skip_length(opt_codec_ctx,
+					BER_TLV_CONSTRUCTED(ptr),
+					(const char *)ptr + tag_len,
+					LEFT - tag_len);
+
+				switch(skip) {
+				case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE);
+					/* Fall through */
+				case -1: RETURN(RC_FAIL);
+				}
+
+				ADVANCE(skip + tag_len);
+				RETURN(RC_OK);
+			}
+		} while(0);
+
+	case 2:
+		/*
+		 * PHASE 2.
+		 * Read in the element.
+		 */
+	    do {
+		asn_TYPE_member_t *elm;/* CHOICE's element */
+		void *memb_ptr;		/* Pointer to the member */
+		void **memb_ptr2;	/* Pointer to that pointer */
+
+		elm = &elements[ctx->step];
+
+		/*
+		 * Compute the position of the member inside a structure,
+		 * and also a type of containment (it may be contained
+		 * as pointer or using inline inclusion).
+		 */
+		if(elm->flags & ATF_POINTER) {
+			/* Member is a pointer to another structure */
+			memb_ptr2 = (void **)((char *)st + elm->memb_offset);
+		} else {
+			/*
+			 * A pointer to a pointer
+			 * holding the start of the structure
+			 */
+			memb_ptr = (char *)st + elm->memb_offset;
+			memb_ptr2 = &memb_ptr;
+		}
+		/* Set presence to be able to free it properly at any time */
+		_set_present_idx(st, specs->pres_offset,
+				specs->pres_size, ctx->step + 1);
+		/*
+		 * Invoke the member fetch routine according to member's type
+		 */
+		rval = elm->type->op->ber_decoder(opt_codec_ctx, elm->type,
+				memb_ptr2, ptr, LEFT, elm->tag_mode);
+		switch(rval.code) {
+		case RC_OK:
+			break;
+		case RC_WMORE: /* More data expected */
+			if(!SIZE_VIOLATION) {
+				ADVANCE(rval.consumed);
+				RETURN(RC_WMORE);
+			}
+			RETURN(RC_FAIL);
+		case RC_FAIL: /* Fatal error */
+			RETURN(rval.code);
+		} /* switch(rval) */
+		
+		ADVANCE(rval.consumed);
+	  } while(0);
+
+		NEXT_PHASE(ctx);
+
+		/* Fall through */
+	case 3:
+		ASN_DEBUG("CHOICE %s Leftover: %ld, size = %ld, tm=%d, tc=%d",
+			td->name, (long)ctx->left, (long)size,
+			tag_mode, td->tags_count);
+
+		if(ctx->left > 0) {
+			/*
+			 * The type must be fully decoded
+			 * by the CHOICE member-specific decoder.
+			 */
+			RETURN(RC_FAIL);
+		}
+
+		if(ctx->left == -1
+		&& !(tag_mode || td->tags_count)) {
+			/*
+			 * This is an untagged CHOICE.
+			 * It doesn't contain nothing
+			 * except for the member itself, including all its tags.
+			 * The decoding is completed.
+			 */
+			NEXT_PHASE(ctx);
+			break;
+		}
+
+		/*
+		 * Read in the "end of data chunks"'s.
+		 */
+		while(ctx->left < 0) {
+			ssize_t tl;
+
+			tl = ber_fetch_tag(ptr, LEFT, &tlv_tag);
+			switch(tl) {
+			case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE);
+				/* Fall through */
+			case -1: RETURN(RC_FAIL);
+			}
+
+			/*
+			 * Expected <0><0>...
+			 */
+			if(((const uint8_t *)ptr)[0] == 0) {
+				if(LEFT < 2) {
+					if(SIZE_VIOLATION)
+						RETURN(RC_FAIL);
+					else
+						RETURN(RC_WMORE);
+				} else if(((const uint8_t *)ptr)[1] == 0) {
+					/*
+					 * Correctly finished with <0><0>.
+					 */
+					ADVANCE(2);
+					ctx->left++;
+					continue;
+				}
+			} else {
+				ASN_DEBUG("Unexpected continuation in %s",
+					td->name);
+				RETURN(RC_FAIL);
+			}
+
+			/* UNREACHABLE */
+		}
+
+		NEXT_PHASE(ctx);
+	case 4:
+		/* No meaningful work here */
+		break;
+	}
+	
+	RETURN(RC_OK);
+}
+
+asn_enc_rval_t
+CHOICE_encode_der(const asn_TYPE_descriptor_t *td, const void *sptr,
+                  int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb,
+                  void *app_key) {
+    const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics;
+	asn_TYPE_member_t *elm;	/* CHOICE element */
+	asn_enc_rval_t erval = {0,0,0};
+	const void *memb_ptr;
+	size_t computed_size = 0;
+	unsigned present;
+
+	if(!sptr) ASN__ENCODE_FAILED;
+
+	ASN_DEBUG("%s %s as CHOICE",
+		cb?"Encoding":"Estimating", td->name);
+
+	present = _fetch_present_idx(sptr,
+		specs->pres_offset, specs->pres_size);
+
+	/*
+	 * If the structure was not initialized, it cannot be encoded:
+	 * can't deduce what to encode in the choice type.
+	 */
+	if(present == 0 || present > td->elements_count) {
+		if(present == 0 && td->elements_count == 0) {
+			/* The CHOICE is empty?! */
+			erval.encoded = 0;
+			ASN__ENCODED_OK(erval);
+		}
+		ASN__ENCODE_FAILED;
+	}
+
+	/*
+	 * Seek over the present member of the structure.
+	 */
+	elm = &td->elements[present-1];
+	if(elm->flags & ATF_POINTER) {
+        memb_ptr =
+            *(const void *const *)((const char *)sptr + elm->memb_offset);
+        if(memb_ptr == 0) {
+			if(elm->optional) {
+				erval.encoded = 0;
+				ASN__ENCODED_OK(erval);
+			}
+			/* Mandatory element absent */
+			ASN__ENCODE_FAILED;
+		}
+	} else {
+        memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
+    }
+
+	/*
+	 * If the CHOICE itself is tagged EXPLICIT:
+	 * T ::= [2] EXPLICIT CHOICE { ... }
+	 * Then emit the appropriate tags.
+	 */
+	if(tag_mode == 1 || td->tags_count) {
+		/*
+		 * For this, we need to pre-compute the member.
+		 */
+		ssize_t ret;
+
+		/* Encode member with its tag */
+		erval = elm->type->op->der_encoder(elm->type, memb_ptr,
+			elm->tag_mode, elm->tag, 0, 0);
+		if(erval.encoded == -1)
+			return erval;
+
+		/* Encode CHOICE with parent or my own tag */
+		ret = der_write_tags(td, erval.encoded, tag_mode, 1, tag,
+			cb, app_key);
+		if(ret == -1)
+			ASN__ENCODE_FAILED;
+		computed_size += ret;
+	}
+
+	/*
+	 * Encode the single underlying member.
+	 */
+	erval = elm->type->op->der_encoder(elm->type, memb_ptr,
+		elm->tag_mode, elm->tag, cb, app_key);
+	if(erval.encoded == -1)
+		return erval;
+
+	ASN_DEBUG("Encoded CHOICE member in %ld bytes (+%ld)",
+		(long)erval.encoded, (long)computed_size);
+
+	erval.encoded += computed_size;
+
+	return erval;
+}
+
+ber_tlv_tag_t
+CHOICE_outmost_tag(const asn_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber_tlv_tag_t tag) {
+	const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics;
+	unsigned present;
+
+	assert(tag_mode == 0); (void)tag_mode;
+	assert(tag == 0); (void)tag;
+
+	/*
+	 * Figure out which CHOICE element is encoded.
+	 */
+	present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size);
+
+	if(present > 0 && present <= td->elements_count) {
+		const asn_TYPE_member_t *elm = &td->elements[present-1];
+		const void *memb_ptr;
+
+		if(elm->flags & ATF_POINTER) {
+			memb_ptr = *(const void * const *)
+					((const char *)ptr + elm->memb_offset);
+		} else {
+			memb_ptr = (const void *)
+					((const char *)ptr + elm->memb_offset);
+		}
+
+		return asn_TYPE_outmost_tag(elm->type, memb_ptr,
+			elm->tag_mode, elm->tag);
+	} else {
+		return (ber_tlv_tag_t)-1;
+	}
+}
+
+int
+CHOICE_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+                  asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+    const asn_CHOICE_specifics_t *specs =
+        (const asn_CHOICE_specifics_t *)td->specifics;
+    unsigned present;
+
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+
+	/*
+	 * Figure out which CHOICE element is encoded.
+	 */
+	present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size);
+	if(present > 0 && present <= td->elements_count) {
+		asn_TYPE_member_t *elm = &td->elements[present-1];
+		const void *memb_ptr;
+
+		if(elm->flags & ATF_POINTER) {
+			memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
+			if(!memb_ptr) {
+				if(elm->optional)
+					return 0;
+				ASN__CTFAIL(app_key, td, sptr,
+					"%s: mandatory CHOICE element %s absent (%s:%d)",
+					td->name, elm->name, __FILE__, __LINE__);
+				return -1;
+			}
+		} else {
+			memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
+		}
+
+		if(elm->encoding_constraints.general_constraints) {
+			return elm->encoding_constraints.general_constraints(elm->type, memb_ptr,
+				ctfailcb, app_key);
+		} else {
+			return elm->type->encoding_constraints.general_constraints(elm->type,
+					memb_ptr, ctfailcb, app_key);
+		}
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: no CHOICE element given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+#undef	XER_ADVANCE
+#define	XER_ADVANCE(num_bytes)	do {			\
+		size_t num = num_bytes;			\
+		buf_ptr = (const void *)(((const char *)buf_ptr) + num); \
+		size -= num;				\
+		consumed_myself += num;			\
+	} while(0)
+
+/*
+ * Decode the XER (XML) data.
+ */
+asn_dec_rval_t
+CHOICE_decode_xer(const asn_codec_ctx_t *opt_codec_ctx,
+                  const asn_TYPE_descriptor_t *td, void **struct_ptr,
+                  const char *opt_mname, const void *buf_ptr, size_t size) {
+    /*
+	 * Bring closer parts of structure description.
+	 */
+	const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics;
+	const char *xml_tag = opt_mname ? opt_mname : td->xml_tag;
+
+	/*
+	 * Parts of the structure being constructed.
+	 */
+	void *st = *struct_ptr;	/* Target structure. */
+	asn_struct_ctx_t *ctx;	/* Decoder context */
+
+	asn_dec_rval_t rval;		/* Return value of a decoder */
+	ssize_t consumed_myself = 0;	/* Consumed bytes from ptr */
+	size_t edx;			/* Element index */
+
+	/*
+	 * Create the target structure if it is not present already.
+	 */
+	if(st == 0) {
+		st = *struct_ptr = CALLOC(1, specs->struct_size);
+		if(st == 0) RETURN(RC_FAIL);
+	}
+
+	/*
+	 * Restore parsing context.
+	 */
+	ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
+	if(ctx->phase == 0 && !*xml_tag)
+		ctx->phase = 1;	/* Skip the outer tag checking phase */
+
+	/*
+	 * Phases of XER/XML processing:
+	 * Phase 0: Check that the opening tag matches our expectations.
+	 * Phase 1: Processing body and reacting on closing tag.
+	 * Phase 2: Processing inner type.
+	 * Phase 3: Only waiting for closing tag.
+	 * Phase 4: Skipping unknown extensions.
+	 * Phase 5: PHASED OUT
+	 */
+	for(edx = ctx->step; ctx->phase <= 4;) {
+		pxer_chunk_type_e ch_type;	/* XER chunk type */
+		ssize_t ch_size;		/* Chunk size */
+		xer_check_tag_e tcv;		/* Tag check value */
+		asn_TYPE_member_t *elm;
+
+		/*
+		 * Go inside the member.
+		 */
+		if(ctx->phase == 2) {
+			asn_dec_rval_t tmprval;
+			void *memb_ptr;		/* Pointer to the member */
+			void **memb_ptr2;	/* Pointer to that pointer */
+			unsigned old_present;
+
+			elm = &td->elements[edx];
+
+			if(elm->flags & ATF_POINTER) {
+				/* Member is a pointer to another structure */
+				memb_ptr2 = (void **)((char *)st
+					+ elm->memb_offset);
+			} else {
+				memb_ptr = (char *)st + elm->memb_offset;
+				memb_ptr2 = &memb_ptr;
+			}
+
+			/* Start/Continue decoding the inner member */
+			tmprval = elm->type->op->xer_decoder(opt_codec_ctx,
+					elm->type, memb_ptr2, elm->name,
+					buf_ptr, size);
+			XER_ADVANCE(tmprval.consumed);
+			ASN_DEBUG("XER/CHOICE: itdf: [%s] code=%d",
+				elm->type->name, tmprval.code);
+			old_present = _fetch_present_idx(st,
+				specs->pres_offset, specs->pres_size);
+			assert(old_present == 0 || old_present == edx + 1);
+			/* Record what we've got */
+			_set_present_idx(st,
+				specs->pres_offset, specs->pres_size, edx + 1);
+			if(tmprval.code != RC_OK)
+				RETURN(tmprval.code);
+			ctx->phase = 3;
+			/* Fall through */
+		}
+
+		/* No need to wait for closing tag; special mode. */
+		if(ctx->phase == 3 && !*xml_tag) {
+			ctx->phase = 5;	/* Phase out */
+			RETURN(RC_OK);
+		}
+
+		/*
+		 * Get the next part of the XML stream.
+		 */
+		ch_size = xer_next_token(&ctx->context, buf_ptr, size, &ch_type);
+		if(ch_size == -1) {
+            RETURN(RC_FAIL);
+        } else {
+			switch(ch_type) {
+			case PXER_WMORE:
+                RETURN(RC_WMORE);
+			case PXER_COMMENT:	/* Got XML comment */
+			case PXER_TEXT:		/* Ignore free-standing text */
+				XER_ADVANCE(ch_size);	/* Skip silently */
+				continue;
+			case PXER_TAG:
+				break;	/* Check the rest down there */
+			}
+		}
+
+		tcv = xer_check_tag(buf_ptr, ch_size, xml_tag);
+		ASN_DEBUG("XER/CHOICE checked [%c%c%c%c] vs [%s], tcv=%d",
+			ch_size>0?((const uint8_t *)buf_ptr)[0]:'?',
+			ch_size>1?((const uint8_t *)buf_ptr)[1]:'?',
+			ch_size>2?((const uint8_t *)buf_ptr)[2]:'?',
+			ch_size>3?((const uint8_t *)buf_ptr)[3]:'?',
+		xml_tag, tcv);
+
+		/* Skip the extensions section */
+		if(ctx->phase == 4) {
+			ASN_DEBUG("skip_unknown(%d, %ld)",
+				tcv, (long)ctx->left);
+			switch(xer_skip_unknown(tcv, &ctx->left)) {
+			case -1:
+				ctx->phase = 5;
+				RETURN(RC_FAIL);
+			case 1:
+				ctx->phase = 3;
+				/* Fall through */
+			case 0:
+				XER_ADVANCE(ch_size);
+				continue;
+			case 2:
+				ctx->phase = 3;
+				break;
+			}
+		}
+
+		switch(tcv) {
+		case XCT_BOTH:
+			break;	/* No CHOICE? */
+		case XCT_CLOSING:
+			if(ctx->phase != 3)
+				break;
+			XER_ADVANCE(ch_size);
+			ctx->phase = 5;	/* Phase out */
+			RETURN(RC_OK);
+		case XCT_OPENING:
+			if(ctx->phase == 0) {
+				XER_ADVANCE(ch_size);
+				ctx->phase = 1;	/* Processing body phase */
+				continue;
+			}
+			/* Fall through */
+		case XCT_UNKNOWN_OP:
+		case XCT_UNKNOWN_BO:
+
+			if(ctx->phase != 1)
+				break;	/* Really unexpected */
+
+			/*
+			 * Search which inner member corresponds to this tag.
+			 */
+			for(edx = 0; edx < td->elements_count; edx++) {
+				elm = &td->elements[edx];
+				tcv = xer_check_tag(buf_ptr,ch_size,elm->name);
+				switch(tcv) {
+				case XCT_BOTH:
+				case XCT_OPENING:
+					/*
+					 * Process this member.
+					 */
+					ctx->step = edx;
+					ctx->phase = 2;
+					break;
+				case XCT_UNKNOWN_OP:
+				case XCT_UNKNOWN_BO:
+					continue;
+				default:
+					edx = td->elements_count;
+					break;	/* Phase out */
+				}
+				break;
+			}
+			if(edx != td->elements_count)
+				continue;
+
+			/* It is expected extension */
+			if(specs->ext_start != -1) {
+				ASN_DEBUG("Got anticipated extension");
+				/*
+				 * Check for (XCT_BOTH or XCT_UNKNOWN_BO)
+				 * By using a mask. Only record a pure
+				 * <opening> tags.
+				 */
+				if(tcv & XCT_CLOSING) {
+					/* Found </extension> without body */
+					ctx->phase = 3; /* Terminating */
+				} else {
+					ctx->left = 1;
+					ctx->phase = 4; /* Skip ...'s */
+				}
+				XER_ADVANCE(ch_size);
+				continue;
+			}
+
+			/* Fall through */
+		default:
+			break;
+		}
+
+		ASN_DEBUG("Unexpected XML tag [%c%c%c%c] in CHOICE [%s]"
+			" (ph=%d, tag=%s)",
+			ch_size>0?((const uint8_t *)buf_ptr)[0]:'?',
+			ch_size>1?((const uint8_t *)buf_ptr)[1]:'?',
+			ch_size>2?((const uint8_t *)buf_ptr)[2]:'?',
+			ch_size>3?((const uint8_t *)buf_ptr)[3]:'?',
+			td->name, ctx->phase, xml_tag);
+		break;
+	}
+
+	ctx->phase = 5;	/* Phase out, just in case */
+	RETURN(RC_FAIL);
+}
+
+
+asn_enc_rval_t
+CHOICE_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
+                  enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb,
+                  void *app_key) {
+	const asn_CHOICE_specifics_t *specs =
+        	(const asn_CHOICE_specifics_t *)td->specifics;
+	asn_enc_rval_t er = {0,0,0};
+	unsigned present = 0;
+
+	if(!sptr)
+		ASN__ENCODE_FAILED;
+
+	/*
+	 * Figure out which CHOICE element is encoded.
+	 */
+	present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size);
+
+	if(present == 0 || present > td->elements_count) {
+		ASN__ENCODE_FAILED;
+	}  else {
+		asn_enc_rval_t tmper = {0,0,0};
+		asn_TYPE_member_t *elm = &td->elements[present-1];
+		const void *memb_ptr = NULL;
+		const char *mname = elm->name;
+		unsigned int mlen = strlen(mname);
+
+		if(elm->flags & ATF_POINTER) {
+            memb_ptr =
+                *(const void *const *)((const char *)sptr + elm->memb_offset);
+            if(!memb_ptr) ASN__ENCODE_FAILED;
+		} else {
+            memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
+        }
+
+        er.encoded = 0;
+
+		if(!(flags & XER_F_CANONICAL)) ASN__TEXT_INDENT(1, ilevel);
+		ASN__CALLBACK3("<", 1, mname, mlen, ">", 1);
+
+		tmper = elm->type->op->xer_encoder(elm->type, memb_ptr,
+				ilevel + 1, flags, cb, app_key);
+		if(tmper.encoded == -1) return tmper;
+		er.encoded += tmper.encoded;
+
+		ASN__CALLBACK3("</", 2, mname, mlen, ">", 1);
+	}
+
+	if(!(flags & XER_F_CANONICAL)) ASN__TEXT_INDENT(1, ilevel - 1);
+
+	ASN__ENCODED_OK(er);
+cb_failed:
+	ASN__ENCODE_FAILED;
+}
+
+asn_dec_rval_t
+CHOICE_decode_uper(const asn_codec_ctx_t *opt_codec_ctx,
+                   const asn_TYPE_descriptor_t *td,
+                   const asn_per_constraints_t *constraints, void **sptr,
+                   asn_per_data_t *pd) {
+    const asn_CHOICE_specifics_t *specs =
+        (const asn_CHOICE_specifics_t *)td->specifics;
+    asn_dec_rval_t rv;
+	const asn_per_constraint_t *ct;
+	asn_TYPE_member_t *elm;	/* CHOICE's element */
+	void *memb_ptr;
+	void **memb_ptr2;
+	void *st = *sptr;
+	int value;
+
+	if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx))
+		ASN__DECODE_FAILED;
+
+	/*
+	 * Create the target structure if it is not present already.
+	 */
+	if(!st) {
+		st = *sptr = CALLOC(1, specs->struct_size);
+		if(!st) ASN__DECODE_FAILED;
+	}
+
+	if(constraints) ct = &constraints->value;
+	else if(td->encoding_constraints.per_constraints) ct = &td->encoding_constraints.per_constraints->value;
+	else ct = 0;
+
+	if(ct && ct->flags & APC_EXTENSIBLE) {
+		value = per_get_few_bits(pd, 1);
+		if(value < 0) ASN__DECODE_STARVED;
+		if(value) ct = 0;	/* Not restricted */
+	}
+
+	if(ct && ct->range_bits >= 0) {
+		value = per_get_few_bits(pd, ct->range_bits);
+		if(value < 0) ASN__DECODE_STARVED;
+		ASN_DEBUG("CHOICE %s got index %d in range %d",
+			td->name, value, ct->range_bits);
+		if(value > ct->upper_bound)
+			ASN__DECODE_FAILED;
+	} else {
+		if(specs->ext_start == -1)
+			ASN__DECODE_FAILED;
+		value = uper_get_nsnnwn(pd);
+		if(value < 0) ASN__DECODE_STARVED;
+		value += specs->ext_start;
+		if((unsigned)value >= td->elements_count)
+			ASN__DECODE_FAILED;
+	}
+
+	/* Adjust if canonical order is different from natural order */
+	if(specs->from_canonical_order) {
+        ASN_DEBUG("CHOICE presence from wire %d", value);
+		value = specs->from_canonical_order[value];
+        ASN_DEBUG("CHOICE presence index effective %d", value);
+    }
+
+	/* Set presence to be able to free it later */
+	_set_present_idx(st, specs->pres_offset, specs->pres_size, value + 1);
+
+	elm = &td->elements[value];
+	if(elm->flags & ATF_POINTER) {
+		/* Member is a pointer to another structure */
+		memb_ptr2 = (void **)((char *)st + elm->memb_offset);
+	} else {
+		memb_ptr = (char *)st + elm->memb_offset;
+		memb_ptr2 = &memb_ptr;
+	}
+	ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name);
+
+	if(ct && ct->range_bits >= 0) {
+		rv = elm->type->op->uper_decoder(opt_codec_ctx, elm->type,
+			elm->encoding_constraints.per_constraints, memb_ptr2, pd);
+	} else {
+		rv = uper_open_type_get(opt_codec_ctx, elm->type,
+			elm->encoding_constraints.per_constraints, memb_ptr2, pd);
+	}
+
+	if(rv.code != RC_OK)
+		ASN_DEBUG("Failed to decode %s in %s (CHOICE) %d",
+			elm->name, td->name, rv.code);
+	return rv;
+}
+
+asn_enc_rval_t
+CHOICE_encode_uper(const asn_TYPE_descriptor_t *td,
+                   const asn_per_constraints_t *constraints, const void *sptr,
+                   asn_per_outp_t *po) {
+	const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics;
+	asn_TYPE_member_t *elm;	/* CHOICE's element */
+	const asn_per_constraint_t *ct;
+	const void *memb_ptr;
+	unsigned present;
+	int present_enc;
+
+	if(!sptr) ASN__ENCODE_FAILED;
+
+	ASN_DEBUG("Encoding %s as CHOICE", td->name);
+
+	if(constraints) ct = &constraints->value;
+	else if(td->encoding_constraints.per_constraints)
+		ct = &td->encoding_constraints.per_constraints->value;
+	else ct = 0;
+
+	present = _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size);
+
+	/*
+	 * If the structure was not initialized properly, it cannot be encoded:
+	 * can't deduce what to encode in the choice type.
+	 */
+	if(present == 0 || present > td->elements_count)
+		ASN__ENCODE_FAILED;
+	else
+		present--;
+
+	ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present);
+
+    /* Adjust if canonical order is different from natural order */
+    if(specs->to_canonical_order)
+        present_enc = specs->to_canonical_order[present];
+    else
+        present_enc = present;
+
+    if(ct && ct->range_bits >= 0) {
+		if(present_enc < ct->lower_bound
+		|| present_enc > ct->upper_bound) {
+			if(ct->flags & APC_EXTENSIBLE) {
+                ASN_DEBUG(
+                    "CHOICE member %d (enc %d) is an extension (%ld..%ld)",
+                    present, present_enc, ct->lower_bound, ct->upper_bound);
+                if(per_put_few_bits(po, 1, 1))
+					ASN__ENCODE_FAILED;
+			} else {
+				ASN__ENCODE_FAILED;
+			}
+			ct = 0;
+		}
+	}
+	if(ct && ct->flags & APC_EXTENSIBLE) {
+        ASN_DEBUG("CHOICE member %d (enc %d) is not an extension (%ld..%ld)",
+                  present, present_enc, ct->lower_bound, ct->upper_bound);
+        if(per_put_few_bits(po, 0, 1))
+			ASN__ENCODE_FAILED;
+    }
+
+
+	elm = &td->elements[present];
+    ASN_DEBUG("CHOICE member \"%s\" %d (as %d)", elm->name, present,
+              present_enc);
+    if(elm->flags & ATF_POINTER) {
+		/* Member is a pointer to another structure */
+        memb_ptr =
+            *(const void *const *)((const char *)sptr + elm->memb_offset);
+        if(!memb_ptr) ASN__ENCODE_FAILED;
+	} else {
+        memb_ptr = (const char *)sptr + elm->memb_offset;
+    }
+
+    if(ct && ct->range_bits >= 0) {
+        if(per_put_few_bits(po, present_enc, ct->range_bits))
+            ASN__ENCODE_FAILED;
+
+        return elm->type->op->uper_encoder(
+            elm->type, elm->encoding_constraints.per_constraints, memb_ptr, po);
+    } else {
+        asn_enc_rval_t rval = {0,0,0};
+        if(specs->ext_start == -1) ASN__ENCODE_FAILED;
+        if(uper_put_nsnnwn(po, present_enc - specs->ext_start))
+            ASN__ENCODE_FAILED;
+        if(uper_open_type_put(elm->type,
+                              elm->encoding_constraints.per_constraints,
+                              memb_ptr, po))
+            ASN__ENCODE_FAILED;
+        rval.encoded = 0;
+        ASN__ENCODED_OK(rval);
+    }
+}
+
+asn_dec_rval_t
+CHOICE_decode_aper(const asn_codec_ctx_t *opt_codec_ctx,
+                   const asn_TYPE_descriptor_t *td,
+                   const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) {
+	const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics;
+	asn_dec_rval_t rv;
+	const asn_per_constraint_t *ct;
+	asn_TYPE_member_t *elm;	/* CHOICE's element */
+	void *memb_ptr;
+	void **memb_ptr2;
+	void *st = *sptr;
+	int value;
+
+	if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx))
+		ASN__DECODE_FAILED;
+
+	/*
+	 * Create the target structure if it is not present already.
+	 */
+	if(!st) {
+		st = *sptr = CALLOC(1, specs->struct_size);
+		if(!st) ASN__DECODE_FAILED;
+	}
+
+	if(constraints) ct = &constraints->value;
+	else if(td->encoding_constraints.per_constraints)
+		ct = &td->encoding_constraints.per_constraints->value;
+	else ct = 0;
+
+	if(ct && ct->flags & APC_EXTENSIBLE) {
+		value = per_get_few_bits(pd, 1);
+		if(value < 0) ASN__DECODE_STARVED;
+		if(value) ct = 0;	/* Not restricted */
+	}
+
+	if(ct && ct->range_bits >= 0) {
+		value = per_get_few_bits(pd, ct->range_bits);
+		if(value < 0) ASN__DECODE_STARVED;
+		ASN_DEBUG("CHOICE %s got index %d in range %d",
+		          td->name, value, ct->range_bits);
+		if(value > ct->upper_bound)
+			ASN__DECODE_FAILED;
+	} else {
+		if(specs->ext_start == -1)
+			ASN__DECODE_FAILED;
+		value = uper_get_nsnnwn(pd);
+		if(value < 0) ASN__DECODE_STARVED;
+		value += specs->ext_start;
+		if((unsigned)value >= td->elements_count)
+			ASN__DECODE_FAILED;
+	}
+
+	/* Adjust if canonical order is different from natural order */
+	if(specs->from_canonical_order)
+		value = specs->from_canonical_order[value];
+
+	/* Set presence to be able to free it later */
+	_set_present_idx(st, specs->pres_offset, specs->pres_size, value + 1);
+
+	elm = &td->elements[value];
+	if(elm->flags & ATF_POINTER) {
+		/* Member is a pointer to another structure */
+		memb_ptr2 = (void **)((char *)st + elm->memb_offset);
+	} else {
+		memb_ptr = (char *)st + elm->memb_offset;
+		memb_ptr2 = &memb_ptr;
+	}
+	ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name);
+
+	if(ct && ct->range_bits >= 0) {
+		rv = elm->type->op->aper_decoder(opt_codec_ctx, elm->type,
+		                                 elm->encoding_constraints.per_constraints, memb_ptr2, pd);
+	} else {
+		rv = uper_open_type_get(opt_codec_ctx, elm->type,
+		                        elm->encoding_constraints.per_constraints, memb_ptr2, pd);
+	}
+
+	if(rv.code != RC_OK)
+		ASN_DEBUG("Failed to decode %s in %s (CHOICE) %d",
+		          elm->name, td->name, rv.code);
+	return rv;
+}
+
+asn_enc_rval_t
+CHOICE_encode_aper(const asn_TYPE_descriptor_t *td,
+                   const asn_per_constraints_t *constraints,
+                   const void *sptr, asn_per_outp_t *po) {
+	const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics;
+	const asn_TYPE_member_t *elm; /* CHOICE's element */
+	const asn_per_constraint_t *ct;
+	const void *memb_ptr;
+	int present;
+
+	if(!sptr) ASN__ENCODE_FAILED;
+
+	ASN_DEBUG("Encoding %s as CHOICE using ALIGNED PER", td->name);
+
+	if(constraints) ct = &constraints->value;
+	else if(td->encoding_constraints.per_constraints)
+		ct = &td->encoding_constraints.per_constraints->value;
+	else ct = 0;
+
+	present = _fetch_present_idx(sptr,
+	                             specs->pres_offset, specs->pres_size);
+
+	/*
+	 * If the structure was not initialized properly, it cannot be encoded:
+	 * can't deduce what to encode in the choice type.
+	 */
+	if(present <= 0 || (unsigned)present > td->elements_count)
+		ASN__ENCODE_FAILED;
+	else
+		present--;
+
+	/* Adjust if canonical order is different from natural order */
+	if(specs->to_canonical_order)
+		present = specs->to_canonical_order[present];
+
+	ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present);
+
+	if(ct && ct->range_bits >= 0) {
+		if(present < ct->lower_bound
+		        || present > ct->upper_bound) {
+			if(ct->flags & APC_EXTENSIBLE) {
+				if(per_put_few_bits(po, 1, 1))
+					ASN__ENCODE_FAILED;
+			} else {
+				ASN__ENCODE_FAILED;
+			}
+			ct = 0;
+		}
+	}
+	if(ct && ct->flags & APC_EXTENSIBLE) {
+		if(per_put_few_bits(po, 0, 1))
+			ASN__ENCODE_FAILED;
+	}
+
+	elm = &td->elements[present];
+	if(elm->flags & ATF_POINTER) {
+		/* Member is a pointer to another structure */
+		memb_ptr = *(const void *const *)((const char *)sptr + elm->memb_offset);
+		if(!memb_ptr) ASN__ENCODE_FAILED;
+	} else {
+		memb_ptr = (const char *)sptr + elm->memb_offset;
+	}
+
+	if(ct && ct->range_bits >= 0) {
+		if(per_put_few_bits(po, present, ct->range_bits))
+			ASN__ENCODE_FAILED;
+
+		return elm->type->op->aper_encoder(elm->type, elm->encoding_constraints.per_constraints,
+		                                   memb_ptr, po);
+	} else {
+		asn_enc_rval_t rval = {0,0,0};
+		if(specs->ext_start == -1)
+			ASN__ENCODE_FAILED;
+		if (ct) {
+		  if(aper_put_nsnnwn(po, ct->range_bits, present - specs->ext_start))
+			ASN__ENCODE_FAILED;
+		}
+		if(aper_open_type_put(elm->type, elm->encoding_constraints.per_constraints,
+		                      memb_ptr, po))
+			ASN__ENCODE_FAILED;
+		rval.encoded = 0;
+		ASN__ENCODED_OK(rval);
+	}
+}
+
+int
+CHOICE_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
+             asn_app_consume_bytes_f *cb, void *app_key) {
+    const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics;
+	unsigned present;
+
+	if(!sptr) return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
+
+	/*
+	 * Figure out which CHOICE element is encoded.
+	 */
+	present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size);
+
+	/*
+	 * Print that element.
+	 */
+	if(present > 0 && present <= td->elements_count) {
+		asn_TYPE_member_t *elm = &td->elements[present-1];
+		const void *memb_ptr;
+
+		if(elm->flags & ATF_POINTER) {
+			memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
+			if(!memb_ptr) return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
+		} else {
+			memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
+		}
+
+		/* Print member's name and stuff */
+		if(0) {
+			if(cb(elm->name, strlen(elm->name), app_key) < 0
+			|| cb(": ", 2, app_key) < 0)
+				return -1;
+		}
+
+		return elm->type->op->print_struct(elm->type, memb_ptr, ilevel,
+			cb, app_key);
+	} else {
+		return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
+	}
+}
+
+void
+CHOICE_free(const asn_TYPE_descriptor_t *td, void *ptr,
+            enum asn_struct_free_method method) {
+    const asn_CHOICE_specifics_t *specs =
+        (const asn_CHOICE_specifics_t *)td->specifics;
+    unsigned present;
+
+	if(!td || !ptr)
+		return;
+
+	ASN_DEBUG("Freeing %s as CHOICE", td->name);
+
+	/*
+	 * Figure out which CHOICE element is encoded.
+	 */
+	present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size);
+
+	/*
+	 * Free that element.
+	 */
+	if(present > 0 && present <= td->elements_count) {
+		asn_TYPE_member_t *elm = &td->elements[present-1];
+		void *memb_ptr;
+
+		if(elm->flags & ATF_POINTER) {
+			memb_ptr = *(void **)((char *)ptr + elm->memb_offset);
+			if(memb_ptr)
+				ASN_STRUCT_FREE(*elm->type, memb_ptr);
+		} else {
+			memb_ptr = (void *)((char *)ptr + elm->memb_offset);
+			ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr);
+		}
+	}
+
+    switch(method) {
+    case ASFM_FREE_EVERYTHING:
+        FREEMEM(ptr);
+        break;
+    case ASFM_FREE_UNDERLYING:
+        break;
+    case ASFM_FREE_UNDERLYING_AND_RESET:
+        memset(ptr, 0, specs->struct_size);
+        break;
+    }
+}
+
+
+/*
+ * The following functions functions offer protection against -fshort-enums,
+ * compatible with little- and big-endian machines.
+ * If assertion is triggered, either disable -fshort-enums, or add an entry
+ * here with the ->pres_size of your target stracture.
+ * Unless the target structure is packed, the ".present" member
+ * is guaranteed to be aligned properly. ASN.1 compiler itself does not
+ * produce packed code.
+ */
+static unsigned
+_fetch_present_idx(const void *struct_ptr, unsigned pres_offset,
+                   unsigned pres_size) {
+    const void *present_ptr;
+	unsigned present;
+
+	present_ptr = ((const char *)struct_ptr) + pres_offset;
+
+	switch(pres_size) {
+	case sizeof(int):	present = *(const unsigned int *)present_ptr; break;
+	case sizeof(short):	present = *(const unsigned short *)present_ptr; break;
+	case sizeof(char):	present = *(const unsigned char *)present_ptr; break;
+	default:
+		/* ANSI C mandates enum to be equivalent to integer */
+		assert(pres_size != sizeof(int));
+		return 0;	/* If not aborted, pass back safe value */
+	}
+
+	return present;
+}
+
+static void
+_set_present_idx(void *struct_ptr, unsigned pres_offset, unsigned pres_size,
+                 unsigned present) {
+    void *present_ptr;
+	present_ptr = ((char *)struct_ptr) + pres_offset;
+
+	switch(pres_size) {
+	case sizeof(int):	*(unsigned int *)present_ptr   = present; break;
+	case sizeof(short):	*(unsigned short *)present_ptr = present; break;
+	case sizeof(char):	*(unsigned char *)present_ptr  = present; break;
+	default:
+		/* ANSI C mandates enum to be equivalent to integer */
+		assert(pres_size != sizeof(int));
+	}
+}
+
+static const void *
+_get_member_ptr(const asn_TYPE_descriptor_t *td, const void *sptr,
+                asn_TYPE_member_t **elm_ptr, unsigned *present_out) {
+    const asn_CHOICE_specifics_t *specs =
+        (const asn_CHOICE_specifics_t *)td->specifics;
+    unsigned present;
+
+    if(!sptr) {
+        *elm_ptr = NULL;
+        *present_out = 0;
+        return NULL;
+    }
+
+    /*
+	 * Figure out which CHOICE element is encoded.
+	 */
+	present = _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size);
+    *present_out = present;
+
+    /*
+     * The presence index is intentionally 1-based to avoid
+     * treating zeroed structure as a valid one.
+     */
+	if(present > 0 && present <= td->elements_count) {
+        asn_TYPE_member_t *const elm = &td->elements[present - 1];
+        const void *memb_ptr;
+
+		if(elm->flags & ATF_POINTER) {
+            memb_ptr =
+                *(const void *const *)((const char *)sptr + elm->memb_offset);
+        } else {
+            memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
+        }
+        *elm_ptr = elm;
+        return memb_ptr;
+    } else {
+        *elm_ptr = NULL;
+        return NULL;
+    }
+
+}
+
+int
+CHOICE_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const void *bptr) {
+    asn_TYPE_member_t *aelm;
+    asn_TYPE_member_t *belm;
+    unsigned apresent = 0;
+    unsigned bpresent = 0;
+    const void *amember = _get_member_ptr(td, aptr, &aelm, &apresent);
+    const void *bmember = _get_member_ptr(td, bptr, &belm, &bpresent);
+
+    if(amember && bmember) {
+        if(apresent == bpresent) {
+            assert(aelm == belm);
+            return aelm->type->op->compare_struct(aelm->type, amember, bmember);
+        } else if(apresent < bpresent) {
+            return -1;
+        } else {
+            return 1;
+        }
+    } else if(!amember) {
+        return -1;
+    } else {
+        return 1;
+    }
+}
+
+/*
+ * Return the 1-based choice variant presence index.
+ * Returns 0 in case of error.
+ */
+unsigned
+CHOICE_variant_get_presence(const asn_TYPE_descriptor_t *td, const void *sptr) {
+    const asn_CHOICE_specifics_t *specs =
+        (const asn_CHOICE_specifics_t *)td->specifics;
+    return _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size);
+}
+
+/*
+ * Sets or resets the 1-based choice variant presence index.
+ * In case a previous index is not zero, the currently selected structure
+ * member is freed and zeroed-out first.
+ * Returns 0 on success and -1 on error.
+ */
+int
+CHOICE_variant_set_presence(const asn_TYPE_descriptor_t *td, void *sptr,
+                            unsigned present) {
+    const asn_CHOICE_specifics_t *specs =
+        (const asn_CHOICE_specifics_t *)td->specifics;
+    unsigned old_present;
+
+    if(!sptr) {
+        return -1;
+    }
+
+    if(present > td->elements_count)
+        return -1;
+
+    old_present =
+        _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size);
+    if(present == old_present)
+        return 0;
+
+    if(old_present != 0) {
+        assert(old_present <= td->elements_count);
+        ASN_STRUCT_RESET(*td, sptr);
+    }
+
+    _set_present_idx(sptr, specs->pres_offset, specs->pres_size, present);
+
+    return 0;
+}
+
+
+asn_random_fill_result_t
+CHOICE_random_fill(const asn_TYPE_descriptor_t *td, void **sptr,
+                   const asn_encoding_constraints_t *constr,
+                   size_t max_length) {
+    const asn_CHOICE_specifics_t *specs =
+        (const asn_CHOICE_specifics_t *)td->specifics;
+    asn_random_fill_result_t res;
+    asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0};
+    asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0};
+    const asn_TYPE_member_t *elm;
+    unsigned present;
+    void *memb_ptr;   /* Pointer to the member */
+    void **memb_ptr2; /* Pointer to that pointer */
+    void *st = *sptr;
+
+    if(max_length == 0) return result_skipped;
+
+    (void)constr;
+
+    if(st == NULL) {
+        st = CALLOC(1, specs->struct_size);
+        if(st == NULL) {
+            return result_failed;
+        }
+    }
+
+    present = asn_random_between(1, td->elements_count);
+    elm = &td->elements[present - 1];
+
+	if(elm->flags & ATF_POINTER) {
+		/* Member is a pointer to another structure */
+		memb_ptr2 = (void **)((char *)st + elm->memb_offset);
+	} else {
+		memb_ptr = (char *)st + elm->memb_offset;
+		memb_ptr2 = &memb_ptr;
+	}
+
+    res = elm->type->op->random_fill(elm->type, memb_ptr2,
+                                    &elm->encoding_constraints, max_length);
+    _set_present_idx(st, specs->pres_offset, specs->pres_size, present);
+    if(res.code == ARFILL_OK) {
+        *sptr = st;
+    } else {
+        if(st == *sptr) {
+            ASN_STRUCT_RESET(*td, st);
+        } else {
+            ASN_STRUCT_FREE(*td, st);
+        }
+    }
+
+    return res;
+}
+
+
+asn_TYPE_operation_t asn_OP_CHOICE = {
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_compare,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+#ifdef	ASN_DISABLE_OER_SUPPORT
+	0,
+	0,
+#else
+	CHOICE_decode_oer,
+	CHOICE_encode_oer,
+#endif  /* ASN_DISABLE_OER_SUPPORT */
+#ifdef ASN_DISABLE_PER_SUPPORT
+	0,
+	0,
+	0,
+	0,
+#else
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+#endif	/* ASN_DISABLE_PER_SUPPORT */
+	CHOICE_random_fill,
+	CHOICE_outmost_tag
+};
diff --git a/3rdparty/libe2ap/constr_CHOICE.h b/3rdparty/E2AP-v01.00.00/constr_CHOICE.h
similarity index 100%
rename from 3rdparty/libe2ap/constr_CHOICE.h
rename to 3rdparty/E2AP-v01.00.00/constr_CHOICE.h
diff --git a/3rdparty/libe2ap/constr_SEQUENCE.c b/3rdparty/E2AP-v01.00.00/constr_SEQUENCE.c
similarity index 100%
rename from 3rdparty/libe2ap/constr_SEQUENCE.c
rename to 3rdparty/E2AP-v01.00.00/constr_SEQUENCE.c
diff --git a/3rdparty/libe2ap/constr_SEQUENCE.h b/3rdparty/E2AP-v01.00.00/constr_SEQUENCE.h
similarity index 100%
rename from 3rdparty/libe2ap/constr_SEQUENCE.h
rename to 3rdparty/E2AP-v01.00.00/constr_SEQUENCE.h
diff --git a/3rdparty/libe2ap/constr_SEQUENCE_OF.c b/3rdparty/E2AP-v01.00.00/constr_SEQUENCE_OF.c
similarity index 100%
rename from 3rdparty/libe2ap/constr_SEQUENCE_OF.c
rename to 3rdparty/E2AP-v01.00.00/constr_SEQUENCE_OF.c
diff --git a/3rdparty/libe2ap/constr_SEQUENCE_OF.h b/3rdparty/E2AP-v01.00.00/constr_SEQUENCE_OF.h
similarity index 100%
rename from 3rdparty/libe2ap/constr_SEQUENCE_OF.h
rename to 3rdparty/E2AP-v01.00.00/constr_SEQUENCE_OF.h
diff --git a/3rdparty/libe2ap/constr_SET_OF.c b/3rdparty/E2AP-v01.00.00/constr_SET_OF.c
similarity index 100%
rename from 3rdparty/libe2ap/constr_SET_OF.c
rename to 3rdparty/E2AP-v01.00.00/constr_SET_OF.c
diff --git a/3rdparty/libe2ap/constr_SET_OF.h b/3rdparty/E2AP-v01.00.00/constr_SET_OF.h
similarity index 100%
rename from 3rdparty/libe2ap/constr_SET_OF.h
rename to 3rdparty/E2AP-v01.00.00/constr_SET_OF.h
diff --git a/3rdparty/libe2ap/constr_TYPE.c b/3rdparty/E2AP-v01.00.00/constr_TYPE.c
similarity index 100%
rename from 3rdparty/libe2ap/constr_TYPE.c
rename to 3rdparty/E2AP-v01.00.00/constr_TYPE.c
diff --git a/3rdparty/libe2ap/constr_TYPE.h b/3rdparty/E2AP-v01.00.00/constr_TYPE.h
similarity index 100%
rename from 3rdparty/libe2ap/constr_TYPE.h
rename to 3rdparty/E2AP-v01.00.00/constr_TYPE.h
diff --git a/3rdparty/libe2ap/constraints.c b/3rdparty/E2AP-v01.00.00/constraints.c
similarity index 100%
rename from 3rdparty/libe2ap/constraints.c
rename to 3rdparty/E2AP-v01.00.00/constraints.c
diff --git a/3rdparty/libe2ap/constraints.h b/3rdparty/E2AP-v01.00.00/constraints.h
similarity index 100%
rename from 3rdparty/libe2ap/constraints.h
rename to 3rdparty/E2AP-v01.00.00/constraints.h
diff --git a/3rdparty/libe2ap/der_encoder.c b/3rdparty/E2AP-v01.00.00/der_encoder.c
similarity index 100%
rename from 3rdparty/libe2ap/der_encoder.c
rename to 3rdparty/E2AP-v01.00.00/der_encoder.c
diff --git a/3rdparty/libe2ap/der_encoder.h b/3rdparty/E2AP-v01.00.00/der_encoder.h
similarity index 100%
rename from 3rdparty/libe2ap/der_encoder.h
rename to 3rdparty/E2AP-v01.00.00/der_encoder.h
diff --git a/3rdparty/libe2ap/per_decoder.c b/3rdparty/E2AP-v01.00.00/per_decoder.c
similarity index 100%
rename from 3rdparty/libe2ap/per_decoder.c
rename to 3rdparty/E2AP-v01.00.00/per_decoder.c
diff --git a/3rdparty/libe2ap/per_decoder.h b/3rdparty/E2AP-v01.00.00/per_decoder.h
similarity index 100%
rename from 3rdparty/libe2ap/per_decoder.h
rename to 3rdparty/E2AP-v01.00.00/per_decoder.h
diff --git a/3rdparty/libe2ap/per_encoder.c b/3rdparty/E2AP-v01.00.00/per_encoder.c
similarity index 100%
rename from 3rdparty/libe2ap/per_encoder.c
rename to 3rdparty/E2AP-v01.00.00/per_encoder.c
diff --git a/3rdparty/libe2ap/per_encoder.h b/3rdparty/E2AP-v01.00.00/per_encoder.h
similarity index 100%
rename from 3rdparty/libe2ap/per_encoder.h
rename to 3rdparty/E2AP-v01.00.00/per_encoder.h
diff --git a/3rdparty/libe2ap/per_opentype.c b/3rdparty/E2AP-v01.00.00/per_opentype.c
similarity index 100%
rename from 3rdparty/libe2ap/per_opentype.c
rename to 3rdparty/E2AP-v01.00.00/per_opentype.c
diff --git a/3rdparty/libe2ap/per_opentype.h b/3rdparty/E2AP-v01.00.00/per_opentype.h
similarity index 100%
rename from 3rdparty/libe2ap/per_opentype.h
rename to 3rdparty/E2AP-v01.00.00/per_opentype.h
diff --git a/3rdparty/libe2ap/per_support.c b/3rdparty/E2AP-v01.00.00/per_support.c
similarity index 100%
rename from 3rdparty/libe2ap/per_support.c
rename to 3rdparty/E2AP-v01.00.00/per_support.c
diff --git a/3rdparty/libe2ap/per_support.h b/3rdparty/E2AP-v01.00.00/per_support.h
similarity index 100%
rename from 3rdparty/libe2ap/per_support.h
rename to 3rdparty/E2AP-v01.00.00/per_support.h
diff --git a/3rdparty/libe2ap/xer_decoder.c b/3rdparty/E2AP-v01.00.00/xer_decoder.c
similarity index 100%
rename from 3rdparty/libe2ap/xer_decoder.c
rename to 3rdparty/E2AP-v01.00.00/xer_decoder.c
diff --git a/3rdparty/libe2ap/xer_decoder.h b/3rdparty/E2AP-v01.00.00/xer_decoder.h
similarity index 100%
rename from 3rdparty/libe2ap/xer_decoder.h
rename to 3rdparty/E2AP-v01.00.00/xer_decoder.h
diff --git a/3rdparty/libe2ap/xer_encoder.c b/3rdparty/E2AP-v01.00.00/xer_encoder.c
similarity index 100%
rename from 3rdparty/libe2ap/xer_encoder.c
rename to 3rdparty/E2AP-v01.00.00/xer_encoder.c
diff --git a/3rdparty/libe2ap/xer_encoder.h b/3rdparty/E2AP-v01.00.00/xer_encoder.h
similarity index 100%
rename from 3rdparty/libe2ap/xer_encoder.h
rename to 3rdparty/E2AP-v01.00.00/xer_encoder.h
diff --git a/3rdparty/libe2ap/xer_support.c b/3rdparty/E2AP-v01.00.00/xer_support.c
similarity index 100%
rename from 3rdparty/libe2ap/xer_support.c
rename to 3rdparty/E2AP-v01.00.00/xer_support.c
diff --git a/3rdparty/libe2ap/xer_support.h b/3rdparty/E2AP-v01.00.00/xer_support.h
similarity index 100%
rename from 3rdparty/libe2ap/xer_support.h
rename to 3rdparty/E2AP-v01.00.00/xer_support.h
diff --git a/3rdparty/libe2ap/BIT_STRING.c b/3rdparty/E2SM-gNB-X2-V3.0.8/BIT_STRING.c
similarity index 100%
copy from 3rdparty/libe2ap/BIT_STRING.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/BIT_STRING.c
diff --git a/3rdparty/libe2ap/BIT_STRING.h b/3rdparty/E2SM-gNB-X2-V3.0.8/BIT_STRING.h
similarity index 100%
copy from 3rdparty/libe2ap/BIT_STRING.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/BIT_STRING.h
diff --git a/3rdparty/libe2ap/BOOLEAN.c b/3rdparty/E2SM-gNB-X2-V3.0.8/BOOLEAN.c
similarity index 100%
rename from 3rdparty/libe2ap/BOOLEAN.c
rename to 3rdparty/E2SM-gNB-X2-V3.0.8/BOOLEAN.c
diff --git a/3rdparty/libe2ap/BOOLEAN.h b/3rdparty/E2SM-gNB-X2-V3.0.8/BOOLEAN.h
similarity index 100%
rename from 3rdparty/libe2ap/BOOLEAN.h
rename to 3rdparty/E2SM-gNB-X2-V3.0.8/BOOLEAN.h
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-ID.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-ID.c
new file mode 100644
index 0000000..ab335da
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-ID.c
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_ActionParameter-ID.h"
+
+int
+E2_ActionParameter_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 255)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_E2_ActionParameter_ID_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0,  255 }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_E2_ActionParameter_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_ActionParameter_ID = {
+	"ActionParameter-ID",
+	"ActionParameter-ID",
+	&asn_OP_NativeInteger,
+	asn_DEF_E2_ActionParameter_ID_tags_1,
+	sizeof(asn_DEF_E2_ActionParameter_ID_tags_1)
+		/sizeof(asn_DEF_E2_ActionParameter_ID_tags_1[0]), /* 1 */
+	asn_DEF_E2_ActionParameter_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_ActionParameter_ID_tags_1)
+		/sizeof(asn_DEF_E2_ActionParameter_ID_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_E2_ActionParameter_ID_constr_1, E2_ActionParameter_ID_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-ID.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-ID.h
new file mode 100644
index 0000000..fc9fba2
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-ID.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_ActionParameter_ID_H_
+#define	_E2_ActionParameter_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_ActionParameter-ID */
+typedef long	 E2_ActionParameter_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E2_ActionParameter_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E2_ActionParameter_ID;
+asn_struct_free_f E2_ActionParameter_ID_free;
+asn_struct_print_f E2_ActionParameter_ID_print;
+asn_constr_check_f E2_ActionParameter_ID_constraint;
+ber_type_decoder_f E2_ActionParameter_ID_decode_ber;
+der_type_encoder_f E2_ActionParameter_ID_encode_der;
+xer_type_decoder_f E2_ActionParameter_ID_decode_xer;
+xer_type_encoder_f E2_ActionParameter_ID_encode_xer;
+per_type_decoder_f E2_ActionParameter_ID_decode_uper;
+per_type_encoder_f E2_ActionParameter_ID_encode_uper;
+per_type_decoder_f E2_ActionParameter_ID_decode_aper;
+per_type_encoder_f E2_ActionParameter_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_ActionParameter_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-Item.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-Item.c
new file mode 100644
index 0000000..b091c67
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-Item.c
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_ActionParameter-Item.h"
+
+asn_TYPE_member_t asn_MBR_E2_ActionParameter_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_ActionParameter_Item, actionParameter_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_ActionParameter_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"actionParameter-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_ActionParameter_Item, actionParameter_Value),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_E2_ActionParameter_Value,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"actionParameter-Value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_ActionParameter_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_ActionParameter_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* actionParameter-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* actionParameter-Value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_ActionParameter_Item_specs_1 = {
+	sizeof(struct E2_ActionParameter_Item),
+	offsetof(struct E2_ActionParameter_Item, _asn_ctx),
+	asn_MAP_E2_ActionParameter_Item_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_ActionParameter_Item = {
+	"ActionParameter-Item",
+	"ActionParameter-Item",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_ActionParameter_Item_tags_1,
+	sizeof(asn_DEF_E2_ActionParameter_Item_tags_1)
+		/sizeof(asn_DEF_E2_ActionParameter_Item_tags_1[0]), /* 1 */
+	asn_DEF_E2_ActionParameter_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_ActionParameter_Item_tags_1)
+		/sizeof(asn_DEF_E2_ActionParameter_Item_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_ActionParameter_Item_1,
+	2,	/* Elements count */
+	&asn_SPC_E2_ActionParameter_Item_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-Item.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-Item.h
new file mode 100644
index 0000000..ffa44d8
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-Item.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_ActionParameter_Item_H_
+#define	_E2_ActionParameter_Item_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_ActionParameter-ID.h"
+#include "E2_ActionParameter-Value.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_ActionParameter-Item */
+typedef struct E2_ActionParameter_Item {
+	E2_ActionParameter_ID_t	 actionParameter_ID;
+	E2_ActionParameter_Value_t	 actionParameter_Value;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_ActionParameter_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_ActionParameter_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_ActionParameter_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_ActionParameter_Item_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_ActionParameter_Item_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-Value.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-Value.c
new file mode 100644
index 0000000..068e748
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-Value.c
@@ -0,0 +1,102 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_ActionParameter-Value.h"
+
+asn_per_constraints_t asn_PER_type_E2_ActionParameter_Value_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  5 }	/* (0..5,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+asn_TYPE_member_t asn_MBR_E2_ActionParameter_Value_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_ActionParameter_Value, choice.valueInt),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valueInt"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_ActionParameter_Value, choice.valueEnum),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valueEnum"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_ActionParameter_Value, choice.valueBool),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BOOLEAN,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valueBool"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_ActionParameter_Value, choice.valueBitS),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valueBitS"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_ActionParameter_Value, choice.valueOctS),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_OCTET_STRING,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valueOctS"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_ActionParameter_Value, choice.valuePrtS),
+		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_PrintableString,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valuePrtS"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_ActionParameter_Value_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* valueInt */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* valueEnum */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* valueBool */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* valueBitS */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* valueOctS */
+    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* valuePrtS */
+};
+asn_CHOICE_specifics_t asn_SPC_E2_ActionParameter_Value_specs_1 = {
+	sizeof(struct E2_ActionParameter_Value),
+	offsetof(struct E2_ActionParameter_Value, _asn_ctx),
+	offsetof(struct E2_ActionParameter_Value, present),
+	sizeof(((struct E2_ActionParameter_Value *)0)->present),
+	asn_MAP_E2_ActionParameter_Value_tag2el_1,
+	6,	/* Count of tags in the map */
+	0, 0,
+	6	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_ActionParameter_Value = {
+	"ActionParameter-Value",
+	"ActionParameter-Value",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_E2_ActionParameter_Value_constr_1, CHOICE_constraint },
+	asn_MBR_E2_ActionParameter_Value_1,
+	6,	/* Elements count */
+	&asn_SPC_E2_ActionParameter_Value_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-Value.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-Value.h
new file mode 100644
index 0000000..80a9384
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ActionParameter-Value.h
@@ -0,0 +1,70 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_ActionParameter_Value_H_
+#define	_E2_ActionParameter_Value_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+#include "BOOLEAN.h"
+#include "BIT_STRING.h"
+#include "OCTET_STRING.h"
+#include "PrintableString.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_ActionParameter_Value_PR {
+	E2_ActionParameter_Value_PR_NOTHING,	/* No components present */
+	E2_ActionParameter_Value_PR_valueInt,
+	E2_ActionParameter_Value_PR_valueEnum,
+	E2_ActionParameter_Value_PR_valueBool,
+	E2_ActionParameter_Value_PR_valueBitS,
+	E2_ActionParameter_Value_PR_valueOctS,
+	E2_ActionParameter_Value_PR_valuePrtS
+	/* Extensions may appear below */
+	
+} E2_ActionParameter_Value_PR;
+
+/* E2_ActionParameter-Value */
+typedef struct E2_ActionParameter_Value {
+	E2_ActionParameter_Value_PR present;
+	union E2_ActionParameter_Value_u {
+		long	 valueInt;
+		long	 valueEnum;
+		BOOLEAN_t	 valueBool;
+		BIT_STRING_t	 valueBitS;
+		OCTET_STRING_t	 valueOctS;
+		PrintableString_t	 valuePrtS;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_ActionParameter_Value_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_ActionParameter_Value;
+extern asn_CHOICE_specifics_t asn_SPC_E2_ActionParameter_Value_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_ActionParameter_Value_1[6];
+extern asn_per_constraints_t asn_PER_type_E2_ActionParameter_Value_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_ActionParameter_Value_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_CallProcess-ID.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_CallProcess-ID.c
new file mode 100644
index 0000000..c55745d
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_CallProcess-ID.c
@@ -0,0 +1,31 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_CallProcess-ID.h"
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static const ber_tlv_tag_t asn_DEF_E2_CallProcess_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_CallProcess_ID = {
+	"CallProcess-ID",
+	"CallProcess-ID",
+	&asn_OP_NativeInteger,
+	asn_DEF_E2_CallProcess_ID_tags_1,
+	sizeof(asn_DEF_E2_CallProcess_ID_tags_1)
+		/sizeof(asn_DEF_E2_CallProcess_ID_tags_1[0]), /* 1 */
+	asn_DEF_E2_CallProcess_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_CallProcess_ID_tags_1)
+		/sizeof(asn_DEF_E2_CallProcess_ID_tags_1[0]), /* 1 */
+	{ 0, 0, NativeInteger_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_CallProcess-ID.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_CallProcess-ID.h
new file mode 100644
index 0000000..1e74aeb
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_CallProcess-ID.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_CallProcess_ID_H_
+#define	_E2_CallProcess_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_CallProcess-ID */
+typedef long	 E2_CallProcess_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_CallProcess_ID;
+asn_struct_free_f E2_CallProcess_ID_free;
+asn_struct_print_f E2_CallProcess_ID_print;
+asn_constr_check_f E2_CallProcess_ID_constraint;
+ber_type_decoder_f E2_CallProcess_ID_decode_ber;
+der_type_encoder_f E2_CallProcess_ID_encode_der;
+xer_type_decoder_f E2_CallProcess_ID_decode_xer;
+xer_type_encoder_f E2_CallProcess_ID_encode_xer;
+per_type_decoder_f E2_CallProcess_ID_decode_uper;
+per_type_encoder_f E2_CallProcess_ID_encode_uper;
+per_type_decoder_f E2_CallProcess_ID_decode_aper;
+per_type_encoder_f E2_CallProcess_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_CallProcess_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Criticality.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Criticality.c
new file mode 100644
index 0000000..19a8ee2
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Criticality.c
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_Criticality.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static asn_per_constraints_t asn_PER_type_E2_Criticality_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_E2_Criticality_value2enum_1[] = {
+	{ 0,	6,	"reject" },
+	{ 1,	6,	"ignore" },
+	{ 2,	6,	"notify" }
+};
+static const unsigned int asn_MAP_E2_Criticality_enum2value_1[] = {
+	1,	/* ignore(1) */
+	2,	/* notify(2) */
+	0	/* reject(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_E2_Criticality_specs_1 = {
+	asn_MAP_E2_Criticality_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_E2_Criticality_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_E2_Criticality_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_Criticality = {
+	"Criticality",
+	"Criticality",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_E2_Criticality_tags_1,
+	sizeof(asn_DEF_E2_Criticality_tags_1)
+		/sizeof(asn_DEF_E2_Criticality_tags_1[0]), /* 1 */
+	asn_DEF_E2_Criticality_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_Criticality_tags_1)
+		/sizeof(asn_DEF_E2_Criticality_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_E2_Criticality_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_E2_Criticality_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Criticality.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Criticality.h
new file mode 100644
index 0000000..077e78f
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Criticality.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_Criticality_H_
+#define	_E2_Criticality_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_Criticality {
+	E2_Criticality_reject	= 0,
+	E2_Criticality_ignore	= 1,
+	E2_Criticality_notify	= 2
+} e_E2_Criticality;
+
+/* E2_Criticality */
+typedef long	 E2_Criticality_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_Criticality;
+asn_struct_free_f E2_Criticality_free;
+asn_struct_print_f E2_Criticality_print;
+asn_constr_check_f E2_Criticality_constraint;
+ber_type_decoder_f E2_Criticality_decode_ber;
+der_type_encoder_f E2_Criticality_encode_der;
+xer_type_decoder_f E2_Criticality_decode_xer;
+xer_type_encoder_f E2_Criticality_encode_xer;
+per_type_decoder_f E2_Criticality_decode_uper;
+per_type_encoder_f E2_Criticality_encode_uper;
+per_type_decoder_f E2_Criticality_decode_aper;
+per_type_encoder_f E2_Criticality_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_Criticality_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ActionDefinition-Format2.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ActionDefinition-Format2.c
new file mode 100644
index 0000000..56299c1
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ActionDefinition-Format2.c
@@ -0,0 +1,126 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_E2SM-gNB-X2-ActionDefinition-Format2.h"
+
+#include "E2_RANueGroup-Item.h"
+static int
+memb_E2_ranUEgroup_List_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size >= 1 && size <= 15)) {
+		/* Perform validation of the inner elements */
+		return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_E2_ranUEgroup_List_constr_2 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1,  15 }	/* (SIZE(1..15)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_E2_ranUEgroup_List_constr_2 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1,  15 }	/* (SIZE(1..15)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_E2_ranUEgroup_List_2[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_E2_RANueGroup_Item,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_ranUEgroup_List_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_E2_ranUEgroup_List_specs_2 = {
+	sizeof(struct E2_E2SM_gNB_X2_ActionDefinition_Format2__ranUEgroup_List),
+	offsetof(struct E2_E2SM_gNB_X2_ActionDefinition_Format2__ranUEgroup_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_E2_ranUEgroup_List_2 = {
+	"ranUEgroup-List",
+	"ranUEgroup-List",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_E2_ranUEgroup_List_tags_2,
+	sizeof(asn_DEF_E2_ranUEgroup_List_tags_2)
+		/sizeof(asn_DEF_E2_ranUEgroup_List_tags_2[0]) - 1, /* 1 */
+	asn_DEF_E2_ranUEgroup_List_tags_2,	/* Same as above */
+	sizeof(asn_DEF_E2_ranUEgroup_List_tags_2)
+		/sizeof(asn_DEF_E2_ranUEgroup_List_tags_2[0]), /* 2 */
+	{ 0, &asn_PER_type_E2_ranUEgroup_List_constr_2, SEQUENCE_OF_constraint },
+	asn_MBR_E2_ranUEgroup_List_2,
+	1,	/* Single element */
+	&asn_SPC_E2_ranUEgroup_List_specs_2	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_ActionDefinition_Format2_1[] = {
+	{ ATF_POINTER, 1, offsetof(struct E2_E2SM_gNB_X2_ActionDefinition_Format2, ranUEgroup_List),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_E2_ranUEgroup_List_2,
+		0,
+		{ 0, &asn_PER_memb_E2_ranUEgroup_List_constr_2,  memb_E2_ranUEgroup_List_constraint_1 },
+		0, 0, /* No default value */
+		"ranUEgroup-List"
+		},
+};
+static const int asn_MAP_E2_E2SM_gNB_X2_ActionDefinition_Format2_oms_1[] = { 0 };
+static const ber_tlv_tag_t asn_DEF_E2_E2SM_gNB_X2_ActionDefinition_Format2_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_E2SM_gNB_X2_ActionDefinition_Format2_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* ranUEgroup-List */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_ActionDefinition_Format2_specs_1 = {
+	sizeof(struct E2_E2SM_gNB_X2_ActionDefinition_Format2),
+	offsetof(struct E2_E2SM_gNB_X2_ActionDefinition_Format2, _asn_ctx),
+	asn_MAP_E2_E2SM_gNB_X2_ActionDefinition_Format2_tag2el_1,
+	1,	/* Count of tags in the map */
+	asn_MAP_E2_E2SM_gNB_X2_ActionDefinition_Format2_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_ActionDefinition_Format2 = {
+	"E2SM-gNB-X2-ActionDefinition-Format2",
+	"E2SM-gNB-X2-ActionDefinition-Format2",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_E2SM_gNB_X2_ActionDefinition_Format2_tags_1,
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_ActionDefinition_Format2_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_ActionDefinition_Format2_tags_1[0]), /* 1 */
+	asn_DEF_E2_E2SM_gNB_X2_ActionDefinition_Format2_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_ActionDefinition_Format2_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_ActionDefinition_Format2_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_E2SM_gNB_X2_ActionDefinition_Format2_1,
+	1,	/* Elements count */
+	&asn_SPC_E2_E2SM_gNB_X2_ActionDefinition_Format2_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ActionDefinition-Format2.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ActionDefinition-Format2.h
new file mode 100644
index 0000000..83df94f
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ActionDefinition-Format2.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_E2SM_gNB_X2_ActionDefinition_Format2_H_
+#define	_E2_E2SM_gNB_X2_ActionDefinition_Format2_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "asn_SEQUENCE_OF.h"
+#include "constr_SEQUENCE_OF.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct E2_RANueGroup_Item;
+
+/* E2_E2SM-gNB-X2-ActionDefinition-Format2 */
+typedef struct E2_E2SM_gNB_X2_ActionDefinition_Format2 {
+	struct E2_E2SM_gNB_X2_ActionDefinition_Format2__ranUEgroup_List {
+		A_SEQUENCE_OF(struct E2_RANueGroup_Item) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} *ranUEgroup_List;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_E2SM_gNB_X2_ActionDefinition_Format2_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_ActionDefinition_Format2;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_ActionDefinition_Format2_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_ActionDefinition_Format2_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_E2SM_gNB_X2_ActionDefinition_Format2_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ActionDefinitionChoice.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ActionDefinitionChoice.c
new file mode 100644
index 0000000..589d3dd
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ActionDefinitionChoice.c
@@ -0,0 +1,62 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_E2SM-gNB-X2-ActionDefinitionChoice.h"
+
+static asn_per_constraints_t asn_PER_type_E2_E2SM_gNB_X2_ActionDefinitionChoice_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_ActionDefinitionChoice_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_ActionDefinitionChoice, choice.actionDefinition_Format1),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_E2SM_gNB_X2_actionDefinition,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"actionDefinition-Format1"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_ActionDefinitionChoice, choice.actionDefinition_Format2),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_E2SM_gNB_X2_ActionDefinition_Format2,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"actionDefinition-Format2"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_E2SM_gNB_X2_ActionDefinitionChoice_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* actionDefinition-Format1 */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* actionDefinition-Format2 */
+};
+static asn_CHOICE_specifics_t asn_SPC_E2_E2SM_gNB_X2_ActionDefinitionChoice_specs_1 = {
+	sizeof(struct E2_E2SM_gNB_X2_ActionDefinitionChoice),
+	offsetof(struct E2_E2SM_gNB_X2_ActionDefinitionChoice, _asn_ctx),
+	offsetof(struct E2_E2SM_gNB_X2_ActionDefinitionChoice, present),
+	sizeof(((struct E2_E2SM_gNB_X2_ActionDefinitionChoice *)0)->present),
+	asn_MAP_E2_E2SM_gNB_X2_ActionDefinitionChoice_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_ActionDefinitionChoice = {
+	"E2SM-gNB-X2-ActionDefinitionChoice",
+	"E2SM-gNB-X2-ActionDefinitionChoice",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_E2_E2SM_gNB_X2_ActionDefinitionChoice_constr_1, CHOICE_constraint },
+	asn_MBR_E2_E2SM_gNB_X2_ActionDefinitionChoice_1,
+	2,	/* Elements count */
+	&asn_SPC_E2_E2SM_gNB_X2_ActionDefinitionChoice_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ActionDefinitionChoice.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ActionDefinitionChoice.h
new file mode 100644
index 0000000..a3a7c2e
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ActionDefinitionChoice.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_E2SM_gNB_X2_ActionDefinitionChoice_H_
+#define	_E2_E2SM_gNB_X2_ActionDefinitionChoice_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_E2SM-gNB-X2-actionDefinition.h"
+#include "E2_E2SM-gNB-X2-ActionDefinition-Format2.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_E2SM_gNB_X2_ActionDefinitionChoice_PR {
+	E2_E2SM_gNB_X2_ActionDefinitionChoice_PR_NOTHING,	/* No components present */
+	E2_E2SM_gNB_X2_ActionDefinitionChoice_PR_actionDefinition_Format1,
+	E2_E2SM_gNB_X2_ActionDefinitionChoice_PR_actionDefinition_Format2
+	/* Extensions may appear below */
+	
+} E2_E2SM_gNB_X2_ActionDefinitionChoice_PR;
+
+/* E2_E2SM-gNB-X2-ActionDefinitionChoice */
+typedef struct E2_E2SM_gNB_X2_ActionDefinitionChoice {
+	E2_E2SM_gNB_X2_ActionDefinitionChoice_PR present;
+	union E2_E2SM_gNB_X2_ActionDefinitionChoice_u {
+		E2_E2SM_gNB_X2_actionDefinition_t	 actionDefinition_Format1;
+		E2_E2SM_gNB_X2_ActionDefinition_Format2_t	 actionDefinition_Format2;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_E2SM_gNB_X2_ActionDefinitionChoice_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_ActionDefinitionChoice;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_E2SM_gNB_X2_ActionDefinitionChoice_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-CallProcessIDChoice.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-CallProcessIDChoice.c
new file mode 100644
index 0000000..29c66fb
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-CallProcessIDChoice.c
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_E2SM-gNB-X2-CallProcessIDChoice.h"
+
+static asn_per_constraints_t asn_PER_type_E2_E2SM_gNB_X2_CallProcessIDChoice_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_CallProcessIDChoice_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_CallProcessIDChoice, choice.callProcessID_Format1),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_E2SM_gNB_X2_callProcessID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"callProcessID-Format1"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_E2SM_gNB_X2_CallProcessIDChoice_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* callProcessID-Format1 */
+};
+static asn_CHOICE_specifics_t asn_SPC_E2_E2SM_gNB_X2_CallProcessIDChoice_specs_1 = {
+	sizeof(struct E2_E2SM_gNB_X2_CallProcessIDChoice),
+	offsetof(struct E2_E2SM_gNB_X2_CallProcessIDChoice, _asn_ctx),
+	offsetof(struct E2_E2SM_gNB_X2_CallProcessIDChoice, present),
+	sizeof(((struct E2_E2SM_gNB_X2_CallProcessIDChoice *)0)->present),
+	asn_MAP_E2_E2SM_gNB_X2_CallProcessIDChoice_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0,
+	1	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_CallProcessIDChoice = {
+	"E2SM-gNB-X2-CallProcessIDChoice",
+	"E2SM-gNB-X2-CallProcessIDChoice",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_E2_E2SM_gNB_X2_CallProcessIDChoice_constr_1, CHOICE_constraint },
+	asn_MBR_E2_E2SM_gNB_X2_CallProcessIDChoice_1,
+	1,	/* Elements count */
+	&asn_SPC_E2_E2SM_gNB_X2_CallProcessIDChoice_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-CallProcessIDChoice.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-CallProcessIDChoice.h
new file mode 100644
index 0000000..7fbc92b
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-CallProcessIDChoice.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_E2SM_gNB_X2_CallProcessIDChoice_H_
+#define	_E2_E2SM_gNB_X2_CallProcessIDChoice_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_E2SM-gNB-X2-callProcessID.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_E2SM_gNB_X2_CallProcessIDChoice_PR {
+	E2_E2SM_gNB_X2_CallProcessIDChoice_PR_NOTHING,	/* No components present */
+	E2_E2SM_gNB_X2_CallProcessIDChoice_PR_callProcessID_Format1
+	/* Extensions may appear below */
+	
+} E2_E2SM_gNB_X2_CallProcessIDChoice_PR;
+
+/* E2_E2SM-gNB-X2-CallProcessIDChoice */
+typedef struct E2_E2SM_gNB_X2_CallProcessIDChoice {
+	E2_E2SM_gNB_X2_CallProcessIDChoice_PR present;
+	union E2_E2SM_gNB_X2_CallProcessIDChoice_u {
+		E2_E2SM_gNB_X2_callProcessID_t	 callProcessID_Format1;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_E2SM_gNB_X2_CallProcessIDChoice_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_CallProcessIDChoice;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_E2SM_gNB_X2_CallProcessIDChoice_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ControlHeaderChoice.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ControlHeaderChoice.c
new file mode 100644
index 0000000..33e7d76
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ControlHeaderChoice.c
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_E2SM-gNB-X2-ControlHeaderChoice.h"
+
+static asn_per_constraints_t asn_PER_type_E2_E2SM_gNB_X2_ControlHeaderChoice_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_ControlHeaderChoice_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_ControlHeaderChoice, choice.controlHeader_Format1),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_E2SM_gNB_X2_controlHeader,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"controlHeader-Format1"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_E2SM_gNB_X2_ControlHeaderChoice_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* controlHeader-Format1 */
+};
+static asn_CHOICE_specifics_t asn_SPC_E2_E2SM_gNB_X2_ControlHeaderChoice_specs_1 = {
+	sizeof(struct E2_E2SM_gNB_X2_ControlHeaderChoice),
+	offsetof(struct E2_E2SM_gNB_X2_ControlHeaderChoice, _asn_ctx),
+	offsetof(struct E2_E2SM_gNB_X2_ControlHeaderChoice, present),
+	sizeof(((struct E2_E2SM_gNB_X2_ControlHeaderChoice *)0)->present),
+	asn_MAP_E2_E2SM_gNB_X2_ControlHeaderChoice_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0,
+	1	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_ControlHeaderChoice = {
+	"E2SM-gNB-X2-ControlHeaderChoice",
+	"E2SM-gNB-X2-ControlHeaderChoice",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_E2_E2SM_gNB_X2_ControlHeaderChoice_constr_1, CHOICE_constraint },
+	asn_MBR_E2_E2SM_gNB_X2_ControlHeaderChoice_1,
+	1,	/* Elements count */
+	&asn_SPC_E2_E2SM_gNB_X2_ControlHeaderChoice_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ControlHeaderChoice.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ControlHeaderChoice.h
new file mode 100644
index 0000000..77251fc
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ControlHeaderChoice.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_E2SM_gNB_X2_ControlHeaderChoice_H_
+#define	_E2_E2SM_gNB_X2_ControlHeaderChoice_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_E2SM-gNB-X2-controlHeader.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_E2SM_gNB_X2_ControlHeaderChoice_PR {
+	E2_E2SM_gNB_X2_ControlHeaderChoice_PR_NOTHING,	/* No components present */
+	E2_E2SM_gNB_X2_ControlHeaderChoice_PR_controlHeader_Format1
+	/* Extensions may appear below */
+	
+} E2_E2SM_gNB_X2_ControlHeaderChoice_PR;
+
+/* E2_E2SM-gNB-X2-ControlHeaderChoice */
+typedef struct E2_E2SM_gNB_X2_ControlHeaderChoice {
+	E2_E2SM_gNB_X2_ControlHeaderChoice_PR present;
+	union E2_E2SM_gNB_X2_ControlHeaderChoice_u {
+		E2_E2SM_gNB_X2_controlHeader_t	 controlHeader_Format1;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_E2SM_gNB_X2_ControlHeaderChoice_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_ControlHeaderChoice;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_E2SM_gNB_X2_ControlHeaderChoice_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ControlMessageChoice.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ControlMessageChoice.c
new file mode 100644
index 0000000..678c8ba
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ControlMessageChoice.c
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_E2SM-gNB-X2-ControlMessageChoice.h"
+
+static asn_per_constraints_t asn_PER_type_E2_E2SM_gNB_X2_ControlMessageChoice_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_ControlMessageChoice_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_ControlMessageChoice, choice.controlMessage_Format1),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_E2SM_gNB_X2_controlMessage,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"controlMessage-Format1"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_E2SM_gNB_X2_ControlMessageChoice_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* controlMessage-Format1 */
+};
+static asn_CHOICE_specifics_t asn_SPC_E2_E2SM_gNB_X2_ControlMessageChoice_specs_1 = {
+	sizeof(struct E2_E2SM_gNB_X2_ControlMessageChoice),
+	offsetof(struct E2_E2SM_gNB_X2_ControlMessageChoice, _asn_ctx),
+	offsetof(struct E2_E2SM_gNB_X2_ControlMessageChoice, present),
+	sizeof(((struct E2_E2SM_gNB_X2_ControlMessageChoice *)0)->present),
+	asn_MAP_E2_E2SM_gNB_X2_ControlMessageChoice_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0,
+	1	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_ControlMessageChoice = {
+	"E2SM-gNB-X2-ControlMessageChoice",
+	"E2SM-gNB-X2-ControlMessageChoice",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_E2_E2SM_gNB_X2_ControlMessageChoice_constr_1, CHOICE_constraint },
+	asn_MBR_E2_E2SM_gNB_X2_ControlMessageChoice_1,
+	1,	/* Elements count */
+	&asn_SPC_E2_E2SM_gNB_X2_ControlMessageChoice_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ControlMessageChoice.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ControlMessageChoice.h
new file mode 100644
index 0000000..d5f450c
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-ControlMessageChoice.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_E2SM_gNB_X2_ControlMessageChoice_H_
+#define	_E2_E2SM_gNB_X2_ControlMessageChoice_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_E2SM-gNB-X2-controlMessage.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_E2SM_gNB_X2_ControlMessageChoice_PR {
+	E2_E2SM_gNB_X2_ControlMessageChoice_PR_NOTHING,	/* No components present */
+	E2_E2SM_gNB_X2_ControlMessageChoice_PR_controlMessage_Format1
+	/* Extensions may appear below */
+	
+} E2_E2SM_gNB_X2_ControlMessageChoice_PR;
+
+/* E2_E2SM-gNB-X2-ControlMessageChoice */
+typedef struct E2_E2SM_gNB_X2_ControlMessageChoice {
+	E2_E2SM_gNB_X2_ControlMessageChoice_PR present;
+	union E2_E2SM_gNB_X2_ControlMessageChoice_u {
+		E2_E2SM_gNB_X2_controlMessage_t	 controlMessage_Format1;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_E2SM_gNB_X2_ControlMessageChoice_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_ControlMessageChoice;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_E2SM_gNB_X2_ControlMessageChoice_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-EventTriggerDefinitionChoice.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-EventTriggerDefinitionChoice.c
new file mode 100644
index 0000000..4f3777a
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-EventTriggerDefinitionChoice.c
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_E2SM-gNB-X2-EventTriggerDefinitionChoice.h"
+
+static asn_per_constraints_t asn_PER_type_E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_EventTriggerDefinitionChoice, choice.eventTriggerDefinition_Format1),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_E2SM_gNB_X2_eventTriggerDefinition,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"eventTriggerDefinition-Format1"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* eventTriggerDefinition-Format1 */
+};
+static asn_CHOICE_specifics_t asn_SPC_E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_specs_1 = {
+	sizeof(struct E2_E2SM_gNB_X2_EventTriggerDefinitionChoice),
+	offsetof(struct E2_E2SM_gNB_X2_EventTriggerDefinitionChoice, _asn_ctx),
+	offsetof(struct E2_E2SM_gNB_X2_EventTriggerDefinitionChoice, present),
+	sizeof(((struct E2_E2SM_gNB_X2_EventTriggerDefinitionChoice *)0)->present),
+	asn_MAP_E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0,
+	1	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_EventTriggerDefinitionChoice = {
+	"E2SM-gNB-X2-EventTriggerDefinitionChoice",
+	"E2SM-gNB-X2-EventTriggerDefinitionChoice",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_constr_1, CHOICE_constraint },
+	asn_MBR_E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_1,
+	1,	/* Elements count */
+	&asn_SPC_E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-EventTriggerDefinitionChoice.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-EventTriggerDefinitionChoice.h
new file mode 100644
index 0000000..8b9a66f
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-EventTriggerDefinitionChoice.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_H_
+#define	_E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_E2SM-gNB-X2-eventTriggerDefinition.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_PR {
+	E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_PR_NOTHING,	/* No components present */
+	E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_PR_eventTriggerDefinition_Format1
+	/* Extensions may appear below */
+	
+} E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_PR;
+
+/* E2_E2SM-gNB-X2-EventTriggerDefinitionChoice */
+typedef struct E2_E2SM_gNB_X2_EventTriggerDefinitionChoice {
+	E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_PR present;
+	union E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_u {
+		E2_E2SM_gNB_X2_eventTriggerDefinition_t	 eventTriggerDefinition_Format1;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_EventTriggerDefinitionChoice;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_E2SM_gNB_X2_EventTriggerDefinitionChoice_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-IndicationHeaderChoice.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-IndicationHeaderChoice.c
new file mode 100644
index 0000000..0382eff
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-IndicationHeaderChoice.c
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_E2SM-gNB-X2-IndicationHeaderChoice.h"
+
+static asn_per_constraints_t asn_PER_type_E2_E2SM_gNB_X2_IndicationHeaderChoice_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_IndicationHeaderChoice_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_IndicationHeaderChoice, choice.indicationHeader_Format1),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_E2SM_gNB_X2_indicationHeader,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"indicationHeader-Format1"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_E2SM_gNB_X2_IndicationHeaderChoice_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* indicationHeader-Format1 */
+};
+static asn_CHOICE_specifics_t asn_SPC_E2_E2SM_gNB_X2_IndicationHeaderChoice_specs_1 = {
+	sizeof(struct E2_E2SM_gNB_X2_IndicationHeaderChoice),
+	offsetof(struct E2_E2SM_gNB_X2_IndicationHeaderChoice, _asn_ctx),
+	offsetof(struct E2_E2SM_gNB_X2_IndicationHeaderChoice, present),
+	sizeof(((struct E2_E2SM_gNB_X2_IndicationHeaderChoice *)0)->present),
+	asn_MAP_E2_E2SM_gNB_X2_IndicationHeaderChoice_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0,
+	1	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_IndicationHeaderChoice = {
+	"E2SM-gNB-X2-IndicationHeaderChoice",
+	"E2SM-gNB-X2-IndicationHeaderChoice",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_E2_E2SM_gNB_X2_IndicationHeaderChoice_constr_1, CHOICE_constraint },
+	asn_MBR_E2_E2SM_gNB_X2_IndicationHeaderChoice_1,
+	1,	/* Elements count */
+	&asn_SPC_E2_E2SM_gNB_X2_IndicationHeaderChoice_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-IndicationHeaderChoice.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-IndicationHeaderChoice.h
new file mode 100644
index 0000000..c8b316c
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-IndicationHeaderChoice.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_E2SM_gNB_X2_IndicationHeaderChoice_H_
+#define	_E2_E2SM_gNB_X2_IndicationHeaderChoice_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_E2SM-gNB-X2-indicationHeader.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_E2SM_gNB_X2_IndicationHeaderChoice_PR {
+	E2_E2SM_gNB_X2_IndicationHeaderChoice_PR_NOTHING,	/* No components present */
+	E2_E2SM_gNB_X2_IndicationHeaderChoice_PR_indicationHeader_Format1
+	/* Extensions may appear below */
+	
+} E2_E2SM_gNB_X2_IndicationHeaderChoice_PR;
+
+/* E2_E2SM-gNB-X2-IndicationHeaderChoice */
+typedef struct E2_E2SM_gNB_X2_IndicationHeaderChoice {
+	E2_E2SM_gNB_X2_IndicationHeaderChoice_PR present;
+	union E2_E2SM_gNB_X2_IndicationHeaderChoice_u {
+		E2_E2SM_gNB_X2_indicationHeader_t	 indicationHeader_Format1;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_E2SM_gNB_X2_IndicationHeaderChoice_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_IndicationHeaderChoice;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_E2SM_gNB_X2_IndicationHeaderChoice_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-IndicationMessageChoice.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-IndicationMessageChoice.c
new file mode 100644
index 0000000..1824441
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-IndicationMessageChoice.c
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_E2SM-gNB-X2-IndicationMessageChoice.h"
+
+static asn_per_constraints_t asn_PER_type_E2_E2SM_gNB_X2_IndicationMessageChoice_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_IndicationMessageChoice_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_IndicationMessageChoice, choice.indicationMessage_Format1),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_E2SM_gNB_X2_indicationMessage,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"indicationMessage-Format1"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_E2SM_gNB_X2_IndicationMessageChoice_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* indicationMessage-Format1 */
+};
+static asn_CHOICE_specifics_t asn_SPC_E2_E2SM_gNB_X2_IndicationMessageChoice_specs_1 = {
+	sizeof(struct E2_E2SM_gNB_X2_IndicationMessageChoice),
+	offsetof(struct E2_E2SM_gNB_X2_IndicationMessageChoice, _asn_ctx),
+	offsetof(struct E2_E2SM_gNB_X2_IndicationMessageChoice, present),
+	sizeof(((struct E2_E2SM_gNB_X2_IndicationMessageChoice *)0)->present),
+	asn_MAP_E2_E2SM_gNB_X2_IndicationMessageChoice_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0,
+	1	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_IndicationMessageChoice = {
+	"E2SM-gNB-X2-IndicationMessageChoice",
+	"E2SM-gNB-X2-IndicationMessageChoice",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_E2_E2SM_gNB_X2_IndicationMessageChoice_constr_1, CHOICE_constraint },
+	asn_MBR_E2_E2SM_gNB_X2_IndicationMessageChoice_1,
+	1,	/* Elements count */
+	&asn_SPC_E2_E2SM_gNB_X2_IndicationMessageChoice_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-IndicationMessageChoice.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-IndicationMessageChoice.h
new file mode 100644
index 0000000..000d7e5
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-IndicationMessageChoice.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_E2SM_gNB_X2_IndicationMessageChoice_H_
+#define	_E2_E2SM_gNB_X2_IndicationMessageChoice_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_E2SM-gNB-X2-indicationMessage.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_E2SM_gNB_X2_IndicationMessageChoice_PR {
+	E2_E2SM_gNB_X2_IndicationMessageChoice_PR_NOTHING,	/* No components present */
+	E2_E2SM_gNB_X2_IndicationMessageChoice_PR_indicationMessage_Format1
+	/* Extensions may appear below */
+	
+} E2_E2SM_gNB_X2_IndicationMessageChoice_PR;
+
+/* E2_E2SM-gNB-X2-IndicationMessageChoice */
+typedef struct E2_E2SM_gNB_X2_IndicationMessageChoice {
+	E2_E2SM_gNB_X2_IndicationMessageChoice_PR present;
+	union E2_E2SM_gNB_X2_IndicationMessageChoice_u {
+		E2_E2SM_gNB_X2_indicationMessage_t	 indicationMessage_Format1;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_E2SM_gNB_X2_IndicationMessageChoice_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_IndicationMessageChoice;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_E2SM_gNB_X2_IndicationMessageChoice_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-actionDefinition.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-actionDefinition.c
new file mode 100644
index 0000000..2eda881
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-actionDefinition.c
@@ -0,0 +1,136 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_E2SM-gNB-X2-actionDefinition.h"
+
+#include "E2_ActionParameter-Item.h"
+static int
+memb_E2_actionParameter_List_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size >= 1 && size <= 255)) {
+		/* Perform validation of the inner elements */
+		return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_E2_actionParameter_List_constr_3 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1,  255 }	/* (SIZE(1..255)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_E2_actionParameter_List_constr_3 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1,  255 }	/* (SIZE(1..255)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_E2_actionParameter_List_3[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_E2_ActionParameter_Item,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_actionParameter_List_tags_3[] = {
+	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_E2_actionParameter_List_specs_3 = {
+	sizeof(struct E2_E2SM_gNB_X2_actionDefinition__actionParameter_List),
+	offsetof(struct E2_E2SM_gNB_X2_actionDefinition__actionParameter_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_E2_actionParameter_List_3 = {
+	"actionParameter-List",
+	"actionParameter-List",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_E2_actionParameter_List_tags_3,
+	sizeof(asn_DEF_E2_actionParameter_List_tags_3)
+		/sizeof(asn_DEF_E2_actionParameter_List_tags_3[0]) - 1, /* 1 */
+	asn_DEF_E2_actionParameter_List_tags_3,	/* Same as above */
+	sizeof(asn_DEF_E2_actionParameter_List_tags_3)
+		/sizeof(asn_DEF_E2_actionParameter_List_tags_3[0]), /* 2 */
+	{ 0, &asn_PER_type_E2_actionParameter_List_constr_3, SEQUENCE_OF_constraint },
+	asn_MBR_E2_actionParameter_List_3,
+	1,	/* Single element */
+	&asn_SPC_E2_actionParameter_List_specs_3	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_actionDefinition_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_actionDefinition, style_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_Style_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"style-ID"
+		},
+	{ ATF_POINTER, 1, offsetof(struct E2_E2SM_gNB_X2_actionDefinition, actionParameter_List),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		0,
+		&asn_DEF_E2_actionParameter_List_3,
+		0,
+		{ 0, &asn_PER_memb_E2_actionParameter_List_constr_3,  memb_E2_actionParameter_List_constraint_1 },
+		0, 0, /* No default value */
+		"actionParameter-List"
+		},
+};
+static const int asn_MAP_E2_E2SM_gNB_X2_actionDefinition_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_E2_E2SM_gNB_X2_actionDefinition_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_E2SM_gNB_X2_actionDefinition_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* style-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* actionParameter-List */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_actionDefinition_specs_1 = {
+	sizeof(struct E2_E2SM_gNB_X2_actionDefinition),
+	offsetof(struct E2_E2SM_gNB_X2_actionDefinition, _asn_ctx),
+	asn_MAP_E2_E2SM_gNB_X2_actionDefinition_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_E2_E2SM_gNB_X2_actionDefinition_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_actionDefinition = {
+	"E2SM-gNB-X2-actionDefinition",
+	"E2SM-gNB-X2-actionDefinition",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_E2SM_gNB_X2_actionDefinition_tags_1,
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_actionDefinition_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_actionDefinition_tags_1[0]), /* 1 */
+	asn_DEF_E2_E2SM_gNB_X2_actionDefinition_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_actionDefinition_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_actionDefinition_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_E2SM_gNB_X2_actionDefinition_1,
+	2,	/* Elements count */
+	&asn_SPC_E2_E2SM_gNB_X2_actionDefinition_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-actionDefinition.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-actionDefinition.h
new file mode 100644
index 0000000..8b50300
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-actionDefinition.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_E2SM_gNB_X2_actionDefinition_H_
+#define	_E2_E2SM_gNB_X2_actionDefinition_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_Style-ID.h"
+#include "asn_SEQUENCE_OF.h"
+#include "constr_SEQUENCE_OF.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct E2_ActionParameter_Item;
+
+/* E2_E2SM-gNB-X2-actionDefinition */
+typedef struct E2_E2SM_gNB_X2_actionDefinition {
+	E2_Style_ID_t	 style_ID;
+	struct E2_E2SM_gNB_X2_actionDefinition__actionParameter_List {
+		A_SEQUENCE_OF(struct E2_ActionParameter_Item) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} *actionParameter_List;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_E2SM_gNB_X2_actionDefinition_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_actionDefinition;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_actionDefinition_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_actionDefinition_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_E2SM_gNB_X2_actionDefinition_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-callProcessID.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-callProcessID.c
new file mode 100644
index 0000000..49da203
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-callProcessID.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_E2SM-gNB-X2-callProcessID.h"
+
+asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_callProcessID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_callProcessID, callProcess_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_CallProcess_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"callProcess-ID"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_E2SM_gNB_X2_callProcessID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_E2SM_gNB_X2_callProcessID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* callProcess-ID */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_callProcessID_specs_1 = {
+	sizeof(struct E2_E2SM_gNB_X2_callProcessID),
+	offsetof(struct E2_E2SM_gNB_X2_callProcessID, _asn_ctx),
+	asn_MAP_E2_E2SM_gNB_X2_callProcessID_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_callProcessID = {
+	"E2SM-gNB-X2-callProcessID",
+	"E2SM-gNB-X2-callProcessID",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_E2SM_gNB_X2_callProcessID_tags_1,
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_callProcessID_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_callProcessID_tags_1[0]), /* 1 */
+	asn_DEF_E2_E2SM_gNB_X2_callProcessID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_callProcessID_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_callProcessID_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_E2SM_gNB_X2_callProcessID_1,
+	1,	/* Elements count */
+	&asn_SPC_E2_E2SM_gNB_X2_callProcessID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-callProcessID.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-callProcessID.h
new file mode 100644
index 0000000..f2231bf
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-callProcessID.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_E2SM_gNB_X2_callProcessID_H_
+#define	_E2_E2SM_gNB_X2_callProcessID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_CallProcess-ID.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_E2SM-gNB-X2-callProcessID */
+typedef struct E2_E2SM_gNB_X2_callProcessID {
+	E2_CallProcess_ID_t	 callProcess_ID;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_E2SM_gNB_X2_callProcessID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_callProcessID;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_callProcessID_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_callProcessID_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_E2SM_gNB_X2_callProcessID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-controlHeader.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-controlHeader.c
new file mode 100644
index 0000000..f4ad685
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-controlHeader.c
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_E2SM-gNB-X2-controlHeader.h"
+
+asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_controlHeader_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_controlHeader, interface_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_E2_Interface_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"interface-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_controlHeader, interfaceDirection),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_InterfaceDirection,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"interfaceDirection"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_E2SM_gNB_X2_controlHeader_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_E2SM_gNB_X2_controlHeader_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* interface-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* interfaceDirection */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_controlHeader_specs_1 = {
+	sizeof(struct E2_E2SM_gNB_X2_controlHeader),
+	offsetof(struct E2_E2SM_gNB_X2_controlHeader, _asn_ctx),
+	asn_MAP_E2_E2SM_gNB_X2_controlHeader_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_controlHeader = {
+	"E2SM-gNB-X2-controlHeader",
+	"E2SM-gNB-X2-controlHeader",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_E2SM_gNB_X2_controlHeader_tags_1,
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_controlHeader_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_controlHeader_tags_1[0]), /* 1 */
+	asn_DEF_E2_E2SM_gNB_X2_controlHeader_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_controlHeader_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_controlHeader_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_E2SM_gNB_X2_controlHeader_1,
+	2,	/* Elements count */
+	&asn_SPC_E2_E2SM_gNB_X2_controlHeader_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-controlHeader.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-controlHeader.h
new file mode 100644
index 0000000..c36bf70
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-controlHeader.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_E2SM_gNB_X2_controlHeader_H_
+#define	_E2_E2SM_gNB_X2_controlHeader_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_Interface-ID.h"
+#include "E2_InterfaceDirection.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_E2SM-gNB-X2-controlHeader */
+typedef struct E2_E2SM_gNB_X2_controlHeader {
+	E2_Interface_ID_t	 interface_ID;
+	E2_InterfaceDirection_t	 interfaceDirection;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_E2SM_gNB_X2_controlHeader_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_controlHeader;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_controlHeader_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_controlHeader_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_E2SM_gNB_X2_controlHeader_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-controlMessage.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-controlMessage.c
new file mode 100644
index 0000000..f9aed50
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-controlMessage.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_E2SM-gNB-X2-controlMessage.h"
+
+asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_controlMessage_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_controlMessage, interfaceMessage),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_InterfaceMessage,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"interfaceMessage"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_E2SM_gNB_X2_controlMessage_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_E2SM_gNB_X2_controlMessage_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* interfaceMessage */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_controlMessage_specs_1 = {
+	sizeof(struct E2_E2SM_gNB_X2_controlMessage),
+	offsetof(struct E2_E2SM_gNB_X2_controlMessage, _asn_ctx),
+	asn_MAP_E2_E2SM_gNB_X2_controlMessage_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_controlMessage = {
+	"E2SM-gNB-X2-controlMessage",
+	"E2SM-gNB-X2-controlMessage",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_E2SM_gNB_X2_controlMessage_tags_1,
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_controlMessage_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_controlMessage_tags_1[0]), /* 1 */
+	asn_DEF_E2_E2SM_gNB_X2_controlMessage_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_controlMessage_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_controlMessage_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_E2SM_gNB_X2_controlMessage_1,
+	1,	/* Elements count */
+	&asn_SPC_E2_E2SM_gNB_X2_controlMessage_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-controlMessage.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-controlMessage.h
new file mode 100644
index 0000000..15d6221
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-controlMessage.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_E2SM_gNB_X2_controlMessage_H_
+#define	_E2_E2SM_gNB_X2_controlMessage_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_InterfaceMessage.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_E2SM-gNB-X2-controlMessage */
+typedef struct E2_E2SM_gNB_X2_controlMessage {
+	E2_InterfaceMessage_t	 interfaceMessage;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_E2SM_gNB_X2_controlMessage_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_controlMessage;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_controlMessage_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_controlMessage_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_E2SM_gNB_X2_controlMessage_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-eventTriggerDefinition.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-eventTriggerDefinition.c
new file mode 100644
index 0000000..fbe7b7d
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-eventTriggerDefinition.c
@@ -0,0 +1,156 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_E2SM-gNB-X2-eventTriggerDefinition.h"
+
+#include "E2_InterfaceProtocolIE-Item.h"
+static int
+memb_E2_interfaceProtocolIE_List_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size >= 1 && size <= 15)) {
+		/* Perform validation of the inner elements */
+		return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_E2_interfaceProtocolIE_List_constr_5 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1,  15 }	/* (SIZE(1..15)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_E2_interfaceProtocolIE_List_constr_5 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1,  15 }	/* (SIZE(1..15)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_E2_interfaceProtocolIE_List_5[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_E2_InterfaceProtocolIE_Item,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_interfaceProtocolIE_List_tags_5[] = {
+	(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_E2_interfaceProtocolIE_List_specs_5 = {
+	sizeof(struct E2_E2SM_gNB_X2_eventTriggerDefinition__interfaceProtocolIE_List),
+	offsetof(struct E2_E2SM_gNB_X2_eventTriggerDefinition__interfaceProtocolIE_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_E2_interfaceProtocolIE_List_5 = {
+	"interfaceProtocolIE-List",
+	"interfaceProtocolIE-List",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_E2_interfaceProtocolIE_List_tags_5,
+	sizeof(asn_DEF_E2_interfaceProtocolIE_List_tags_5)
+		/sizeof(asn_DEF_E2_interfaceProtocolIE_List_tags_5[0]) - 1, /* 1 */
+	asn_DEF_E2_interfaceProtocolIE_List_tags_5,	/* Same as above */
+	sizeof(asn_DEF_E2_interfaceProtocolIE_List_tags_5)
+		/sizeof(asn_DEF_E2_interfaceProtocolIE_List_tags_5[0]), /* 2 */
+	{ 0, &asn_PER_type_E2_interfaceProtocolIE_List_constr_5, SEQUENCE_OF_constraint },
+	asn_MBR_E2_interfaceProtocolIE_List_5,
+	1,	/* Single element */
+	&asn_SPC_E2_interfaceProtocolIE_List_specs_5	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_eventTriggerDefinition_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_eventTriggerDefinition, interface_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_E2_Interface_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"interface-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_eventTriggerDefinition, interfaceDirection),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_InterfaceDirection,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"interfaceDirection"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_eventTriggerDefinition, interfaceMessageType),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_InterfaceMessageType,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"interfaceMessageType"
+		},
+	{ ATF_POINTER, 1, offsetof(struct E2_E2SM_gNB_X2_eventTriggerDefinition, interfaceProtocolIE_List),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		0,
+		&asn_DEF_E2_interfaceProtocolIE_List_5,
+		0,
+		{ 0, &asn_PER_memb_E2_interfaceProtocolIE_List_constr_5,  memb_E2_interfaceProtocolIE_List_constraint_1 },
+		0, 0, /* No default value */
+		"interfaceProtocolIE-List"
+		},
+};
+static const int asn_MAP_E2_E2SM_gNB_X2_eventTriggerDefinition_oms_1[] = { 3 };
+static const ber_tlv_tag_t asn_DEF_E2_E2SM_gNB_X2_eventTriggerDefinition_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_E2SM_gNB_X2_eventTriggerDefinition_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* interface-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* interfaceDirection */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* interfaceMessageType */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* interfaceProtocolIE-List */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_eventTriggerDefinition_specs_1 = {
+	sizeof(struct E2_E2SM_gNB_X2_eventTriggerDefinition),
+	offsetof(struct E2_E2SM_gNB_X2_eventTriggerDefinition, _asn_ctx),
+	asn_MAP_E2_E2SM_gNB_X2_eventTriggerDefinition_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_E2_E2SM_gNB_X2_eventTriggerDefinition_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	4,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_eventTriggerDefinition = {
+	"E2SM-gNB-X2-eventTriggerDefinition",
+	"E2SM-gNB-X2-eventTriggerDefinition",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_E2SM_gNB_X2_eventTriggerDefinition_tags_1,
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_eventTriggerDefinition_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_eventTriggerDefinition_tags_1[0]), /* 1 */
+	asn_DEF_E2_E2SM_gNB_X2_eventTriggerDefinition_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_eventTriggerDefinition_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_eventTriggerDefinition_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_E2SM_gNB_X2_eventTriggerDefinition_1,
+	4,	/* Elements count */
+	&asn_SPC_E2_E2SM_gNB_X2_eventTriggerDefinition_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-eventTriggerDefinition.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-eventTriggerDefinition.h
new file mode 100644
index 0000000..8eb708e
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-eventTriggerDefinition.h
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_E2SM_gNB_X2_eventTriggerDefinition_H_
+#define	_E2_E2SM_gNB_X2_eventTriggerDefinition_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_Interface-ID.h"
+#include "E2_InterfaceDirection.h"
+#include "E2_InterfaceMessageType.h"
+#include "asn_SEQUENCE_OF.h"
+#include "constr_SEQUENCE_OF.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct E2_InterfaceProtocolIE_Item;
+
+/* E2_E2SM-gNB-X2-eventTriggerDefinition */
+typedef struct E2_E2SM_gNB_X2_eventTriggerDefinition {
+	E2_Interface_ID_t	 interface_ID;
+	E2_InterfaceDirection_t	 interfaceDirection;
+	E2_InterfaceMessageType_t	 interfaceMessageType;
+	struct E2_E2SM_gNB_X2_eventTriggerDefinition__interfaceProtocolIE_List {
+		A_SEQUENCE_OF(struct E2_InterfaceProtocolIE_Item) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} *interfaceProtocolIE_List;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_E2SM_gNB_X2_eventTriggerDefinition_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_eventTriggerDefinition;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_eventTriggerDefinition_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_eventTriggerDefinition_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_E2SM_gNB_X2_eventTriggerDefinition_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-indicationHeader.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-indicationHeader.c
new file mode 100644
index 0000000..5fc9909
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-indicationHeader.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_E2SM-gNB-X2-indicationHeader.h"
+
+asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_indicationHeader_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_indicationHeader, interface_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_E2_Interface_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"interface-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_indicationHeader, interfaceDirection),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_InterfaceDirection,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"interfaceDirection"
+		},
+	{ ATF_POINTER, 1, offsetof(struct E2_E2SM_gNB_X2_indicationHeader, timestamp),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_TimeStamp,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"timestamp"
+		},
+};
+static const int asn_MAP_E2_E2SM_gNB_X2_indicationHeader_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_E2_E2SM_gNB_X2_indicationHeader_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_E2SM_gNB_X2_indicationHeader_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* interface-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* interfaceDirection */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* timestamp */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_indicationHeader_specs_1 = {
+	sizeof(struct E2_E2SM_gNB_X2_indicationHeader),
+	offsetof(struct E2_E2SM_gNB_X2_indicationHeader, _asn_ctx),
+	asn_MAP_E2_E2SM_gNB_X2_indicationHeader_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_E2_E2SM_gNB_X2_indicationHeader_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	3,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_indicationHeader = {
+	"E2SM-gNB-X2-indicationHeader",
+	"E2SM-gNB-X2-indicationHeader",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_E2SM_gNB_X2_indicationHeader_tags_1,
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_indicationHeader_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_indicationHeader_tags_1[0]), /* 1 */
+	asn_DEF_E2_E2SM_gNB_X2_indicationHeader_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_indicationHeader_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_indicationHeader_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_E2SM_gNB_X2_indicationHeader_1,
+	3,	/* Elements count */
+	&asn_SPC_E2_E2SM_gNB_X2_indicationHeader_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-indicationHeader.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-indicationHeader.h
new file mode 100644
index 0000000..93198c6
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-indicationHeader.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_E2SM_gNB_X2_indicationHeader_H_
+#define	_E2_E2SM_gNB_X2_indicationHeader_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_Interface-ID.h"
+#include "E2_InterfaceDirection.h"
+#include "E2_TimeStamp.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_E2SM-gNB-X2-indicationHeader */
+typedef struct E2_E2SM_gNB_X2_indicationHeader {
+	E2_Interface_ID_t	 interface_ID;
+	E2_InterfaceDirection_t	 interfaceDirection;
+	E2_TimeStamp_t	*timestamp;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_E2SM_gNB_X2_indicationHeader_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_indicationHeader;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_indicationHeader_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_indicationHeader_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_E2SM_gNB_X2_indicationHeader_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-indicationMessage.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-indicationMessage.c
new file mode 100644
index 0000000..88b15ff
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-indicationMessage.c
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_E2SM-gNB-X2-indicationMessage.h"
+
+asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_indicationMessage_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_E2SM_gNB_X2_indicationMessage, interfaceMessage),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_InterfaceMessage,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"interfaceMessage"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_E2SM_gNB_X2_indicationMessage_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_E2SM_gNB_X2_indicationMessage_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* interfaceMessage */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_indicationMessage_specs_1 = {
+	sizeof(struct E2_E2SM_gNB_X2_indicationMessage),
+	offsetof(struct E2_E2SM_gNB_X2_indicationMessage, _asn_ctx),
+	asn_MAP_E2_E2SM_gNB_X2_indicationMessage_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_indicationMessage = {
+	"E2SM-gNB-X2-indicationMessage",
+	"E2SM-gNB-X2-indicationMessage",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_E2SM_gNB_X2_indicationMessage_tags_1,
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_indicationMessage_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_indicationMessage_tags_1[0]), /* 1 */
+	asn_DEF_E2_E2SM_gNB_X2_indicationMessage_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_E2SM_gNB_X2_indicationMessage_tags_1)
+		/sizeof(asn_DEF_E2_E2SM_gNB_X2_indicationMessage_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_E2SM_gNB_X2_indicationMessage_1,
+	1,	/* Elements count */
+	&asn_SPC_E2_E2SM_gNB_X2_indicationMessage_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-indicationMessage.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-indicationMessage.h
new file mode 100644
index 0000000..1e7c966
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_E2SM-gNB-X2-indicationMessage.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_E2SM_gNB_X2_indicationMessage_H_
+#define	_E2_E2SM_gNB_X2_indicationMessage_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_InterfaceMessage.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_E2SM-gNB-X2-indicationMessage */
+typedef struct E2_E2SM_gNB_X2_indicationMessage {
+	E2_InterfaceMessage_t	 interfaceMessage;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_E2SM_gNB_X2_indicationMessage_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_E2SM_gNB_X2_indicationMessage;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_E2SM_gNB_X2_indicationMessage_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_E2SM_gNB_X2_indicationMessage_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_E2SM_gNB_X2_indicationMessage_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ENB-ID.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ENB-ID.c
new file mode 100644
index 0000000..4861ea7
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ENB-ID.c
@@ -0,0 +1,226 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_ENB-ID.h"
+
+static int
+memb_E2_macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 20)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_E2_home_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 28)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_E2_short_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 18)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_E2_long_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 21)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_E2_macro_eNB_ID_constr_2 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  20,  20 }	/* (SIZE(20..20)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_E2_home_eNB_ID_constr_3 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  28,  28 }	/* (SIZE(28..28)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_E2_short_Macro_eNB_ID_constr_5 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  18,  18 }	/* (SIZE(18..18)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_E2_long_Macro_eNB_ID_constr_6 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  21,  21 }	/* (SIZE(21..21)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_E2_ENB_ID_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+asn_TYPE_member_t asn_MBR_E2_ENB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_ENB_ID, choice.macro_eNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, &asn_PER_memb_E2_macro_eNB_ID_constr_2,  memb_E2_macro_eNB_ID_constraint_1 },
+		0, 0, /* No default value */
+		"macro-eNB-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_ENB_ID, choice.home_eNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, &asn_PER_memb_E2_home_eNB_ID_constr_3,  memb_E2_home_eNB_ID_constraint_1 },
+		0, 0, /* No default value */
+		"home-eNB-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_ENB_ID, choice.short_Macro_eNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, &asn_PER_memb_E2_short_Macro_eNB_ID_constr_5,  memb_E2_short_Macro_eNB_ID_constraint_1 },
+		0, 0, /* No default value */
+		"short-Macro-eNB-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_ENB_ID, choice.long_Macro_eNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, &asn_PER_memb_E2_long_Macro_eNB_ID_constr_6,  memb_E2_long_Macro_eNB_ID_constraint_1 },
+		0, 0, /* No default value */
+		"long-Macro-eNB-ID"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_ENB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* macro-eNB-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* home-eNB-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* short-Macro-eNB-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* long-Macro-eNB-ID */
+};
+asn_CHOICE_specifics_t asn_SPC_E2_ENB_ID_specs_1 = {
+	sizeof(struct E2_ENB_ID),
+	offsetof(struct E2_ENB_ID, _asn_ctx),
+	offsetof(struct E2_ENB_ID, present),
+	sizeof(((struct E2_ENB_ID *)0)->present),
+	asn_MAP_E2_ENB_ID_tag2el_1,
+	4,	/* Count of tags in the map */
+	0, 0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_ENB_ID = {
+	"ENB-ID",
+	"ENB-ID",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_E2_ENB_ID_constr_1, CHOICE_constraint },
+	asn_MBR_E2_ENB_ID_1,
+	4,	/* Elements count */
+	&asn_SPC_E2_ENB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ENB-ID.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ENB-ID.h
new file mode 100644
index 0000000..c0423d2
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ENB-ID.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_ENB_ID_H_
+#define	_E2_ENB_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "BIT_STRING.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_ENB_ID_PR {
+	E2_ENB_ID_PR_NOTHING,	/* No components present */
+	E2_ENB_ID_PR_macro_eNB_ID,
+	E2_ENB_ID_PR_home_eNB_ID,
+	/* Extensions may appear below */
+	E2_ENB_ID_PR_short_Macro_eNB_ID,
+	E2_ENB_ID_PR_long_Macro_eNB_ID
+} E2_ENB_ID_PR;
+
+/* E2_ENB-ID */
+typedef struct E2_ENB_ID {
+	E2_ENB_ID_PR present;
+	union E2_ENB_ID_u {
+		BIT_STRING_t	 macro_eNB_ID;
+		BIT_STRING_t	 home_eNB_ID;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		BIT_STRING_t	 short_Macro_eNB_ID;
+		BIT_STRING_t	 long_Macro_eNB_ID;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_ENB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_ENB_ID;
+extern asn_CHOICE_specifics_t asn_SPC_E2_ENB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_ENB_ID_1[4];
+extern asn_per_constraints_t asn_PER_type_E2_ENB_ID_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_ENB_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GNB-ID.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GNB-ID.c
new file mode 100644
index 0000000..157dbd4
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GNB-ID.c
@@ -0,0 +1,88 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_GNB-ID.h"
+
+static int
+memb_E2_gNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size >= 22 && size <= 32)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_E2_gNB_ID_constr_2 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  22,  32 }	/* (SIZE(22..32)) */,
+	0, 0	/* No PER value map */
+};
+asn_per_constraints_t asn_PER_type_E2_GNB_ID_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+asn_TYPE_member_t asn_MBR_E2_GNB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_GNB_ID, choice.gNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, &asn_PER_memb_E2_gNB_ID_constr_2,  memb_E2_gNB_ID_constraint_1 },
+		0, 0, /* No default value */
+		"gNB-ID"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_GNB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* gNB-ID */
+};
+asn_CHOICE_specifics_t asn_SPC_E2_GNB_ID_specs_1 = {
+	sizeof(struct E2_GNB_ID),
+	offsetof(struct E2_GNB_ID, _asn_ctx),
+	offsetof(struct E2_GNB_ID, present),
+	sizeof(((struct E2_GNB_ID *)0)->present),
+	asn_MAP_E2_GNB_ID_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0,
+	1	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_GNB_ID = {
+	"GNB-ID",
+	"GNB-ID",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_E2_GNB_ID_constr_1, CHOICE_constraint },
+	asn_MBR_E2_GNB_ID_1,
+	1,	/* Elements count */
+	&asn_SPC_E2_GNB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GNB-ID.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GNB-ID.h
new file mode 100644
index 0000000..7a2d257
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GNB-ID.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_GNB_ID_H_
+#define	_E2_GNB_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "BIT_STRING.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_GNB_ID_PR {
+	E2_GNB_ID_PR_NOTHING,	/* No components present */
+	E2_GNB_ID_PR_gNB_ID
+	/* Extensions may appear below */
+	
+} E2_GNB_ID_PR;
+
+/* E2_GNB-ID */
+typedef struct E2_GNB_ID {
+	E2_GNB_ID_PR present;
+	union E2_GNB_ID_u {
+		BIT_STRING_t	 gNB_ID;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_GNB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_GNB_ID;
+extern asn_CHOICE_specifics_t asn_SPC_E2_GNB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_GNB_ID_1[1];
+extern asn_per_constraints_t asn_PER_type_E2_GNB_ID_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_GNB_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GlobalENB-ID.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GlobalENB-ID.c
new file mode 100644
index 0000000..7fea0be
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GlobalENB-ID.c
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_GlobalENB-ID.h"
+
+asn_TYPE_member_t asn_MBR_E2_GlobalENB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_GlobalENB_ID, pLMN_Identity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_PLMN_Identity,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"pLMN-Identity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_GlobalENB_ID, eNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_E2_ENB_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"eNB-ID"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_GlobalENB_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_GlobalENB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* eNB-ID */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_GlobalENB_ID_specs_1 = {
+	sizeof(struct E2_GlobalENB_ID),
+	offsetof(struct E2_GlobalENB_ID, _asn_ctx),
+	asn_MAP_E2_GlobalENB_ID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_GlobalENB_ID = {
+	"GlobalENB-ID",
+	"GlobalENB-ID",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_GlobalENB_ID_tags_1,
+	sizeof(asn_DEF_E2_GlobalENB_ID_tags_1)
+		/sizeof(asn_DEF_E2_GlobalENB_ID_tags_1[0]), /* 1 */
+	asn_DEF_E2_GlobalENB_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_GlobalENB_ID_tags_1)
+		/sizeof(asn_DEF_E2_GlobalENB_ID_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_GlobalENB_ID_1,
+	2,	/* Elements count */
+	&asn_SPC_E2_GlobalENB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GlobalENB-ID.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GlobalENB-ID.h
new file mode 100644
index 0000000..77865c2
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GlobalENB-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_GlobalENB_ID_H_
+#define	_E2_GlobalENB_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_PLMN-Identity.h"
+#include "E2_ENB-ID.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_GlobalENB-ID */
+typedef struct E2_GlobalENB_ID {
+	E2_PLMN_Identity_t	 pLMN_Identity;
+	E2_ENB_ID_t	 eNB_ID;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_GlobalENB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_GlobalENB_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_GlobalENB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_GlobalENB_ID_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_GlobalENB_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GlobalGNB-ID.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GlobalGNB-ID.c
new file mode 100644
index 0000000..3723ad9
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GlobalGNB-ID.c
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_GlobalGNB-ID.h"
+
+asn_TYPE_member_t asn_MBR_E2_GlobalGNB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_GlobalGNB_ID, pLMN_Identity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_PLMN_Identity,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"pLMN-Identity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_GlobalGNB_ID, gNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_E2_GNB_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"gNB-ID"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_GlobalGNB_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_GlobalGNB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* gNB-ID */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_GlobalGNB_ID_specs_1 = {
+	sizeof(struct E2_GlobalGNB_ID),
+	offsetof(struct E2_GlobalGNB_ID, _asn_ctx),
+	asn_MAP_E2_GlobalGNB_ID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_GlobalGNB_ID = {
+	"GlobalGNB-ID",
+	"GlobalGNB-ID",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_GlobalGNB_ID_tags_1,
+	sizeof(asn_DEF_E2_GlobalGNB_ID_tags_1)
+		/sizeof(asn_DEF_E2_GlobalGNB_ID_tags_1[0]), /* 1 */
+	asn_DEF_E2_GlobalGNB_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_GlobalGNB_ID_tags_1)
+		/sizeof(asn_DEF_E2_GlobalGNB_ID_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_GlobalGNB_ID_1,
+	2,	/* Elements count */
+	&asn_SPC_E2_GlobalGNB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GlobalGNB-ID.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GlobalGNB-ID.h
new file mode 100644
index 0000000..7bccc89
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_GlobalGNB-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_GlobalGNB_ID_H_
+#define	_E2_GlobalGNB_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_PLMN-Identity.h"
+#include "E2_GNB-ID.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_GlobalGNB-ID */
+typedef struct E2_GlobalGNB_ID {
+	E2_PLMN_Identity_t	 pLMN_Identity;
+	E2_GNB_ID_t	 gNB_ID;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_GlobalGNB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_GlobalGNB_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_GlobalGNB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_GlobalGNB_ID_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_GlobalGNB_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Interface-ID.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Interface-ID.c
new file mode 100644
index 0000000..dbb1b47
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Interface-ID.c
@@ -0,0 +1,62 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_Interface-ID.h"
+
+asn_per_constraints_t asn_PER_type_E2_Interface_ID_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+asn_TYPE_member_t asn_MBR_E2_Interface_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_Interface_ID, choice.global_eNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_GlobalENB_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"global-eNB-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_Interface_ID, choice.global_gNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_GlobalGNB_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"global-gNB-ID"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_Interface_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* global-eNB-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* global-gNB-ID */
+};
+asn_CHOICE_specifics_t asn_SPC_E2_Interface_ID_specs_1 = {
+	sizeof(struct E2_Interface_ID),
+	offsetof(struct E2_Interface_ID, _asn_ctx),
+	offsetof(struct E2_Interface_ID, present),
+	sizeof(((struct E2_Interface_ID *)0)->present),
+	asn_MAP_E2_Interface_ID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_Interface_ID = {
+	"Interface-ID",
+	"Interface-ID",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_E2_Interface_ID_constr_1, CHOICE_constraint },
+	asn_MBR_E2_Interface_ID_1,
+	2,	/* Elements count */
+	&asn_SPC_E2_Interface_ID_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Interface-ID.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Interface-ID.h
new file mode 100644
index 0000000..9c44d0a
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Interface-ID.h
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_Interface_ID_H_
+#define	_E2_Interface_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_GlobalENB-ID.h"
+#include "E2_GlobalGNB-ID.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_Interface_ID_PR {
+	E2_Interface_ID_PR_NOTHING,	/* No components present */
+	E2_Interface_ID_PR_global_eNB_ID,
+	E2_Interface_ID_PR_global_gNB_ID
+	/* Extensions may appear below */
+	
+} E2_Interface_ID_PR;
+
+/* E2_Interface-ID */
+typedef struct E2_Interface_ID {
+	E2_Interface_ID_PR present;
+	union E2_Interface_ID_u {
+		E2_GlobalENB_ID_t	 global_eNB_ID;
+		E2_GlobalGNB_ID_t	 global_gNB_ID;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_Interface_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_Interface_ID;
+extern asn_CHOICE_specifics_t asn_SPC_E2_Interface_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_Interface_ID_1[2];
+extern asn_per_constraints_t asn_PER_type_E2_Interface_ID_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_Interface_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceDirection.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceDirection.c
new file mode 100644
index 0000000..01a2684
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceDirection.c
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_InterfaceDirection.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_E2_InterfaceDirection_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_E2_InterfaceDirection_value2enum_1[] = {
+	{ 0,	8,	"incoming" },
+	{ 1,	8,	"outgoing" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_E2_InterfaceDirection_enum2value_1[] = {
+	0,	/* incoming(0) */
+	1	/* outgoing(1) */
+	/* This list is extensible */
+};
+const asn_INTEGER_specifics_t asn_SPC_E2_InterfaceDirection_specs_1 = {
+	asn_MAP_E2_InterfaceDirection_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_E2_InterfaceDirection_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_E2_InterfaceDirection_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_InterfaceDirection = {
+	"InterfaceDirection",
+	"InterfaceDirection",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_E2_InterfaceDirection_tags_1,
+	sizeof(asn_DEF_E2_InterfaceDirection_tags_1)
+		/sizeof(asn_DEF_E2_InterfaceDirection_tags_1[0]), /* 1 */
+	asn_DEF_E2_InterfaceDirection_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_InterfaceDirection_tags_1)
+		/sizeof(asn_DEF_E2_InterfaceDirection_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_E2_InterfaceDirection_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_E2_InterfaceDirection_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceDirection.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceDirection.h
new file mode 100644
index 0000000..416c45f
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceDirection.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_InterfaceDirection_H_
+#define	_E2_InterfaceDirection_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_InterfaceDirection {
+	E2_InterfaceDirection_incoming	= 0,
+	E2_InterfaceDirection_outgoing	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_E2_InterfaceDirection;
+
+/* E2_InterfaceDirection */
+typedef long	 E2_InterfaceDirection_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E2_InterfaceDirection_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E2_InterfaceDirection;
+extern const asn_INTEGER_specifics_t asn_SPC_InterfaceDirection_specs_1;
+asn_struct_free_f InterfaceDirection_free;
+asn_struct_print_f InterfaceDirection_print;
+asn_constr_check_f InterfaceDirection_constraint;
+ber_type_decoder_f InterfaceDirection_decode_ber;
+der_type_encoder_f InterfaceDirection_encode_der;
+xer_type_decoder_f InterfaceDirection_decode_xer;
+xer_type_encoder_f InterfaceDirection_encode_xer;
+per_type_decoder_f InterfaceDirection_decode_uper;
+per_type_encoder_f InterfaceDirection_encode_uper;
+per_type_decoder_f InterfaceDirection_decode_aper;
+per_type_encoder_f InterfaceDirection_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_InterfaceDirection_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceMessage.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceMessage.c
new file mode 100644
index 0000000..d921453
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceMessage.c
@@ -0,0 +1,31 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_InterfaceMessage.h"
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static const ber_tlv_tag_t asn_DEF_E2_InterfaceMessage_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_InterfaceMessage = {
+	"InterfaceMessage",
+	"InterfaceMessage",
+	&asn_OP_OCTET_STRING,
+	asn_DEF_E2_InterfaceMessage_tags_1,
+	sizeof(asn_DEF_E2_InterfaceMessage_tags_1)
+		/sizeof(asn_DEF_E2_InterfaceMessage_tags_1[0]), /* 1 */
+	asn_DEF_E2_InterfaceMessage_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_InterfaceMessage_tags_1)
+		/sizeof(asn_DEF_E2_InterfaceMessage_tags_1[0]), /* 1 */
+	{ 0, 0, OCTET_STRING_constraint },
+	0, 0,	/* No members */
+	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceMessage.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceMessage.h
new file mode 100644
index 0000000..821f7b3
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceMessage.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_InterfaceMessage_H_
+#define	_E2_InterfaceMessage_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "OCTET_STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_InterfaceMessage */
+typedef OCTET_STRING_t	 E2_InterfaceMessage_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_InterfaceMessage;
+asn_struct_free_f E2_InterfaceMessage_free;
+asn_struct_print_f E2_InterfaceMessage_print;
+asn_constr_check_f E2_InterfaceMessage_constraint;
+ber_type_decoder_f E2_InterfaceMessage_decode_ber;
+der_type_encoder_f E2_InterfaceMessage_encode_der;
+xer_type_decoder_f E2_InterfaceMessage_decode_xer;
+xer_type_encoder_f E2_InterfaceMessage_encode_xer;
+per_type_decoder_f E2_InterfaceMessage_decode_uper;
+per_type_encoder_f E2_InterfaceMessage_encode_uper;
+per_type_decoder_f E2_InterfaceMessage_decode_aper;
+per_type_encoder_f E2_InterfaceMessage_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_InterfaceMessage_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceMessageType.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceMessageType.c
new file mode 100644
index 0000000..91d017a
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceMessageType.c
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_InterfaceMessageType.h"
+
+asn_TYPE_member_t asn_MBR_E2_InterfaceMessageType_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_InterfaceMessageType, procedureCode),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_ProcedureCode,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"procedureCode"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_InterfaceMessageType, typeOfMessage),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_TypeOfMessage,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"typeOfMessage"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_InterfaceMessageType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_InterfaceMessageType_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* typeOfMessage */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_InterfaceMessageType_specs_1 = {
+	sizeof(struct E2_InterfaceMessageType),
+	offsetof(struct E2_InterfaceMessageType, _asn_ctx),
+	asn_MAP_E2_InterfaceMessageType_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_InterfaceMessageType = {
+	"InterfaceMessageType",
+	"InterfaceMessageType",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_InterfaceMessageType_tags_1,
+	sizeof(asn_DEF_E2_InterfaceMessageType_tags_1)
+		/sizeof(asn_DEF_E2_InterfaceMessageType_tags_1[0]), /* 1 */
+	asn_DEF_E2_InterfaceMessageType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_InterfaceMessageType_tags_1)
+		/sizeof(asn_DEF_E2_InterfaceMessageType_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_InterfaceMessageType_1,
+	2,	/* Elements count */
+	&asn_SPC_E2_InterfaceMessageType_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceMessageType.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceMessageType.h
new file mode 100644
index 0000000..ac6eae9
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceMessageType.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_InterfaceMessageType_H_
+#define	_E2_InterfaceMessageType_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_ProcedureCode.h"
+#include "E2_TypeOfMessage.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_InterfaceMessageType */
+typedef struct E2_InterfaceMessageType {
+	E2_ProcedureCode_t	 procedureCode;
+	E2_TypeOfMessage_t	 typeOfMessage;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_InterfaceMessageType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_InterfaceMessageType;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_InterfaceMessageType_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_InterfaceMessageType_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_InterfaceMessageType_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-ID.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-ID.c
new file mode 100644
index 0000000..bb1aeae
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-ID.c
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_InterfaceProtocolIE-ID.h"
+
+int
+E2_InterfaceProtocolIE_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using E2_ProtocolIE_ID,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_E2_InterfaceProtocolIE_ID_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_E2_InterfaceProtocolIE_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_InterfaceProtocolIE_ID = {
+	"InterfaceProtocolIE-ID",
+	"InterfaceProtocolIE-ID",
+	&asn_OP_NativeInteger,
+	asn_DEF_E2_InterfaceProtocolIE_ID_tags_1,
+	sizeof(asn_DEF_E2_InterfaceProtocolIE_ID_tags_1)
+		/sizeof(asn_DEF_E2_InterfaceProtocolIE_ID_tags_1[0]), /* 1 */
+	asn_DEF_E2_InterfaceProtocolIE_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_InterfaceProtocolIE_ID_tags_1)
+		/sizeof(asn_DEF_E2_InterfaceProtocolIE_ID_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_E2_InterfaceProtocolIE_ID_constr_1, E2_InterfaceProtocolIE_ID_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-ID.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-ID.h
new file mode 100644
index 0000000..009a72c
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-ID.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_InterfaceProtocolIE_ID_H_
+#define	_E2_InterfaceProtocolIE_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_ProtocolIE-ID.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_InterfaceProtocolIE-ID */
+typedef E2_ProtocolIE_ID_t	 E2_InterfaceProtocolIE_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E2_InterfaceProtocolIE_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E2_InterfaceProtocolIE_ID;
+asn_struct_free_f E2_InterfaceProtocolIE_ID_free;
+asn_struct_print_f E2_InterfaceProtocolIE_ID_print;
+asn_constr_check_f E2_InterfaceProtocolIE_ID_constraint;
+ber_type_decoder_f E2_InterfaceProtocolIE_ID_decode_ber;
+der_type_encoder_f E2_InterfaceProtocolIE_ID_encode_der;
+xer_type_decoder_f E2_InterfaceProtocolIE_ID_decode_xer;
+xer_type_encoder_f E2_InterfaceProtocolIE_ID_encode_xer;
+per_type_decoder_f E2_InterfaceProtocolIE_ID_decode_uper;
+per_type_encoder_f E2_InterfaceProtocolIE_ID_encode_uper;
+per_type_decoder_f E2_InterfaceProtocolIE_ID_decode_aper;
+per_type_encoder_f E2_InterfaceProtocolIE_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_InterfaceProtocolIE_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Item.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Item.c
new file mode 100644
index 0000000..662c200
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Item.c
@@ -0,0 +1,70 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_InterfaceProtocolIE-Item.h"
+
+asn_TYPE_member_t asn_MBR_E2_InterfaceProtocolIE_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_InterfaceProtocolIE_Item, interfaceProtocolIE_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_InterfaceProtocolIE_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"interfaceProtocolIE-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_InterfaceProtocolIE_Item, interfaceProtocolIE_Test),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_InterfaceProtocolIE_Test,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"interfaceProtocolIE-Test"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_InterfaceProtocolIE_Item, interfaceProtocolIE_Value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_E2_InterfaceProtocolIE_Value,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"interfaceProtocolIE-Value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_InterfaceProtocolIE_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_InterfaceProtocolIE_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* interfaceProtocolIE-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* interfaceProtocolIE-Test */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* interfaceProtocolIE-Value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_InterfaceProtocolIE_Item_specs_1 = {
+	sizeof(struct E2_InterfaceProtocolIE_Item),
+	offsetof(struct E2_InterfaceProtocolIE_Item, _asn_ctx),
+	asn_MAP_E2_InterfaceProtocolIE_Item_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	3,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_InterfaceProtocolIE_Item = {
+	"InterfaceProtocolIE-Item",
+	"InterfaceProtocolIE-Item",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_InterfaceProtocolIE_Item_tags_1,
+	sizeof(asn_DEF_E2_InterfaceProtocolIE_Item_tags_1)
+		/sizeof(asn_DEF_E2_InterfaceProtocolIE_Item_tags_1[0]), /* 1 */
+	asn_DEF_E2_InterfaceProtocolIE_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_InterfaceProtocolIE_Item_tags_1)
+		/sizeof(asn_DEF_E2_InterfaceProtocolIE_Item_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_InterfaceProtocolIE_Item_1,
+	3,	/* Elements count */
+	&asn_SPC_E2_InterfaceProtocolIE_Item_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Item.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Item.h
new file mode 100644
index 0000000..9401cc5
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Item.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_InterfaceProtocolIE_Item_H_
+#define	_E2_InterfaceProtocolIE_Item_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_InterfaceProtocolIE-ID.h"
+#include "E2_InterfaceProtocolIE-Test.h"
+#include "E2_InterfaceProtocolIE-Value.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_InterfaceProtocolIE-Item */
+typedef struct E2_InterfaceProtocolIE_Item {
+	E2_InterfaceProtocolIE_ID_t	 interfaceProtocolIE_ID;
+	E2_InterfaceProtocolIE_Test_t	 interfaceProtocolIE_Test;
+	E2_InterfaceProtocolIE_Value_t	 interfaceProtocolIE_Value;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_InterfaceProtocolIE_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_InterfaceProtocolIE_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_InterfaceProtocolIE_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_InterfaceProtocolIE_Item_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_InterfaceProtocolIE_Item_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Test.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Test.c
new file mode 100644
index 0000000..5ce8aec
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Test.c
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_InterfaceProtocolIE-Test.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_E2_InterfaceProtocolIE_Test_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  4 }	/* (0..4,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_E2_InterfaceProtocolIE_Test_value2enum_1[] = {
+	{ 0,	5,	"equal" },
+	{ 1,	11,	"greaterthan" },
+	{ 2,	8,	"lessthan" },
+	{ 3,	8,	"contains" },
+	{ 4,	7,	"present" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_E2_InterfaceProtocolIE_Test_enum2value_1[] = {
+	3,	/* contains(3) */
+	0,	/* equal(0) */
+	1,	/* greaterthan(1) */
+	2,	/* lessthan(2) */
+	4	/* present(4) */
+	/* This list is extensible */
+};
+const asn_INTEGER_specifics_t asn_SPC_E2_InterfaceProtocolIE_Test_specs_1 = {
+	asn_MAP_E2_InterfaceProtocolIE_Test_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_E2_InterfaceProtocolIE_Test_enum2value_1,	/* N => "tag"; sorted by N */
+	5,	/* Number of elements in the maps */
+	6,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_E2_InterfaceProtocolIE_Test_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_InterfaceProtocolIE_Test = {
+	"InterfaceProtocolIE-Test",
+	"InterfaceProtocolIE-Test",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_E2_InterfaceProtocolIE_Test_tags_1,
+	sizeof(asn_DEF_E2_InterfaceProtocolIE_Test_tags_1)
+		/sizeof(asn_DEF_E2_InterfaceProtocolIE_Test_tags_1[0]), /* 1 */
+	asn_DEF_E2_InterfaceProtocolIE_Test_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_InterfaceProtocolIE_Test_tags_1)
+		/sizeof(asn_DEF_E2_InterfaceProtocolIE_Test_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_E2_InterfaceProtocolIE_Test_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_E2_InterfaceProtocolIE_Test_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Test.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Test.h
new file mode 100644
index 0000000..3711389
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Test.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_InterfaceProtocolIE_Test_H_
+#define	_E2_InterfaceProtocolIE_Test_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_InterfaceProtocolIE_Test {
+	E2_InterfaceProtocolIE_Test_equal	= 0,
+	E2_InterfaceProtocolIE_Test_greaterthan	= 1,
+	E2_InterfaceProtocolIE_Test_lessthan	= 2,
+	E2_InterfaceProtocolIE_Test_contains	= 3,
+	E2_InterfaceProtocolIE_Test_present	= 4
+	/*
+	 * Enumeration is extensible
+	 */
+} e_E2_InterfaceProtocolIE_Test;
+
+/* E2_InterfaceProtocolIE-Test */
+typedef long	 E2_InterfaceProtocolIE_Test_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E2_InterfaceProtocolIE_Test_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E2_InterfaceProtocolIE_Test;
+extern const asn_INTEGER_specifics_t asn_SPC_InterfaceProtocolIE_Test_specs_1;
+asn_struct_free_f InterfaceProtocolIE_Test_free;
+asn_struct_print_f InterfaceProtocolIE_Test_print;
+asn_constr_check_f InterfaceProtocolIE_Test_constraint;
+ber_type_decoder_f InterfaceProtocolIE_Test_decode_ber;
+der_type_encoder_f InterfaceProtocolIE_Test_encode_der;
+xer_type_decoder_f InterfaceProtocolIE_Test_decode_xer;
+xer_type_encoder_f InterfaceProtocolIE_Test_encode_xer;
+per_type_decoder_f InterfaceProtocolIE_Test_decode_uper;
+per_type_encoder_f InterfaceProtocolIE_Test_encode_uper;
+per_type_decoder_f InterfaceProtocolIE_Test_decode_aper;
+per_type_encoder_f InterfaceProtocolIE_Test_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_InterfaceProtocolIE_Test_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Value.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Value.c
new file mode 100644
index 0000000..6b019c0
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Value.c
@@ -0,0 +1,92 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_InterfaceProtocolIE-Value.h"
+
+asn_per_constraints_t asn_PER_type_E2_InterfaceProtocolIE_Value_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  4 }	/* (0..4,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+asn_TYPE_member_t asn_MBR_E2_InterfaceProtocolIE_Value_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_InterfaceProtocolIE_Value, choice.valueInt),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valueInt"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_InterfaceProtocolIE_Value, choice.valueEnum),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valueEnum"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_InterfaceProtocolIE_Value, choice.valueBool),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BOOLEAN,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valueBool"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_InterfaceProtocolIE_Value, choice.valueBitS),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valueBitS"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_InterfaceProtocolIE_Value, choice.valueOctS),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_OCTET_STRING,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valueOctS"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_InterfaceProtocolIE_Value_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* valueInt */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* valueEnum */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* valueBool */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* valueBitS */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* valueOctS */
+};
+asn_CHOICE_specifics_t asn_SPC_E2_InterfaceProtocolIE_Value_specs_1 = {
+	sizeof(struct E2_InterfaceProtocolIE_Value),
+	offsetof(struct E2_InterfaceProtocolIE_Value, _asn_ctx),
+	offsetof(struct E2_InterfaceProtocolIE_Value, present),
+	sizeof(((struct E2_InterfaceProtocolIE_Value *)0)->present),
+	asn_MAP_E2_InterfaceProtocolIE_Value_tag2el_1,
+	5,	/* Count of tags in the map */
+	0, 0,
+	5	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_InterfaceProtocolIE_Value = {
+	"InterfaceProtocolIE-Value",
+	"InterfaceProtocolIE-Value",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_E2_InterfaceProtocolIE_Value_constr_1, CHOICE_constraint },
+	asn_MBR_E2_InterfaceProtocolIE_Value_1,
+	5,	/* Elements count */
+	&asn_SPC_E2_InterfaceProtocolIE_Value_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Value.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Value.h
new file mode 100644
index 0000000..1e56e6f
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_InterfaceProtocolIE-Value.h
@@ -0,0 +1,67 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_InterfaceProtocolIE_Value_H_
+#define	_E2_InterfaceProtocolIE_Value_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+#include "BOOLEAN.h"
+#include "BIT_STRING.h"
+#include "OCTET_STRING.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_InterfaceProtocolIE_Value_PR {
+	E2_InterfaceProtocolIE_Value_PR_NOTHING,	/* No components present */
+	E2_InterfaceProtocolIE_Value_PR_valueInt,
+	E2_InterfaceProtocolIE_Value_PR_valueEnum,
+	E2_InterfaceProtocolIE_Value_PR_valueBool,
+	E2_InterfaceProtocolIE_Value_PR_valueBitS,
+	E2_InterfaceProtocolIE_Value_PR_valueOctS
+	/* Extensions may appear below */
+	
+} E2_InterfaceProtocolIE_Value_PR;
+
+/* E2_InterfaceProtocolIE-Value */
+typedef struct E2_InterfaceProtocolIE_Value {
+	E2_InterfaceProtocolIE_Value_PR present;
+	union E2_InterfaceProtocolIE_Value_u {
+		long	 valueInt;
+		long	 valueEnum;
+		BOOLEAN_t	 valueBool;
+		BIT_STRING_t	 valueBitS;
+		OCTET_STRING_t	 valueOctS;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_InterfaceProtocolIE_Value_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_InterfaceProtocolIE_Value;
+extern asn_CHOICE_specifics_t asn_SPC_E2_InterfaceProtocolIE_Value_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_InterfaceProtocolIE_Value_1[5];
+extern asn_per_constraints_t asn_PER_type_E2_InterfaceProtocolIE_Value_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_InterfaceProtocolIE_Value_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_PLMN-Identity.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_PLMN-Identity.c
new file mode 100644
index 0000000..815aca8
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_PLMN-Identity.c
@@ -0,0 +1,62 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_PLMN-Identity.h"
+
+int
+E2_PLMN_Identity_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 3)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_E2_PLMN_Identity_constr_1 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  3,  3 }	/* (SIZE(3..3)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_E2_PLMN_Identity_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_PLMN_Identity = {
+	"PLMN-Identity",
+	"PLMN-Identity",
+	&asn_OP_OCTET_STRING,
+	asn_DEF_E2_PLMN_Identity_tags_1,
+	sizeof(asn_DEF_E2_PLMN_Identity_tags_1)
+		/sizeof(asn_DEF_E2_PLMN_Identity_tags_1[0]), /* 1 */
+	asn_DEF_E2_PLMN_Identity_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_PLMN_Identity_tags_1)
+		/sizeof(asn_DEF_E2_PLMN_Identity_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_E2_PLMN_Identity_constr_1, E2_PLMN_Identity_constraint },
+	0, 0,	/* No members */
+	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_PLMN-Identity.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_PLMN-Identity.h
new file mode 100644
index 0000000..58be608
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_PLMN-Identity.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_PLMN_Identity_H_
+#define	_E2_PLMN_Identity_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "OCTET_STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_PLMN-Identity */
+typedef OCTET_STRING_t	 E2_PLMN_Identity_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E2_PLMN_Identity_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E2_PLMN_Identity;
+asn_struct_free_f E2_PLMN_Identity_free;
+asn_struct_print_f E2_PLMN_Identity_print;
+asn_constr_check_f E2_PLMN_Identity_constraint;
+ber_type_decoder_f E2_PLMN_Identity_decode_ber;
+der_type_encoder_f E2_PLMN_Identity_encode_der;
+xer_type_decoder_f E2_PLMN_Identity_decode_xer;
+xer_type_encoder_f E2_PLMN_Identity_encode_xer;
+per_type_decoder_f E2_PLMN_Identity_decode_uper;
+per_type_encoder_f E2_PLMN_Identity_encode_uper;
+per_type_decoder_f E2_PLMN_Identity_decode_aper;
+per_type_encoder_f E2_PLMN_Identity_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_PLMN_Identity_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Presence.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Presence.c
new file mode 100644
index 0000000..8c55c04
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Presence.c
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_Presence.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static asn_per_constraints_t asn_PER_type_E2_Presence_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_E2_Presence_value2enum_1[] = {
+	{ 0,	8,	"optional" },
+	{ 1,	11,	"conditional" },
+	{ 2,	9,	"mandatory" }
+};
+static const unsigned int asn_MAP_E2_Presence_enum2value_1[] = {
+	1,	/* conditional(1) */
+	2,	/* mandatory(2) */
+	0	/* optional(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_E2_Presence_specs_1 = {
+	asn_MAP_E2_Presence_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_E2_Presence_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_E2_Presence_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_Presence = {
+	"Presence",
+	"Presence",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_E2_Presence_tags_1,
+	sizeof(asn_DEF_E2_Presence_tags_1)
+		/sizeof(asn_DEF_E2_Presence_tags_1[0]), /* 1 */
+	asn_DEF_E2_Presence_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_Presence_tags_1)
+		/sizeof(asn_DEF_E2_Presence_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_E2_Presence_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_E2_Presence_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Presence.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Presence.h
new file mode 100644
index 0000000..c82f601
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Presence.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_Presence_H_
+#define	_E2_Presence_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_Presence {
+	E2_Presence_optional	= 0,
+	E2_Presence_conditional	= 1,
+	E2_Presence_mandatory	= 2
+} e_E2_Presence;
+
+/* E2_Presence */
+typedef long	 E2_Presence_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_Presence;
+asn_struct_free_f E2_Presence_free;
+asn_struct_print_f E2_Presence_print;
+asn_constr_check_f E2_Presence_constraint;
+ber_type_decoder_f E2_Presence_decode_ber;
+der_type_encoder_f E2_Presence_encode_der;
+xer_type_decoder_f E2_Presence_decode_xer;
+xer_type_encoder_f E2_Presence_encode_xer;
+per_type_decoder_f E2_Presence_decode_uper;
+per_type_encoder_f E2_Presence_encode_uper;
+per_type_decoder_f E2_Presence_decode_aper;
+per_type_encoder_f E2_Presence_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_Presence_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ProcedureCode.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ProcedureCode.c
new file mode 100644
index 0000000..c12a5f7
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ProcedureCode.c
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_ProcedureCode.h"
+
+int
+E2_ProcedureCode_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 255)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_E2_ProcedureCode_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0,  255 }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_E2_ProcedureCode_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_ProcedureCode = {
+	"ProcedureCode",
+	"ProcedureCode",
+	&asn_OP_NativeInteger,
+	asn_DEF_E2_ProcedureCode_tags_1,
+	sizeof(asn_DEF_E2_ProcedureCode_tags_1)
+		/sizeof(asn_DEF_E2_ProcedureCode_tags_1[0]), /* 1 */
+	asn_DEF_E2_ProcedureCode_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_ProcedureCode_tags_1)
+		/sizeof(asn_DEF_E2_ProcedureCode_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_E2_ProcedureCode_constr_1, E2_ProcedureCode_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ProcedureCode.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ProcedureCode.h
new file mode 100644
index 0000000..ec8b77a
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ProcedureCode.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_ProcedureCode_H_
+#define	_E2_ProcedureCode_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_ProcedureCode */
+typedef long	 E2_ProcedureCode_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E2_ProcedureCode_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E2_ProcedureCode;
+asn_struct_free_f E2_ProcedureCode_free;
+asn_struct_print_f E2_ProcedureCode_print;
+asn_constr_check_f E2_ProcedureCode_constraint;
+ber_type_decoder_f E2_ProcedureCode_decode_ber;
+der_type_encoder_f E2_ProcedureCode_encode_der;
+xer_type_decoder_f E2_ProcedureCode_decode_xer;
+xer_type_encoder_f E2_ProcedureCode_encode_xer;
+per_type_decoder_f E2_ProcedureCode_decode_uper;
+per_type_encoder_f E2_ProcedureCode_encode_uper;
+per_type_decoder_f E2_ProcedureCode_decode_aper;
+per_type_encoder_f E2_ProcedureCode_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_ProcedureCode_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ProtocolIE-ID.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ProtocolIE-ID.c
new file mode 100644
index 0000000..6d57747
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ProtocolIE-ID.c
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_ProtocolIE-ID.h"
+
+int
+E2_ProtocolIE_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 65535)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_E2_ProtocolIE_ID_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_E2_ProtocolIE_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_ProtocolIE_ID = {
+	"ProtocolIE-ID",
+	"ProtocolIE-ID",
+	&asn_OP_NativeInteger,
+	asn_DEF_E2_ProtocolIE_ID_tags_1,
+	sizeof(asn_DEF_E2_ProtocolIE_ID_tags_1)
+		/sizeof(asn_DEF_E2_ProtocolIE_ID_tags_1[0]), /* 1 */
+	asn_DEF_E2_ProtocolIE_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_ProtocolIE_ID_tags_1)
+		/sizeof(asn_DEF_E2_ProtocolIE_ID_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_E2_ProtocolIE_ID_constr_1, E2_ProtocolIE_ID_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ProtocolIE-ID.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ProtocolIE-ID.h
new file mode 100644
index 0000000..1b7e5fa
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_ProtocolIE-ID.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_ProtocolIE_ID_H_
+#define	_E2_ProtocolIE_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_ProtocolIE-ID */
+typedef long	 E2_ProtocolIE_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E2_ProtocolIE_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E2_ProtocolIE_ID;
+asn_struct_free_f E2_ProtocolIE_ID_free;
+asn_struct_print_f E2_ProtocolIE_ID_print;
+asn_constr_check_f E2_ProtocolIE_ID_constraint;
+ber_type_decoder_f E2_ProtocolIE_ID_decode_ber;
+der_type_encoder_f E2_ProtocolIE_ID_encode_der;
+xer_type_decoder_f E2_ProtocolIE_ID_decode_xer;
+xer_type_encoder_f E2_ProtocolIE_ID_encode_xer;
+per_type_decoder_f E2_ProtocolIE_ID_decode_uper;
+per_type_encoder_f E2_ProtocolIE_ID_encode_uper;
+per_type_decoder_f E2_ProtocolIE_ID_decode_aper;
+per_type_encoder_f E2_ProtocolIE_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_ProtocolIE_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-ID.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-ID.c
new file mode 100644
index 0000000..95e574a
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-ID.c
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_RANParameter-ID.h"
+
+int
+E2_RANParameter_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0 && value <= 255)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_E2_RANParameter_ID_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0,  255 }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_E2_RANParameter_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_RANParameter_ID = {
+	"RANParameter-ID",
+	"RANParameter-ID",
+	&asn_OP_NativeInteger,
+	asn_DEF_E2_RANParameter_ID_tags_1,
+	sizeof(asn_DEF_E2_RANParameter_ID_tags_1)
+		/sizeof(asn_DEF_E2_RANParameter_ID_tags_1[0]), /* 1 */
+	asn_DEF_E2_RANParameter_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_RANParameter_ID_tags_1)
+		/sizeof(asn_DEF_E2_RANParameter_ID_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_E2_RANParameter_ID_constr_1, E2_RANParameter_ID_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-ID.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-ID.h
new file mode 100644
index 0000000..b5d8fbb
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-ID.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_RANParameter_ID_H_
+#define	_E2_RANParameter_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_RANParameter-ID */
+typedef long	 E2_RANParameter_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E2_RANParameter_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E2_RANParameter_ID;
+asn_struct_free_f E2_RANParameter_ID_free;
+asn_struct_print_f E2_RANParameter_ID_print;
+asn_constr_check_f E2_RANParameter_ID_constraint;
+ber_type_decoder_f E2_RANParameter_ID_decode_ber;
+der_type_encoder_f E2_RANParameter_ID_encode_der;
+xer_type_decoder_f E2_RANParameter_ID_decode_xer;
+xer_type_encoder_f E2_RANParameter_ID_encode_xer;
+per_type_decoder_f E2_RANParameter_ID_decode_uper;
+per_type_encoder_f E2_RANParameter_ID_encode_uper;
+per_type_decoder_f E2_RANParameter_ID_decode_aper;
+per_type_encoder_f E2_RANParameter_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_RANParameter_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Item.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Item.c
new file mode 100644
index 0000000..2196877
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Item.c
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_RANParameter-Item.h"
+
+asn_TYPE_member_t asn_MBR_E2_RANParameter_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_RANParameter_Item, ranParameter_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_RANParameter_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ranParameter-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_RANParameter_Item, ranParameter_Value),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_E2_RANParameter_Value,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ranParameter-Value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_RANParameter_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_RANParameter_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranParameter-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ranParameter-Value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_RANParameter_Item_specs_1 = {
+	sizeof(struct E2_RANParameter_Item),
+	offsetof(struct E2_RANParameter_Item, _asn_ctx),
+	asn_MAP_E2_RANParameter_Item_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_RANParameter_Item = {
+	"RANParameter-Item",
+	"RANParameter-Item",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_RANParameter_Item_tags_1,
+	sizeof(asn_DEF_E2_RANParameter_Item_tags_1)
+		/sizeof(asn_DEF_E2_RANParameter_Item_tags_1[0]), /* 1 */
+	asn_DEF_E2_RANParameter_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_RANParameter_Item_tags_1)
+		/sizeof(asn_DEF_E2_RANParameter_Item_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_RANParameter_Item_1,
+	2,	/* Elements count */
+	&asn_SPC_E2_RANParameter_Item_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Item.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Item.h
new file mode 100644
index 0000000..440194d
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Item.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_RANParameter_Item_H_
+#define	_E2_RANParameter_Item_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_RANParameter-ID.h"
+#include "E2_RANParameter-Value.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_RANParameter-Item */
+typedef struct E2_RANParameter_Item {
+	E2_RANParameter_ID_t	 ranParameter_ID;
+	E2_RANParameter_Value_t	 ranParameter_Value;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_RANParameter_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_RANParameter_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_RANParameter_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_RANParameter_Item_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_RANParameter_Item_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Test.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Test.c
new file mode 100644
index 0000000..b8e8305
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Test.c
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_RANParameter-Test.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_E2_RANParameter_Test_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  4 }	/* (0..4,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_E2_RANParameter_Test_value2enum_1[] = {
+	{ 0,	5,	"equal" },
+	{ 1,	11,	"greaterthan" },
+	{ 2,	8,	"lessthan" },
+	{ 3,	8,	"contains" },
+	{ 4,	7,	"present" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_E2_RANParameter_Test_enum2value_1[] = {
+	3,	/* contains(3) */
+	0,	/* equal(0) */
+	1,	/* greaterthan(1) */
+	2,	/* lessthan(2) */
+	4	/* present(4) */
+	/* This list is extensible */
+};
+const asn_INTEGER_specifics_t asn_SPC_E2_RANParameter_Test_specs_1 = {
+	asn_MAP_E2_RANParameter_Test_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_E2_RANParameter_Test_enum2value_1,	/* N => "tag"; sorted by N */
+	5,	/* Number of elements in the maps */
+	6,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_E2_RANParameter_Test_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_RANParameter_Test = {
+	"RANParameter-Test",
+	"RANParameter-Test",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_E2_RANParameter_Test_tags_1,
+	sizeof(asn_DEF_E2_RANParameter_Test_tags_1)
+		/sizeof(asn_DEF_E2_RANParameter_Test_tags_1[0]), /* 1 */
+	asn_DEF_E2_RANParameter_Test_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_RANParameter_Test_tags_1)
+		/sizeof(asn_DEF_E2_RANParameter_Test_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_E2_RANParameter_Test_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_E2_RANParameter_Test_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Test.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Test.h
new file mode 100644
index 0000000..b026fff
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Test.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_RANParameter_Test_H_
+#define	_E2_RANParameter_Test_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_RANParameter_Test {
+	E2_RANParameter_Test_equal	= 0,
+	E2_RANParameter_Test_greaterthan	= 1,
+	E2_RANParameter_Test_lessthan	= 2,
+	E2_RANParameter_Test_contains	= 3,
+	E2_RANParameter_Test_present	= 4
+	/*
+	 * Enumeration is extensible
+	 */
+} e_E2_RANParameter_Test;
+
+/* E2_RANParameter-Test */
+typedef long	 E2_RANParameter_Test_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E2_RANParameter_Test_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E2_RANParameter_Test;
+extern const asn_INTEGER_specifics_t asn_SPC_RANParameter_Test_specs_1;
+asn_struct_free_f RANParameter_Test_free;
+asn_struct_print_f RANParameter_Test_print;
+asn_constr_check_f RANParameter_Test_constraint;
+ber_type_decoder_f RANParameter_Test_decode_ber;
+der_type_encoder_f RANParameter_Test_encode_der;
+xer_type_decoder_f RANParameter_Test_decode_xer;
+xer_type_encoder_f RANParameter_Test_encode_xer;
+per_type_decoder_f RANParameter_Test_decode_uper;
+per_type_encoder_f RANParameter_Test_encode_uper;
+per_type_decoder_f RANParameter_Test_decode_aper;
+per_type_encoder_f RANParameter_Test_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_RANParameter_Test_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Value.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Value.c
new file mode 100644
index 0000000..bb7d320
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Value.c
@@ -0,0 +1,102 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_RANParameter-Value.h"
+
+asn_per_constraints_t asn_PER_type_E2_RANParameter_Value_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  5 }	/* (0..5,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+asn_TYPE_member_t asn_MBR_E2_RANParameter_Value_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_RANParameter_Value, choice.valueInt),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valueInt"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_RANParameter_Value, choice.valueEnum),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valueEnum"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_RANParameter_Value, choice.valueBool),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BOOLEAN,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valueBool"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_RANParameter_Value, choice.valueBitS),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valueBitS"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_RANParameter_Value, choice.valueOctS),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_OCTET_STRING,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valueOctS"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_RANParameter_Value, choice.valuePrtS),
+		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_PrintableString,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"valuePrtS"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_RANParameter_Value_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* valueInt */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* valueEnum */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* valueBool */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* valueBitS */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* valueOctS */
+    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* valuePrtS */
+};
+asn_CHOICE_specifics_t asn_SPC_E2_RANParameter_Value_specs_1 = {
+	sizeof(struct E2_RANParameter_Value),
+	offsetof(struct E2_RANParameter_Value, _asn_ctx),
+	offsetof(struct E2_RANParameter_Value, present),
+	sizeof(((struct E2_RANParameter_Value *)0)->present),
+	asn_MAP_E2_RANParameter_Value_tag2el_1,
+	6,	/* Count of tags in the map */
+	0, 0,
+	6	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_RANParameter_Value = {
+	"RANParameter-Value",
+	"RANParameter-Value",
+	&asn_OP_CHOICE,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	{ 0, &asn_PER_type_E2_RANParameter_Value_constr_1, CHOICE_constraint },
+	asn_MBR_E2_RANParameter_Value_1,
+	6,	/* Elements count */
+	&asn_SPC_E2_RANParameter_Value_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Value.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Value.h
new file mode 100644
index 0000000..2988122
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANParameter-Value.h
@@ -0,0 +1,70 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_RANParameter_Value_H_
+#define	_E2_RANParameter_Value_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+#include "BOOLEAN.h"
+#include "BIT_STRING.h"
+#include "OCTET_STRING.h"
+#include "PrintableString.h"
+#include "constr_CHOICE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_RANParameter_Value_PR {
+	E2_RANParameter_Value_PR_NOTHING,	/* No components present */
+	E2_RANParameter_Value_PR_valueInt,
+	E2_RANParameter_Value_PR_valueEnum,
+	E2_RANParameter_Value_PR_valueBool,
+	E2_RANParameter_Value_PR_valueBitS,
+	E2_RANParameter_Value_PR_valueOctS,
+	E2_RANParameter_Value_PR_valuePrtS
+	/* Extensions may appear below */
+	
+} E2_RANParameter_Value_PR;
+
+/* E2_RANParameter-Value */
+typedef struct E2_RANParameter_Value {
+	E2_RANParameter_Value_PR present;
+	union E2_RANParameter_Value_u {
+		long	 valueInt;
+		long	 valueEnum;
+		BOOLEAN_t	 valueBool;
+		BIT_STRING_t	 valueBitS;
+		OCTET_STRING_t	 valueOctS;
+		PrintableString_t	 valuePrtS;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_RANParameter_Value_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_RANParameter_Value;
+extern asn_CHOICE_specifics_t asn_SPC_E2_RANParameter_Value_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_RANParameter_Value_1[6];
+extern asn_per_constraints_t asn_PER_type_E2_RANParameter_Value_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_RANParameter_Value_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANimperativePolicy.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANimperativePolicy.c
new file mode 100644
index 0000000..5f149eb
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANimperativePolicy.c
@@ -0,0 +1,126 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_RANimperativePolicy.h"
+
+#include "E2_RANParameter-Item.h"
+static int
+memb_E2_ranImperativePolicy_List_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size >= 1 && size <= 255)) {
+		/* Perform validation of the inner elements */
+		return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_E2_ranImperativePolicy_List_constr_2 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1,  255 }	/* (SIZE(1..255)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_E2_ranImperativePolicy_List_constr_2 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1,  255 }	/* (SIZE(1..255)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_E2_ranImperativePolicy_List_2[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_E2_RANParameter_Item,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_ranImperativePolicy_List_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_E2_ranImperativePolicy_List_specs_2 = {
+	sizeof(struct E2_RANimperativePolicy__ranImperativePolicy_List),
+	offsetof(struct E2_RANimperativePolicy__ranImperativePolicy_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_E2_ranImperativePolicy_List_2 = {
+	"ranImperativePolicy-List",
+	"ranImperativePolicy-List",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_E2_ranImperativePolicy_List_tags_2,
+	sizeof(asn_DEF_E2_ranImperativePolicy_List_tags_2)
+		/sizeof(asn_DEF_E2_ranImperativePolicy_List_tags_2[0]) - 1, /* 1 */
+	asn_DEF_E2_ranImperativePolicy_List_tags_2,	/* Same as above */
+	sizeof(asn_DEF_E2_ranImperativePolicy_List_tags_2)
+		/sizeof(asn_DEF_E2_ranImperativePolicy_List_tags_2[0]), /* 2 */
+	{ 0, &asn_PER_type_E2_ranImperativePolicy_List_constr_2, SEQUENCE_OF_constraint },
+	asn_MBR_E2_ranImperativePolicy_List_2,
+	1,	/* Single element */
+	&asn_SPC_E2_ranImperativePolicy_List_specs_2	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_E2_RANimperativePolicy_1[] = {
+	{ ATF_POINTER, 1, offsetof(struct E2_RANimperativePolicy, ranImperativePolicy_List),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_E2_ranImperativePolicy_List_2,
+		0,
+		{ 0, &asn_PER_memb_E2_ranImperativePolicy_List_constr_2,  memb_E2_ranImperativePolicy_List_constraint_1 },
+		0, 0, /* No default value */
+		"ranImperativePolicy-List"
+		},
+};
+static const int asn_MAP_E2_RANimperativePolicy_oms_1[] = { 0 };
+static const ber_tlv_tag_t asn_DEF_E2_RANimperativePolicy_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_RANimperativePolicy_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* ranImperativePolicy-List */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_RANimperativePolicy_specs_1 = {
+	sizeof(struct E2_RANimperativePolicy),
+	offsetof(struct E2_RANimperativePolicy, _asn_ctx),
+	asn_MAP_E2_RANimperativePolicy_tag2el_1,
+	1,	/* Count of tags in the map */
+	asn_MAP_E2_RANimperativePolicy_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_RANimperativePolicy = {
+	"RANimperativePolicy",
+	"RANimperativePolicy",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_RANimperativePolicy_tags_1,
+	sizeof(asn_DEF_E2_RANimperativePolicy_tags_1)
+		/sizeof(asn_DEF_E2_RANimperativePolicy_tags_1[0]), /* 1 */
+	asn_DEF_E2_RANimperativePolicy_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_RANimperativePolicy_tags_1)
+		/sizeof(asn_DEF_E2_RANimperativePolicy_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_RANimperativePolicy_1,
+	1,	/* Elements count */
+	&asn_SPC_E2_RANimperativePolicy_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANimperativePolicy.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANimperativePolicy.h
new file mode 100644
index 0000000..de13ea0
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANimperativePolicy.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_RANimperativePolicy_H_
+#define	_E2_RANimperativePolicy_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "asn_SEQUENCE_OF.h"
+#include "constr_SEQUENCE_OF.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct E2_RANParameter_Item;
+
+/* E2_RANimperativePolicy */
+typedef struct E2_RANimperativePolicy {
+	struct E2_RANimperativePolicy__ranImperativePolicy_List {
+		A_SEQUENCE_OF(struct E2_RANParameter_Item) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} *ranImperativePolicy_List;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_RANimperativePolicy_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_RANimperativePolicy;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_RANimperativePolicy_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_RANimperativePolicy_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_RANimperativePolicy_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroup-Item.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroup-Item.c
new file mode 100644
index 0000000..081bdaf
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroup-Item.c
@@ -0,0 +1,70 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_RANueGroup-Item.h"
+
+asn_TYPE_member_t asn_MBR_E2_RANueGroup_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_RANueGroup_Item, ranUEgroupID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_RANueGroupID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ranUEgroupID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_RANueGroup_Item, ranUEgroupDefinition),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_RANueGroupDefinition,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ranUEgroupDefinition"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_RANueGroup_Item, ranPolicy),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_RANimperativePolicy,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ranPolicy"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_RANueGroup_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_RANueGroup_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranUEgroupID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ranUEgroupDefinition */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ranPolicy */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_RANueGroup_Item_specs_1 = {
+	sizeof(struct E2_RANueGroup_Item),
+	offsetof(struct E2_RANueGroup_Item, _asn_ctx),
+	asn_MAP_E2_RANueGroup_Item_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	3,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_RANueGroup_Item = {
+	"RANueGroup-Item",
+	"RANueGroup-Item",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_RANueGroup_Item_tags_1,
+	sizeof(asn_DEF_E2_RANueGroup_Item_tags_1)
+		/sizeof(asn_DEF_E2_RANueGroup_Item_tags_1[0]), /* 1 */
+	asn_DEF_E2_RANueGroup_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_RANueGroup_Item_tags_1)
+		/sizeof(asn_DEF_E2_RANueGroup_Item_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_RANueGroup_Item_1,
+	3,	/* Elements count */
+	&asn_SPC_E2_RANueGroup_Item_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroup-Item.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroup-Item.h
new file mode 100644
index 0000000..0db6bae
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroup-Item.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_RANueGroup_Item_H_
+#define	_E2_RANueGroup_Item_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_RANueGroupID.h"
+#include "E2_RANueGroupDefinition.h"
+#include "E2_RANimperativePolicy.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_RANueGroup-Item */
+typedef struct E2_RANueGroup_Item {
+	E2_RANueGroupID_t	 ranUEgroupID;
+	E2_RANueGroupDefinition_t	 ranUEgroupDefinition;
+	E2_RANimperativePolicy_t	 ranPolicy;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_RANueGroup_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_RANueGroup_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_RANueGroup_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_RANueGroup_Item_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_RANueGroup_Item_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupDef-Item.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupDef-Item.c
new file mode 100644
index 0000000..fd923de
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupDef-Item.c
@@ -0,0 +1,70 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_RANueGroupDef-Item.h"
+
+asn_TYPE_member_t asn_MBR_E2_RANueGroupDef_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_RANueGroupDef_Item, ranParameter_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_RANParameter_ID,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ranParameter-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_RANueGroupDef_Item, ranParameter_Test),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_E2_RANParameter_Test,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ranParameter-Test"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct E2_RANueGroupDef_Item, ranParameter_Value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_E2_RANParameter_Value,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		"ranParameter-Value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_RANueGroupDef_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_RANueGroupDef_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranParameter-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ranParameter-Test */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ranParameter-Value */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_RANueGroupDef_Item_specs_1 = {
+	sizeof(struct E2_RANueGroupDef_Item),
+	offsetof(struct E2_RANueGroupDef_Item, _asn_ctx),
+	asn_MAP_E2_RANueGroupDef_Item_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	3,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_RANueGroupDef_Item = {
+	"RANueGroupDef-Item",
+	"RANueGroupDef-Item",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_RANueGroupDef_Item_tags_1,
+	sizeof(asn_DEF_E2_RANueGroupDef_Item_tags_1)
+		/sizeof(asn_DEF_E2_RANueGroupDef_Item_tags_1[0]), /* 1 */
+	asn_DEF_E2_RANueGroupDef_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_RANueGroupDef_Item_tags_1)
+		/sizeof(asn_DEF_E2_RANueGroupDef_Item_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_RANueGroupDef_Item_1,
+	3,	/* Elements count */
+	&asn_SPC_E2_RANueGroupDef_Item_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupDef-Item.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupDef-Item.h
new file mode 100644
index 0000000..46d37e3
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupDef-Item.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_RANueGroupDef_Item_H_
+#define	_E2_RANueGroupDef_Item_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "E2_RANParameter-ID.h"
+#include "E2_RANParameter-Test.h"
+#include "E2_RANParameter-Value.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_RANueGroupDef-Item */
+typedef struct E2_RANueGroupDef_Item {
+	E2_RANParameter_ID_t	 ranParameter_ID;
+	E2_RANParameter_Test_t	 ranParameter_Test;
+	E2_RANParameter_Value_t	 ranParameter_Value;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_RANueGroupDef_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_RANueGroupDef_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_RANueGroupDef_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_RANueGroupDef_Item_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_RANueGroupDef_Item_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupDefinition.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupDefinition.c
new file mode 100644
index 0000000..4dff0ad
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupDefinition.c
@@ -0,0 +1,126 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_RANueGroupDefinition.h"
+
+#include "E2_RANueGroupDef-Item.h"
+static int
+memb_E2_ranUEgroupDef_List_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size >= 1 && size <= 255)) {
+		/* Perform validation of the inner elements */
+		return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_E2_ranUEgroupDef_List_constr_2 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1,  255 }	/* (SIZE(1..255)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_E2_ranUEgroupDef_List_constr_2 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1,  255 }	/* (SIZE(1..255)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_E2_ranUEgroupDef_List_2[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_E2_RANueGroupDef_Item,
+		0,
+		{ 0, 0, 0 },
+		0, 0, /* No default value */
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_E2_ranUEgroupDef_List_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_E2_ranUEgroupDef_List_specs_2 = {
+	sizeof(struct E2_RANueGroupDefinition__ranUEgroupDef_List),
+	offsetof(struct E2_RANueGroupDefinition__ranUEgroupDef_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_E2_ranUEgroupDef_List_2 = {
+	"ranUEgroupDef-List",
+	"ranUEgroupDef-List",
+	&asn_OP_SEQUENCE_OF,
+	asn_DEF_E2_ranUEgroupDef_List_tags_2,
+	sizeof(asn_DEF_E2_ranUEgroupDef_List_tags_2)
+		/sizeof(asn_DEF_E2_ranUEgroupDef_List_tags_2[0]) - 1, /* 1 */
+	asn_DEF_E2_ranUEgroupDef_List_tags_2,	/* Same as above */
+	sizeof(asn_DEF_E2_ranUEgroupDef_List_tags_2)
+		/sizeof(asn_DEF_E2_ranUEgroupDef_List_tags_2[0]), /* 2 */
+	{ 0, &asn_PER_type_E2_ranUEgroupDef_List_constr_2, SEQUENCE_OF_constraint },
+	asn_MBR_E2_ranUEgroupDef_List_2,
+	1,	/* Single element */
+	&asn_SPC_E2_ranUEgroupDef_List_specs_2	/* Additional specs */
+};
+
+asn_TYPE_member_t asn_MBR_E2_RANueGroupDefinition_1[] = {
+	{ ATF_POINTER, 1, offsetof(struct E2_RANueGroupDefinition, ranUEgroupDef_List),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_E2_ranUEgroupDef_List_2,
+		0,
+		{ 0, &asn_PER_memb_E2_ranUEgroupDef_List_constr_2,  memb_E2_ranUEgroupDef_List_constraint_1 },
+		0, 0, /* No default value */
+		"ranUEgroupDef-List"
+		},
+};
+static const int asn_MAP_E2_RANueGroupDefinition_oms_1[] = { 0 };
+static const ber_tlv_tag_t asn_DEF_E2_RANueGroupDefinition_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_E2_RANueGroupDefinition_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* ranUEgroupDef-List */
+};
+asn_SEQUENCE_specifics_t asn_SPC_E2_RANueGroupDefinition_specs_1 = {
+	sizeof(struct E2_RANueGroupDefinition),
+	offsetof(struct E2_RANueGroupDefinition, _asn_ctx),
+	asn_MAP_E2_RANueGroupDefinition_tag2el_1,
+	1,	/* Count of tags in the map */
+	asn_MAP_E2_RANueGroupDefinition_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* First extension addition */
+};
+asn_TYPE_descriptor_t asn_DEF_E2_RANueGroupDefinition = {
+	"RANueGroupDefinition",
+	"RANueGroupDefinition",
+	&asn_OP_SEQUENCE,
+	asn_DEF_E2_RANueGroupDefinition_tags_1,
+	sizeof(asn_DEF_E2_RANueGroupDefinition_tags_1)
+		/sizeof(asn_DEF_E2_RANueGroupDefinition_tags_1[0]), /* 1 */
+	asn_DEF_E2_RANueGroupDefinition_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_RANueGroupDefinition_tags_1)
+		/sizeof(asn_DEF_E2_RANueGroupDefinition_tags_1[0]), /* 1 */
+	{ 0, 0, SEQUENCE_constraint },
+	asn_MBR_E2_RANueGroupDefinition_1,
+	1,	/* Elements count */
+	&asn_SPC_E2_RANueGroupDefinition_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupDefinition.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupDefinition.h
new file mode 100644
index 0000000..0fd1150
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupDefinition.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_RANueGroupDefinition_H_
+#define	_E2_RANueGroupDefinition_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "asn_SEQUENCE_OF.h"
+#include "constr_SEQUENCE_OF.h"
+#include "constr_SEQUENCE.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct E2_RANueGroupDef_Item;
+
+/* E2_RANueGroupDefinition */
+typedef struct E2_RANueGroupDefinition {
+	struct E2_RANueGroupDefinition__ranUEgroupDef_List {
+		A_SEQUENCE_OF(struct E2_RANueGroupDef_Item) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} *ranUEgroupDef_List;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E2_RANueGroupDefinition_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_RANueGroupDefinition;
+extern asn_SEQUENCE_specifics_t asn_SPC_E2_RANueGroupDefinition_specs_1;
+extern asn_TYPE_member_t asn_MBR_E2_RANueGroupDefinition_1[1];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_RANueGroupDefinition_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupID.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupID.c
new file mode 100644
index 0000000..b849661
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupID.c
@@ -0,0 +1,31 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_RANueGroupID.h"
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static const ber_tlv_tag_t asn_DEF_E2_RANueGroupID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_RANueGroupID = {
+	"RANueGroupID",
+	"RANueGroupID",
+	&asn_OP_NativeInteger,
+	asn_DEF_E2_RANueGroupID_tags_1,
+	sizeof(asn_DEF_E2_RANueGroupID_tags_1)
+		/sizeof(asn_DEF_E2_RANueGroupID_tags_1[0]), /* 1 */
+	asn_DEF_E2_RANueGroupID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_RANueGroupID_tags_1)
+		/sizeof(asn_DEF_E2_RANueGroupID_tags_1[0]), /* 1 */
+	{ 0, 0, NativeInteger_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupID.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupID.h
new file mode 100644
index 0000000..3238314
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_RANueGroupID.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_RANueGroupID_H_
+#define	_E2_RANueGroupID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_RANueGroupID */
+typedef long	 E2_RANueGroupID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_RANueGroupID;
+asn_struct_free_f E2_RANueGroupID_free;
+asn_struct_print_f E2_RANueGroupID_print;
+asn_constr_check_f E2_RANueGroupID_constraint;
+ber_type_decoder_f E2_RANueGroupID_decode_ber;
+der_type_encoder_f E2_RANueGroupID_encode_der;
+xer_type_decoder_f E2_RANueGroupID_decode_xer;
+xer_type_encoder_f E2_RANueGroupID_encode_xer;
+per_type_decoder_f E2_RANueGroupID_decode_uper;
+per_type_encoder_f E2_RANueGroupID_encode_uper;
+per_type_decoder_f E2_RANueGroupID_decode_aper;
+per_type_encoder_f E2_RANueGroupID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_RANueGroupID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Style-ID.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Style-ID.c
new file mode 100644
index 0000000..02d5676
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Style-ID.c
@@ -0,0 +1,31 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_Style-ID.h"
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static const ber_tlv_tag_t asn_DEF_E2_Style_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_Style_ID = {
+	"Style-ID",
+	"Style-ID",
+	&asn_OP_NativeInteger,
+	asn_DEF_E2_Style_ID_tags_1,
+	sizeof(asn_DEF_E2_Style_ID_tags_1)
+		/sizeof(asn_DEF_E2_Style_ID_tags_1[0]), /* 1 */
+	asn_DEF_E2_Style_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_Style_ID_tags_1)
+		/sizeof(asn_DEF_E2_Style_ID_tags_1[0]), /* 1 */
+	{ 0, 0, NativeInteger_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Style-ID.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Style-ID.h
new file mode 100644
index 0000000..b1cc66a
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_Style-ID.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_Style_ID_H_
+#define	_E2_Style_ID_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeInteger.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_Style-ID */
+typedef long	 E2_Style_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E2_Style_ID;
+asn_struct_free_f E2_Style_ID_free;
+asn_struct_print_f E2_Style_ID_print;
+asn_constr_check_f E2_Style_ID_constraint;
+ber_type_decoder_f E2_Style_ID_decode_ber;
+der_type_encoder_f E2_Style_ID_encode_der;
+xer_type_decoder_f E2_Style_ID_decode_xer;
+xer_type_encoder_f E2_Style_ID_encode_xer;
+per_type_decoder_f E2_Style_ID_decode_uper;
+per_type_encoder_f E2_Style_ID_encode_uper;
+per_type_decoder_f E2_Style_ID_decode_aper;
+per_type_encoder_f E2_Style_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_Style_ID_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_TimeStamp.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_TimeStamp.c
new file mode 100644
index 0000000..760b4f0
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_TimeStamp.c
@@ -0,0 +1,62 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_TimeStamp.h"
+
+int
+E2_TimeStamp_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 8)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		ASN__CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_E2_TimeStamp_constr_1 CC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  8,  8 }	/* (SIZE(8..8)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_E2_TimeStamp_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_TimeStamp = {
+	"TimeStamp",
+	"TimeStamp",
+	&asn_OP_OCTET_STRING,
+	asn_DEF_E2_TimeStamp_tags_1,
+	sizeof(asn_DEF_E2_TimeStamp_tags_1)
+		/sizeof(asn_DEF_E2_TimeStamp_tags_1[0]), /* 1 */
+	asn_DEF_E2_TimeStamp_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_TimeStamp_tags_1)
+		/sizeof(asn_DEF_E2_TimeStamp_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_E2_TimeStamp_constr_1, E2_TimeStamp_constraint },
+	0, 0,	/* No members */
+	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_TimeStamp.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_TimeStamp.h
new file mode 100644
index 0000000..1b1e6e8
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_TimeStamp.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_TimeStamp_H_
+#define	_E2_TimeStamp_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "OCTET_STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E2_TimeStamp */
+typedef OCTET_STRING_t	 E2_TimeStamp_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E2_TimeStamp_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E2_TimeStamp;
+asn_struct_free_f E2_TimeStamp_free;
+asn_struct_print_f E2_TimeStamp_print;
+asn_constr_check_f E2_TimeStamp_constraint;
+ber_type_decoder_f E2_TimeStamp_decode_ber;
+der_type_encoder_f E2_TimeStamp_encode_der;
+xer_type_decoder_f E2_TimeStamp_decode_xer;
+xer_type_encoder_f E2_TimeStamp_encode_xer;
+per_type_decoder_f E2_TimeStamp_decode_uper;
+per_type_encoder_f E2_TimeStamp_encode_uper;
+per_type_decoder_f E2_TimeStamp_decode_aper;
+per_type_encoder_f E2_TimeStamp_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_TimeStamp_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_TypeOfMessage.c b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_TypeOfMessage.c
new file mode 100644
index 0000000..3872b04
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_TypeOfMessage.c
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#include "E2_TypeOfMessage.h"
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+asn_per_constraints_t asn_PER_type_E2_TypeOfMessage_constr_1 CC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0,  3 }	/* (0..3) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_E2_TypeOfMessage_value2enum_1[] = {
+	{ 0,	7,	"nothing" },
+	{ 1,	18,	"initiating-message" },
+	{ 2,	18,	"successful-outcome" },
+	{ 3,	20,	"unsuccessful-outcome" }
+};
+static const unsigned int asn_MAP_E2_TypeOfMessage_enum2value_1[] = {
+	1,	/* initiating-message(1) */
+	0,	/* nothing(0) */
+	2,	/* successful-outcome(2) */
+	3	/* unsuccessful-outcome(3) */
+};
+const asn_INTEGER_specifics_t asn_SPC_E2_TypeOfMessage_specs_1 = {
+	asn_MAP_E2_TypeOfMessage_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_E2_TypeOfMessage_enum2value_1,	/* N => "tag"; sorted by N */
+	4,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_E2_TypeOfMessage_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_E2_TypeOfMessage = {
+	"TypeOfMessage",
+	"TypeOfMessage",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_E2_TypeOfMessage_tags_1,
+	sizeof(asn_DEF_E2_TypeOfMessage_tags_1)
+		/sizeof(asn_DEF_E2_TypeOfMessage_tags_1[0]), /* 1 */
+	asn_DEF_E2_TypeOfMessage_tags_1,	/* Same as above */
+	sizeof(asn_DEF_E2_TypeOfMessage_tags_1)
+		/sizeof(asn_DEF_E2_TypeOfMessage_tags_1[0]), /* 1 */
+	{ 0, &asn_PER_type_E2_TypeOfMessage_constr_1, NativeEnumerated_constraint },
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_E2_TypeOfMessage_specs_1	/* Additional specs */
+};
+
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_TypeOfMessage.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_TypeOfMessage.h
new file mode 100644
index 0000000..7949847
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_TypeOfMessage.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "E2SM-gNB-X2-IEs"
+ * 	found in "spec/e2sm-gNB-X2-v308.asn1"
+ * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
+ */
+
+#ifndef	_E2_TypeOfMessage_H_
+#define	_E2_TypeOfMessage_H_
+
+
+#include "asn_application.h"
+
+/* Including external dependencies */
+#include "NativeEnumerated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum E2_TypeOfMessage {
+	E2_TypeOfMessage_nothing	= 0,
+	E2_TypeOfMessage_initiating_message	= 1,
+	E2_TypeOfMessage_successful_outcome	= 2,
+	E2_TypeOfMessage_unsuccessful_outcome	= 3
+} e_E2_TypeOfMessage;
+
+/* E2_TypeOfMessage */
+typedef long	 E2_TypeOfMessage_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E2_TypeOfMessage_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E2_TypeOfMessage;
+extern const asn_INTEGER_specifics_t asn_SPC_TypeOfMessage_specs_1;
+asn_struct_free_f TypeOfMessage_free;
+asn_struct_print_f TypeOfMessage_print;
+asn_constr_check_f TypeOfMessage_constraint;
+ber_type_decoder_f TypeOfMessage_decode_ber;
+der_type_encoder_f TypeOfMessage_encode_der;
+xer_type_decoder_f TypeOfMessage_decode_xer;
+xer_type_encoder_f TypeOfMessage_encode_xer;
+per_type_decoder_f TypeOfMessage_decode_uper;
+per_type_encoder_f TypeOfMessage_encode_uper;
+per_type_decoder_f TypeOfMessage_decode_aper;
+per_type_encoder_f TypeOfMessage_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E2_TypeOfMessage_H_ */
+#include "asn_internal.h"
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/E2_asn_constant.h b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_asn_constant.h
new file mode 100644
index 0000000..6ffc611
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/E2_asn_constant.h
@@ -0,0 +1,23 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ */
+
+#ifndef _E2_ASN_CONSTANT_H
+#define _E2_ASN_CONSTANT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define E2_maxProtocolIEs (65535)
+#define E2_maxofInterfaceProtocolIE (15)
+#define E2_maxofUEgroup (15)
+#define E2_maxofActionParameters (255)
+#define E2_maxofRANParameters (255)
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _E2_ASN_CONSTANT_H */
diff --git a/3rdparty/libe2ap/INTEGER.c b/3rdparty/E2SM-gNB-X2-V3.0.8/INTEGER.c
similarity index 100%
copy from 3rdparty/libe2ap/INTEGER.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/INTEGER.c
diff --git a/3rdparty/libe2ap/INTEGER.h b/3rdparty/E2SM-gNB-X2-V3.0.8/INTEGER.h
similarity index 100%
copy from 3rdparty/libe2ap/INTEGER.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/INTEGER.h
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/Makefile.am.libasncodec b/3rdparty/E2SM-gNB-X2-V3.0.8/Makefile.am.libasncodec
new file mode 100644
index 0000000..345a9ee
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/Makefile.am.libasncodec
@@ -0,0 +1,175 @@
+ASN_MODULE_SRCS=	\
+	E2_GlobalENB-ID.c	\
+	E2_ENB-ID.c	\
+	E2_GlobalGNB-ID.c	\
+	E2_GNB-ID.c	\
+	E2_PLMN-Identity.c	\
+	E2_Criticality.c	\
+	E2_Presence.c	\
+	E2_ProcedureCode.c	\
+	E2_ProtocolIE-ID.c	\
+	E2_E2SM-gNB-X2-eventTriggerDefinition.c	\
+	E2_E2SM-gNB-X2-EventTriggerDefinitionChoice.c	\
+	E2_E2SM-gNB-X2-actionDefinition.c	\
+	E2_E2SM-gNB-X2-ActionDefinitionChoice.c	\
+	E2_E2SM-gNB-X2-ActionDefinition-Format2.c	\
+	E2_E2SM-gNB-X2-indicationHeader.c	\
+	E2_E2SM-gNB-X2-IndicationHeaderChoice.c	\
+	E2_E2SM-gNB-X2-indicationMessage.c	\
+	E2_E2SM-gNB-X2-IndicationMessageChoice.c	\
+	E2_E2SM-gNB-X2-callProcessID.c	\
+	E2_E2SM-gNB-X2-CallProcessIDChoice.c	\
+	E2_E2SM-gNB-X2-controlHeader.c	\
+	E2_E2SM-gNB-X2-ControlHeaderChoice.c	\
+	E2_E2SM-gNB-X2-controlMessage.c	\
+	E2_E2SM-gNB-X2-ControlMessageChoice.c	\
+	E2_ActionParameter-Item.c	\
+	E2_ActionParameter-ID.c	\
+	E2_ActionParameter-Value.c	\
+	E2_CallProcess-ID.c	\
+	E2_Interface-ID.c	\
+	E2_InterfaceDirection.c	\
+	E2_InterfaceMessage.c	\
+	E2_InterfaceMessageType.c	\
+	E2_TypeOfMessage.c	\
+	E2_InterfaceProtocolIE-Item.c	\
+	E2_InterfaceProtocolIE-ID.c	\
+	E2_InterfaceProtocolIE-Test.c	\
+	E2_InterfaceProtocolIE-Value.c	\
+	E2_RANParameter-Item.c	\
+	E2_RANParameter-ID.c	\
+	E2_RANParameter-Test.c	\
+	E2_RANParameter-Value.c	\
+	E2_RANueGroup-Item.c	\
+	E2_RANimperativePolicy.c	\
+	E2_RANueGroupID.c	\
+	E2_RANueGroupDefinition.c	\
+	E2_RANueGroupDef-Item.c	\
+	E2_Style-ID.c	\
+	E2_TimeStamp.c
+
+ASN_MODULE_HDRS=	\
+	E2_GlobalENB-ID.h	\
+	E2_ENB-ID.h	\
+	E2_GlobalGNB-ID.h	\
+	E2_GNB-ID.h	\
+	E2_PLMN-Identity.h	\
+	E2_Criticality.h	\
+	E2_Presence.h	\
+	E2_ProcedureCode.h	\
+	E2_ProtocolIE-ID.h	\
+	E2_E2SM-gNB-X2-eventTriggerDefinition.h	\
+	E2_E2SM-gNB-X2-EventTriggerDefinitionChoice.h	\
+	E2_E2SM-gNB-X2-actionDefinition.h	\
+	E2_E2SM-gNB-X2-ActionDefinitionChoice.h	\
+	E2_E2SM-gNB-X2-ActionDefinition-Format2.h	\
+	E2_E2SM-gNB-X2-indicationHeader.h	\
+	E2_E2SM-gNB-X2-IndicationHeaderChoice.h	\
+	E2_E2SM-gNB-X2-indicationMessage.h	\
+	E2_E2SM-gNB-X2-IndicationMessageChoice.h	\
+	E2_E2SM-gNB-X2-callProcessID.h	\
+	E2_E2SM-gNB-X2-CallProcessIDChoice.h	\
+	E2_E2SM-gNB-X2-controlHeader.h	\
+	E2_E2SM-gNB-X2-ControlHeaderChoice.h	\
+	E2_E2SM-gNB-X2-controlMessage.h	\
+	E2_E2SM-gNB-X2-ControlMessageChoice.h	\
+	E2_ActionParameter-Item.h	\
+	E2_ActionParameter-ID.h	\
+	E2_ActionParameter-Value.h	\
+	E2_CallProcess-ID.h	\
+	E2_Interface-ID.h	\
+	E2_InterfaceDirection.h	\
+	E2_InterfaceMessage.h	\
+	E2_InterfaceMessageType.h	\
+	E2_TypeOfMessage.h	\
+	E2_InterfaceProtocolIE-Item.h	\
+	E2_InterfaceProtocolIE-ID.h	\
+	E2_InterfaceProtocolIE-Test.h	\
+	E2_InterfaceProtocolIE-Value.h	\
+	E2_RANParameter-Item.h	\
+	E2_RANParameter-ID.h	\
+	E2_RANParameter-Test.h	\
+	E2_RANParameter-Value.h	\
+	E2_RANueGroup-Item.h	\
+	E2_RANimperativePolicy.h	\
+	E2_RANueGroupID.h	\
+	E2_RANueGroupDefinition.h	\
+	E2_RANueGroupDef-Item.h	\
+	E2_Style-ID.h	\
+	E2_TimeStamp.h
+
+ASN_MODULE_HDRS+=OPEN_TYPE.h
+ASN_MODULE_SRCS+=OPEN_TYPE.c
+ASN_MODULE_HDRS+=constr_CHOICE.h
+ASN_MODULE_HDRS+=BOOLEAN.h
+ASN_MODULE_SRCS+=BOOLEAN.c
+ASN_MODULE_HDRS+=INTEGER.h
+ASN_MODULE_SRCS+=INTEGER.c
+ASN_MODULE_HDRS+=NativeEnumerated.h
+ASN_MODULE_SRCS+=NativeEnumerated.c
+ASN_MODULE_HDRS+=NativeInteger.h
+ASN_MODULE_SRCS+=NativeInteger.c
+ASN_MODULE_HDRS+=PrintableString.h
+ASN_MODULE_SRCS+=PrintableString.c
+ASN_MODULE_HDRS+=OCTET_STRING.h
+ASN_MODULE_HDRS+=asn_SEQUENCE_OF.h
+ASN_MODULE_SRCS+=asn_SEQUENCE_OF.c
+ASN_MODULE_HDRS+=asn_SET_OF.h
+ASN_MODULE_SRCS+=asn_SET_OF.c
+ASN_MODULE_SRCS+=constr_CHOICE.c
+ASN_MODULE_HDRS+=constr_SEQUENCE.h
+ASN_MODULE_SRCS+=constr_SEQUENCE.c
+ASN_MODULE_HDRS+=constr_SEQUENCE_OF.h
+ASN_MODULE_SRCS+=constr_SEQUENCE_OF.c
+ASN_MODULE_HDRS+=constr_SET_OF.h
+ASN_MODULE_SRCS+=constr_SET_OF.c
+ASN_MODULE_HDRS+=asn_application.h
+ASN_MODULE_SRCS+=asn_application.c
+ASN_MODULE_HDRS+=asn_ioc.h
+ASN_MODULE_HDRS+=asn_system.h
+ASN_MODULE_HDRS+=asn_codecs.h
+ASN_MODULE_HDRS+=asn_internal.h
+ASN_MODULE_SRCS+=asn_internal.c
+ASN_MODULE_HDRS+=asn_random_fill.h
+ASN_MODULE_SRCS+=asn_random_fill.c
+ASN_MODULE_HDRS+=asn_bit_data.h
+ASN_MODULE_SRCS+=asn_bit_data.c
+ASN_MODULE_SRCS+=OCTET_STRING.c
+ASN_MODULE_HDRS+=BIT_STRING.h
+ASN_MODULE_SRCS+=BIT_STRING.c
+ASN_MODULE_SRCS+=asn_codecs_prim.c
+ASN_MODULE_HDRS+=asn_codecs_prim.h
+ASN_MODULE_HDRS+=ber_tlv_length.h
+ASN_MODULE_SRCS+=ber_tlv_length.c
+ASN_MODULE_HDRS+=ber_tlv_tag.h
+ASN_MODULE_SRCS+=ber_tlv_tag.c
+ASN_MODULE_HDRS+=ber_decoder.h
+ASN_MODULE_SRCS+=ber_decoder.c
+ASN_MODULE_HDRS+=der_encoder.h
+ASN_MODULE_SRCS+=der_encoder.c
+ASN_MODULE_HDRS+=constr_TYPE.h
+ASN_MODULE_SRCS+=constr_TYPE.c
+ASN_MODULE_HDRS+=constraints.h
+ASN_MODULE_SRCS+=constraints.c
+ASN_MODULE_HDRS+=xer_support.h
+ASN_MODULE_SRCS+=xer_support.c
+ASN_MODULE_HDRS+=xer_decoder.h
+ASN_MODULE_SRCS+=xer_decoder.c
+ASN_MODULE_HDRS+=xer_encoder.h
+ASN_MODULE_SRCS+=xer_encoder.c
+ASN_MODULE_HDRS+=per_support.h
+ASN_MODULE_SRCS+=per_support.c
+ASN_MODULE_HDRS+=per_decoder.h
+ASN_MODULE_SRCS+=per_decoder.c
+ASN_MODULE_HDRS+=per_encoder.h
+ASN_MODULE_SRCS+=per_encoder.c
+ASN_MODULE_HDRS+=per_opentype.h
+ASN_MODULE_SRCS+=per_opentype.c
+
+ASN_MODULE_CFLAGS=-DASN_DISABLE_OER_SUPPORT 
+
+lib_LTLIBRARIES+=libasncodec.la
+libasncodec_la_SOURCES=$(ASN_MODULE_SRCS) $(ASN_MODULE_HDRS)
+libasncodec_la_CPPFLAGS=-I$(top_srcdir)/
+libasncodec_la_CFLAGS=$(ASN_MODULE_CFLAGS)
+libasncodec_la_LDFLAGS=-lm
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/NativeEnumerated.c b/3rdparty/E2SM-gNB-X2-V3.0.8/NativeEnumerated.c
new file mode 100644
index 0000000..50ffb1d
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/NativeEnumerated.c
@@ -0,0 +1,367 @@
+/*-
+ * Copyright (c) 2004, 2007 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+/*
+ * Read the NativeInteger.h for the explanation wrt. differences between
+ * INTEGER and NativeInteger.
+ * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this
+ * implementation deals with the standard (machine-specific) representation
+ * of them instead of using the platform-independent buffer.
+ */
+#include <asn_internal.h>
+#include <NativeEnumerated.h>
+
+/*
+ * NativeEnumerated basic type description.
+ */
+static const ber_tlv_tag_t asn_DEF_NativeEnumerated_tags[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_operation_t asn_OP_NativeEnumerated = {
+	NativeInteger_free,
+	NativeInteger_print,
+	NativeInteger_compare,
+	NativeInteger_decode_ber,
+	NativeInteger_encode_der,
+	NativeInteger_decode_xer,
+	NativeEnumerated_encode_xer,
+#ifdef	ASN_DISABLE_OER_SUPPORT
+	0,
+	0,
+#else
+	NativeEnumerated_decode_oer,
+	NativeEnumerated_encode_oer,
+#endif  /* ASN_DISABLE_OER_SUPPORT */
+#ifdef	ASN_DISABLE_PER_SUPPORT
+	0,
+	0,
+	0,
+	0,
+#else
+	NativeEnumerated_decode_uper,
+	NativeEnumerated_encode_uper,
+	NativeEnumerated_decode_aper,
+	NativeEnumerated_encode_aper,
+#endif	/* ASN_DISABLE_PER_SUPPORT */
+	NativeEnumerated_random_fill,
+	0	/* Use generic outmost tag fetcher */
+};
+asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = {
+	"ENUMERATED",			/* The ASN.1 type is still ENUMERATED */
+	"ENUMERATED",
+	&asn_OP_NativeEnumerated,
+	asn_DEF_NativeEnumerated_tags,
+	sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]),
+	asn_DEF_NativeEnumerated_tags,	/* Same as above */
+	sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]),
+	{ 0, 0, asn_generic_no_constraint },
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
+asn_enc_rval_t
+NativeEnumerated_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr,
+                            int ilevel, enum xer_encoder_flags_e flags,
+                            asn_app_consume_bytes_f *cb, void *app_key) {
+    const asn_INTEGER_specifics_t *specs =
+        (const asn_INTEGER_specifics_t *)td->specifics;
+    asn_enc_rval_t er = {0,0,0};
+    const long *native = (const long *)sptr;
+    const asn_INTEGER_enum_map_t *el;
+
+    (void)ilevel;
+    (void)flags;
+
+    if(!native) ASN__ENCODE_FAILED;
+
+    el = INTEGER_map_value2enum(specs, *native);
+    if(el) {
+        er.encoded =
+            asn__format_to_callback(cb, app_key, "<%s/>", el->enum_name);
+        if(er.encoded < 0) ASN__ENCODE_FAILED;
+        ASN__ENCODED_OK(er);
+    } else {
+        ASN_DEBUG(
+            "ASN.1 forbids dealing with "
+            "unknown value of ENUMERATED type");
+        ASN__ENCODE_FAILED;
+    }
+}
+
+asn_dec_rval_t
+NativeEnumerated_decode_uper(const asn_codec_ctx_t *opt_codec_ctx,
+                             const asn_TYPE_descriptor_t *td,
+                             const asn_per_constraints_t *constraints,
+                             void **sptr, asn_per_data_t *pd) {
+    const asn_INTEGER_specifics_t *specs = td->specifics;
+    asn_dec_rval_t rval = { RC_OK, 0 };
+	long *native = (long *)*sptr;
+	const asn_per_constraint_t *ct = NULL;
+	long value;
+
+	(void)opt_codec_ctx;
+
+	if(constraints) ct = &constraints->value;
+	else if(td->encoding_constraints.per_constraints)
+		ct = &td->encoding_constraints.per_constraints->value;
+	else ASN__DECODE_FAILED;	/* Mandatory! */
+	if(!specs) ASN__DECODE_FAILED;
+
+	if(!native) {
+		native = (long *)(*sptr = CALLOC(1, sizeof(*native)));
+		if(!native) ASN__DECODE_FAILED;
+	}
+
+	ASN_DEBUG("Decoding %s as NativeEnumerated", td->name);
+
+	if(ct && ct->flags & APC_EXTENSIBLE) {
+		int inext = per_get_few_bits(pd, 1);
+		if(inext < 0) ASN__DECODE_STARVED;
+		if(inext) ct = 0;
+	}
+
+	if(ct && ct->range_bits >= 0) {
+		value = per_get_few_bits(pd, ct->range_bits);
+		if(value < 0) ASN__DECODE_STARVED;
+		if(value >= (specs->extension
+			? specs->extension - 1 : specs->map_count))
+			ASN__DECODE_FAILED;
+	} else {
+		if(!specs->extension)
+			ASN__DECODE_FAILED;
+		/*
+		 * X.691, #10.6: normally small non-negative whole number;
+		 */
+		value = uper_get_nsnnwn(pd);
+		if(value < 0) ASN__DECODE_STARVED;
+		value += specs->extension - 1;
+		if(value >= specs->map_count)
+			ASN__DECODE_FAILED;
+	}
+
+	*native = specs->value2enum[value].nat_value;
+	ASN_DEBUG("Decoded %s = %ld", td->name, *native);
+
+	return rval;
+}
+
+static int
+NativeEnumerated__compar_value2enum(const void *ap, const void *bp) {
+	const asn_INTEGER_enum_map_t *a = ap;
+	const asn_INTEGER_enum_map_t *b = bp;
+	if(a->nat_value == b->nat_value)
+		return 0;
+	if(a->nat_value < b->nat_value)
+		return -1;
+	return 1;
+}
+
+asn_enc_rval_t
+NativeEnumerated_encode_uper(const asn_TYPE_descriptor_t *td,
+                             const asn_per_constraints_t *constraints,
+                             const void *sptr, asn_per_outp_t *po) {
+	const asn_INTEGER_specifics_t *specs =
+        (const asn_INTEGER_specifics_t *)td->specifics;
+	asn_enc_rval_t er = {0,0,0};
+	long native, value;
+	const asn_per_constraint_t *ct = NULL;
+	int inext = 0;
+	asn_INTEGER_enum_map_t key;
+	const asn_INTEGER_enum_map_t *kf;
+
+	if(!sptr) ASN__ENCODE_FAILED;
+	if(!specs) ASN__ENCODE_FAILED;
+
+	if(constraints) ct = &constraints->value;
+	else if(td->encoding_constraints.per_constraints)
+		ct = &td->encoding_constraints.per_constraints->value;
+	else ASN__ENCODE_FAILED;	/* Mandatory! */
+
+	ASN_DEBUG("Encoding %s as NativeEnumerated", td->name);
+
+	er.encoded = 0;
+
+	native = *(const long *)sptr;
+
+	key.nat_value = native;
+	kf = bsearch(&key, specs->value2enum, specs->map_count,
+		sizeof(key), NativeEnumerated__compar_value2enum);
+	if(!kf) {
+		ASN_DEBUG("No element corresponds to %ld", native);
+		ASN__ENCODE_FAILED;
+	}
+	value = kf - specs->value2enum;
+
+	if(ct && ct->range_bits >= 0) {
+		int cmpWith = specs->extension
+				? specs->extension - 1 : specs->map_count;
+		if(value >= cmpWith)
+			inext = 1;
+	}
+	if(ct && ct->flags & APC_EXTENSIBLE) {
+		if(per_put_few_bits(po, inext, 1))
+			ASN__ENCODE_FAILED;
+		if(inext) ct = 0;
+	} else if(inext) {
+		ASN__ENCODE_FAILED;
+	}
+
+	if(ct && ct->range_bits >= 0) {
+		if(per_put_few_bits(po, value, ct->range_bits))
+			ASN__ENCODE_FAILED;
+		ASN__ENCODED_OK(er);
+	}
+
+	if(!specs->extension)
+		ASN__ENCODE_FAILED;
+
+	/*
+	 * X.691, #10.6: normally small non-negative whole number;
+	 */
+	ASN_DEBUG("value = %ld, ext = %d, inext = %d, res = %ld",
+		value, specs->extension, inext,
+		value - (inext ? (specs->extension - 1) : 0));
+	if(uper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0)))
+		ASN__ENCODE_FAILED;
+
+	ASN__ENCODED_OK(er);
+}
+
+asn_dec_rval_t
+NativeEnumerated_decode_aper(const asn_codec_ctx_t *opt_codec_ctx,
+                             const asn_TYPE_descriptor_t *td,
+                             const asn_per_constraints_t *constraints,
+                             void **sptr, asn_per_data_t *pd) {
+	const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics;
+	asn_dec_rval_t rval = { RC_OK, 0 };
+	long *native = (long *)*sptr;
+	const asn_per_constraint_t *ct = NULL;
+	long value;
+
+	(void)opt_codec_ctx;
+
+	if(constraints) ct = &constraints->value;
+	else if(td->encoding_constraints.per_constraints)
+		ct = &td->encoding_constraints.per_constraints->value;
+	else ASN__DECODE_FAILED;	/* Mandatory! */
+	if(!specs) ASN__DECODE_FAILED;
+
+	if(!native) {
+		native = (long *)(*sptr = CALLOC(1, sizeof(*native)));
+		if(!native) ASN__DECODE_FAILED;
+	}
+
+	ASN_DEBUG("Decoding %s as NativeEnumerated", td->name);
+
+	if(ct && ct->flags & APC_EXTENSIBLE) {
+		int inext = per_get_few_bits(pd, 1);
+		if(inext < 0) ASN__DECODE_STARVED;
+		if(inext) ct = 0;
+	}
+
+	/* Deal with APER padding */
+	if(ct && ct->upper_bound >= 255) {
+		int padding = 0;
+		padding = (8 - (pd->moved % 8)) % 8;
+		ASN_DEBUG("For NativeEnumerated %s,offset= %lu Padding bits = %d", td->name, pd->moved, padding);
+		ASN_DEBUG("For NativeEnumerated %s, upper bound = %lu", td->name, ct->upper_bound);
+		if(padding > 0)
+			per_get_few_bits(pd, padding);
+	}
+
+	if(ct && ct->range_bits >= 0) {
+		value = per_get_few_bits(pd, ct->range_bits);
+		if(value < 0) ASN__DECODE_STARVED;
+		if(value >= (specs->extension
+		             ? specs->extension - 1 : specs->map_count))
+			ASN__DECODE_FAILED;
+	} else {
+		if(!specs->extension)
+			ASN__DECODE_FAILED;
+		/*
+		 * X.691, #10.6: normally small non-negative whole number;
+		 */
+		value = uper_get_nsnnwn(pd);
+		if(value < 0) ASN__DECODE_STARVED;
+		value += specs->extension - 1;
+		if(value >= specs->map_count)
+			ASN__DECODE_FAILED;
+	}
+
+	*native = specs->value2enum[value].nat_value;
+	ASN_DEBUG("Decoded %s = %ld", td->name, *native);
+
+	return rval;
+}
+
+asn_enc_rval_t
+NativeEnumerated_encode_aper(const asn_TYPE_descriptor_t *td,
+                             const asn_per_constraints_t *constraints,
+                             const void *sptr, asn_per_outp_t *po) {
+	const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics;
+	asn_enc_rval_t er = {0,0,0};
+	long native, value;
+	const asn_per_constraint_t *ct = NULL;
+	int inext = 0;
+	asn_INTEGER_enum_map_t key;
+	asn_INTEGER_enum_map_t *kf;
+
+	if(!sptr) ASN__ENCODE_FAILED;
+	if(!specs) ASN__ENCODE_FAILED;
+
+	if(constraints) ct = &constraints->value;
+	else if(td->encoding_constraints.per_constraints)
+		ct = &td->encoding_constraints.per_constraints->value;
+	else ASN__ENCODE_FAILED;        /* Mandatory! */
+
+	ASN_DEBUG("Encoding %s as NativeEnumerated", td->name);
+
+	er.encoded = 0;
+
+	native = *(const long *)sptr;
+	if(native < 0) ASN__ENCODE_FAILED;
+
+	key.nat_value = native;
+	kf = bsearch(&key, specs->value2enum, specs->map_count,
+	             sizeof(key), NativeEnumerated__compar_value2enum);
+	if(!kf) {
+		ASN_DEBUG("No element corresponds to %ld", native);
+		ASN__ENCODE_FAILED;
+	}
+	value = kf - specs->value2enum;
+
+	if(ct && ct->range_bits >= 0) {
+		int cmpWith = specs->extension
+		              ? specs->extension - 1 : specs->map_count;
+		if(value >= cmpWith)
+			inext = 1;
+	}
+	if(ct && ct->flags & APC_EXTENSIBLE) {
+		if(per_put_few_bits(po, inext, 1))
+			ASN__ENCODE_FAILED;
+		if(inext) ct = 0;
+	} else if(inext) {
+		ASN__ENCODE_FAILED;
+	}
+
+	if(ct && ct->range_bits >= 0) {
+		if(per_put_few_bits(po, value, ct->range_bits))
+			ASN__ENCODE_FAILED;
+		ASN__ENCODED_OK(er);
+	}
+
+	if(!specs->extension)
+		ASN__ENCODE_FAILED;
+
+	/*
+	 * X.691, #10.6: normally small non-negative whole number;
+	 */
+	ASN_DEBUG("value = %ld, ext = %d, inext = %d, res = %ld",
+	          value, specs->extension, inext,
+	          value - (inext ? (specs->extension - 1) : 0));
+	if(uper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0)))
+		ASN__ENCODE_FAILED;
+
+	ASN__ENCODED_OK(er);
+}
diff --git a/3rdparty/libe2ap/NativeEnumerated.h b/3rdparty/E2SM-gNB-X2-V3.0.8/NativeEnumerated.h
similarity index 100%
copy from 3rdparty/libe2ap/NativeEnumerated.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/NativeEnumerated.h
diff --git a/3rdparty/libe2ap/NativeInteger.c b/3rdparty/E2SM-gNB-X2-V3.0.8/NativeInteger.c
similarity index 100%
copy from 3rdparty/libe2ap/NativeInteger.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/NativeInteger.c
diff --git a/3rdparty/libe2ap/NativeInteger.h b/3rdparty/E2SM-gNB-X2-V3.0.8/NativeInteger.h
similarity index 100%
copy from 3rdparty/libe2ap/NativeInteger.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/NativeInteger.h
diff --git a/3rdparty/libe2ap/OCTET_STRING.c b/3rdparty/E2SM-gNB-X2-V3.0.8/OCTET_STRING.c
similarity index 100%
rename from 3rdparty/libe2ap/OCTET_STRING.c
rename to 3rdparty/E2SM-gNB-X2-V3.0.8/OCTET_STRING.c
diff --git a/3rdparty/libe2ap/OCTET_STRING.h b/3rdparty/E2SM-gNB-X2-V3.0.8/OCTET_STRING.h
similarity index 100%
copy from 3rdparty/libe2ap/OCTET_STRING.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/OCTET_STRING.h
diff --git a/3rdparty/libe2ap/OPEN_TYPE.c b/3rdparty/E2SM-gNB-X2-V3.0.8/OPEN_TYPE.c
similarity index 100%
copy from 3rdparty/libe2ap/OPEN_TYPE.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/OPEN_TYPE.c
diff --git a/3rdparty/libe2ap/OPEN_TYPE.h b/3rdparty/E2SM-gNB-X2-V3.0.8/OPEN_TYPE.h
similarity index 100%
copy from 3rdparty/libe2ap/OPEN_TYPE.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/OPEN_TYPE.h
diff --git a/3rdparty/libe2ap/PrintableString.c b/3rdparty/E2SM-gNB-X2-V3.0.8/PrintableString.c
similarity index 100%
rename from 3rdparty/libe2ap/PrintableString.c
rename to 3rdparty/E2SM-gNB-X2-V3.0.8/PrintableString.c
diff --git a/3rdparty/libe2ap/PrintableString.h b/3rdparty/E2SM-gNB-X2-V3.0.8/PrintableString.h
similarity index 100%
rename from 3rdparty/libe2ap/PrintableString.h
rename to 3rdparty/E2SM-gNB-X2-V3.0.8/PrintableString.h
diff --git a/3rdparty/libe2ap/asn_SEQUENCE_OF.c b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_SEQUENCE_OF.c
similarity index 100%
copy from 3rdparty/libe2ap/asn_SEQUENCE_OF.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_SEQUENCE_OF.c
diff --git a/3rdparty/libe2ap/asn_SEQUENCE_OF.h b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_SEQUENCE_OF.h
similarity index 100%
copy from 3rdparty/libe2ap/asn_SEQUENCE_OF.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_SEQUENCE_OF.h
diff --git a/3rdparty/libe2ap/asn_SET_OF.c b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_SET_OF.c
similarity index 100%
copy from 3rdparty/libe2ap/asn_SET_OF.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_SET_OF.c
diff --git a/3rdparty/libe2ap/asn_SET_OF.h b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_SET_OF.h
similarity index 100%
copy from 3rdparty/libe2ap/asn_SET_OF.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_SET_OF.h
diff --git a/3rdparty/libe2ap/asn_application.c b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_application.c
similarity index 100%
copy from 3rdparty/libe2ap/asn_application.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_application.c
diff --git a/3rdparty/libe2ap/asn_application.h b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_application.h
similarity index 100%
copy from 3rdparty/libe2ap/asn_application.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_application.h
diff --git a/3rdparty/libe2ap/asn_bit_data.c b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_bit_data.c
similarity index 100%
copy from 3rdparty/libe2ap/asn_bit_data.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_bit_data.c
diff --git a/3rdparty/libe2ap/asn_bit_data.h b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_bit_data.h
similarity index 100%
copy from 3rdparty/libe2ap/asn_bit_data.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_bit_data.h
diff --git a/3rdparty/libe2ap/asn_codecs.h b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_codecs.h
similarity index 100%
copy from 3rdparty/libe2ap/asn_codecs.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_codecs.h
diff --git a/3rdparty/libe2ap/asn_codecs_prim.c b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_codecs_prim.c
similarity index 100%
copy from 3rdparty/libe2ap/asn_codecs_prim.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_codecs_prim.c
diff --git a/3rdparty/libe2ap/asn_codecs_prim.h b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_codecs_prim.h
similarity index 100%
copy from 3rdparty/libe2ap/asn_codecs_prim.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_codecs_prim.h
diff --git a/3rdparty/E2SM-gNB-X2-V3.0.8/asn_internal.c b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_internal.c
new file mode 100644
index 0000000..004660b
--- /dev/null
+++ b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_internal.c
@@ -0,0 +1,49 @@
+#include <asn_internal.h>
+
+ssize_t
+asn__format_to_callback(int (*cb)(const void *, size_t, void *key), void *key,
+                        const char *fmt, ...) {
+    char scratch[64];
+    char *buf = scratch;
+    size_t buf_size = sizeof(scratch);
+    int wrote;
+    int cb_ret;
+
+    do {
+        va_list args;
+        va_start(args, fmt);
+
+        wrote = vsnprintf(buf, buf_size, fmt, args);
+        if(wrote < (ssize_t)buf_size) {
+            if(wrote < 0) {
+                if(buf != scratch) FREEMEM(buf);
+		va_end(args);
+                return -1;
+            }
+            break;
+        }
+
+        buf_size <<= 1;
+        if(buf == scratch) {
+            buf = MALLOC(buf_size);
+            if(!buf) { va_end(args); return -1; }
+        } else {
+            void *p = REALLOC(buf, buf_size);
+            if(!p) {
+                FREEMEM(buf);
+		va_end(args);
+                return -1;
+            }
+            buf = p;
+        }
+    } while(1);
+
+    cb_ret = cb(buf, wrote, key);
+    if(buf != scratch) FREEMEM(buf);
+    if(cb_ret < 0) {
+        return -1;
+    }
+
+    return wrote;
+}
+
diff --git a/3rdparty/libe2ap/asn_internal.h b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_internal.h
similarity index 100%
copy from 3rdparty/libe2ap/asn_internal.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_internal.h
diff --git a/3rdparty/libe2ap/asn_ioc.h b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_ioc.h
similarity index 100%
copy from 3rdparty/libe2ap/asn_ioc.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_ioc.h
diff --git a/3rdparty/libe2ap/asn_random_fill.c b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_random_fill.c
similarity index 100%
copy from 3rdparty/libe2ap/asn_random_fill.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_random_fill.c
diff --git a/3rdparty/libe2ap/asn_random_fill.h b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_random_fill.h
similarity index 100%
copy from 3rdparty/libe2ap/asn_random_fill.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_random_fill.h
diff --git a/3rdparty/libe2ap/asn_system.h b/3rdparty/E2SM-gNB-X2-V3.0.8/asn_system.h
similarity index 100%
copy from 3rdparty/libe2ap/asn_system.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/asn_system.h
diff --git a/3rdparty/libe2ap/ber_decoder.c b/3rdparty/E2SM-gNB-X2-V3.0.8/ber_decoder.c
similarity index 100%
copy from 3rdparty/libe2ap/ber_decoder.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/ber_decoder.c
diff --git a/3rdparty/libe2ap/ber_decoder.h b/3rdparty/E2SM-gNB-X2-V3.0.8/ber_decoder.h
similarity index 100%
copy from 3rdparty/libe2ap/ber_decoder.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/ber_decoder.h
diff --git a/3rdparty/libe2ap/ber_tlv_length.c b/3rdparty/E2SM-gNB-X2-V3.0.8/ber_tlv_length.c
similarity index 100%
copy from 3rdparty/libe2ap/ber_tlv_length.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/ber_tlv_length.c
diff --git a/3rdparty/libe2ap/ber_tlv_length.h b/3rdparty/E2SM-gNB-X2-V3.0.8/ber_tlv_length.h
similarity index 100%
copy from 3rdparty/libe2ap/ber_tlv_length.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/ber_tlv_length.h
diff --git a/3rdparty/libe2ap/ber_tlv_tag.c b/3rdparty/E2SM-gNB-X2-V3.0.8/ber_tlv_tag.c
similarity index 100%
copy from 3rdparty/libe2ap/ber_tlv_tag.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/ber_tlv_tag.c
diff --git a/3rdparty/libe2ap/ber_tlv_tag.h b/3rdparty/E2SM-gNB-X2-V3.0.8/ber_tlv_tag.h
similarity index 100%
copy from 3rdparty/libe2ap/ber_tlv_tag.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/ber_tlv_tag.h
diff --git a/3rdparty/libe2ap/constr_CHOICE.c b/3rdparty/E2SM-gNB-X2-V3.0.8/constr_CHOICE.c
similarity index 100%
rename from 3rdparty/libe2ap/constr_CHOICE.c
rename to 3rdparty/E2SM-gNB-X2-V3.0.8/constr_CHOICE.c
diff --git a/3rdparty/libe2ap/constr_CHOICE.h b/3rdparty/E2SM-gNB-X2-V3.0.8/constr_CHOICE.h
similarity index 100%
copy from 3rdparty/libe2ap/constr_CHOICE.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/constr_CHOICE.h
diff --git a/3rdparty/libe2ap/constr_SEQUENCE.c b/3rdparty/E2SM-gNB-X2-V3.0.8/constr_SEQUENCE.c
similarity index 100%
copy from 3rdparty/libe2ap/constr_SEQUENCE.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/constr_SEQUENCE.c
diff --git a/3rdparty/libe2ap/constr_SEQUENCE.h b/3rdparty/E2SM-gNB-X2-V3.0.8/constr_SEQUENCE.h
similarity index 100%
copy from 3rdparty/libe2ap/constr_SEQUENCE.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/constr_SEQUENCE.h
diff --git a/3rdparty/libe2ap/constr_SEQUENCE_OF.c b/3rdparty/E2SM-gNB-X2-V3.0.8/constr_SEQUENCE_OF.c
similarity index 100%
copy from 3rdparty/libe2ap/constr_SEQUENCE_OF.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/constr_SEQUENCE_OF.c
diff --git a/3rdparty/libe2ap/constr_SEQUENCE_OF.h b/3rdparty/E2SM-gNB-X2-V3.0.8/constr_SEQUENCE_OF.h
similarity index 100%
copy from 3rdparty/libe2ap/constr_SEQUENCE_OF.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/constr_SEQUENCE_OF.h
diff --git a/3rdparty/libe2ap/constr_SET_OF.c b/3rdparty/E2SM-gNB-X2-V3.0.8/constr_SET_OF.c
similarity index 100%
copy from 3rdparty/libe2ap/constr_SET_OF.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/constr_SET_OF.c
diff --git a/3rdparty/libe2ap/constr_SET_OF.h b/3rdparty/E2SM-gNB-X2-V3.0.8/constr_SET_OF.h
similarity index 100%
copy from 3rdparty/libe2ap/constr_SET_OF.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/constr_SET_OF.h
diff --git a/3rdparty/libe2ap/constr_TYPE.c b/3rdparty/E2SM-gNB-X2-V3.0.8/constr_TYPE.c
similarity index 100%
copy from 3rdparty/libe2ap/constr_TYPE.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/constr_TYPE.c
diff --git a/3rdparty/libe2ap/constr_TYPE.h b/3rdparty/E2SM-gNB-X2-V3.0.8/constr_TYPE.h
similarity index 100%
copy from 3rdparty/libe2ap/constr_TYPE.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/constr_TYPE.h
diff --git a/3rdparty/libe2ap/constraints.c b/3rdparty/E2SM-gNB-X2-V3.0.8/constraints.c
similarity index 100%
copy from 3rdparty/libe2ap/constraints.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/constraints.c
diff --git a/3rdparty/libe2ap/constraints.h b/3rdparty/E2SM-gNB-X2-V3.0.8/constraints.h
similarity index 100%
copy from 3rdparty/libe2ap/constraints.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/constraints.h
diff --git a/3rdparty/libe2ap/der_encoder.c b/3rdparty/E2SM-gNB-X2-V3.0.8/der_encoder.c
similarity index 100%
copy from 3rdparty/libe2ap/der_encoder.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/der_encoder.c
diff --git a/3rdparty/libe2ap/der_encoder.h b/3rdparty/E2SM-gNB-X2-V3.0.8/der_encoder.h
similarity index 100%
copy from 3rdparty/libe2ap/der_encoder.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/der_encoder.h
diff --git a/3rdparty/libe2ap/per_decoder.c b/3rdparty/E2SM-gNB-X2-V3.0.8/per_decoder.c
similarity index 100%
copy from 3rdparty/libe2ap/per_decoder.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/per_decoder.c
diff --git a/3rdparty/libe2ap/per_decoder.h b/3rdparty/E2SM-gNB-X2-V3.0.8/per_decoder.h
similarity index 100%
copy from 3rdparty/libe2ap/per_decoder.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/per_decoder.h
diff --git a/3rdparty/libe2ap/per_encoder.c b/3rdparty/E2SM-gNB-X2-V3.0.8/per_encoder.c
similarity index 100%
copy from 3rdparty/libe2ap/per_encoder.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/per_encoder.c
diff --git a/3rdparty/libe2ap/per_encoder.h b/3rdparty/E2SM-gNB-X2-V3.0.8/per_encoder.h
similarity index 100%
copy from 3rdparty/libe2ap/per_encoder.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/per_encoder.h
diff --git a/3rdparty/libe2ap/per_opentype.c b/3rdparty/E2SM-gNB-X2-V3.0.8/per_opentype.c
similarity index 100%
copy from 3rdparty/libe2ap/per_opentype.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/per_opentype.c
diff --git a/3rdparty/libe2ap/per_opentype.h b/3rdparty/E2SM-gNB-X2-V3.0.8/per_opentype.h
similarity index 100%
copy from 3rdparty/libe2ap/per_opentype.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/per_opentype.h
diff --git a/3rdparty/libe2ap/per_support.c b/3rdparty/E2SM-gNB-X2-V3.0.8/per_support.c
similarity index 100%
copy from 3rdparty/libe2ap/per_support.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/per_support.c
diff --git a/3rdparty/libe2ap/per_support.h b/3rdparty/E2SM-gNB-X2-V3.0.8/per_support.h
similarity index 100%
copy from 3rdparty/libe2ap/per_support.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/per_support.h
diff --git a/3rdparty/libe2ap/xer_decoder.c b/3rdparty/E2SM-gNB-X2-V3.0.8/xer_decoder.c
similarity index 100%
copy from 3rdparty/libe2ap/xer_decoder.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/xer_decoder.c
diff --git a/3rdparty/libe2ap/xer_decoder.h b/3rdparty/E2SM-gNB-X2-V3.0.8/xer_decoder.h
similarity index 100%
copy from 3rdparty/libe2ap/xer_decoder.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/xer_decoder.h
diff --git a/3rdparty/libe2ap/xer_encoder.c b/3rdparty/E2SM-gNB-X2-V3.0.8/xer_encoder.c
similarity index 100%
copy from 3rdparty/libe2ap/xer_encoder.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/xer_encoder.c
diff --git a/3rdparty/libe2ap/xer_encoder.h b/3rdparty/E2SM-gNB-X2-V3.0.8/xer_encoder.h
similarity index 100%
copy from 3rdparty/libe2ap/xer_encoder.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/xer_encoder.h
diff --git a/3rdparty/libe2ap/xer_support.c b/3rdparty/E2SM-gNB-X2-V3.0.8/xer_support.c
similarity index 100%
copy from 3rdparty/libe2ap/xer_support.c
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/xer_support.c
diff --git a/3rdparty/libe2ap/xer_support.h b/3rdparty/E2SM-gNB-X2-V3.0.8/xer_support.h
similarity index 100%
copy from 3rdparty/libe2ap/xer_support.h
copy to 3rdparty/E2SM-gNB-X2-V3.0.8/xer_support.h
diff --git a/3rdparty/libe2ap/ABS-Status.c b/3rdparty/libe2ap/ABS-Status.c
deleted file mode 100644
index b09ba6d..0000000
--- a/3rdparty/libe2ap/ABS-Status.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ABS-Status.h"
-
-#include "ProtocolExtensionContainer.h"
-static asn_TYPE_member_t asn_MBR_ABS_Status_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ABS_Status, dL_ABS_status),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_DL_ABS_status,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"dL-ABS-status"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ABS_Status, usableABSInformation),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_UsableABSInformation,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"usableABSInformation"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ABS_Status, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P22,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_ABS_Status_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_ABS_Status_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ABS_Status_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* dL-ABS-status */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* usableABSInformation */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_ABS_Status_specs_1 = {
-	sizeof(struct ABS_Status),
-	offsetof(struct ABS_Status, _asn_ctx),
-	asn_MAP_ABS_Status_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_ABS_Status_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ABS_Status = {
-	"ABS-Status",
-	"ABS-Status",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ABS_Status_tags_1,
-	sizeof(asn_DEF_ABS_Status_tags_1)
-		/sizeof(asn_DEF_ABS_Status_tags_1[0]), /* 1 */
-	asn_DEF_ABS_Status_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ABS_Status_tags_1)
-		/sizeof(asn_DEF_ABS_Status_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ABS_Status_1,
-	3,	/* Elements count */
-	&asn_SPC_ABS_Status_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ABS-Status.h b/3rdparty/libe2ap/ABS-Status.h
deleted file mode 100644
index 3a56a95..0000000
--- a/3rdparty/libe2ap/ABS-Status.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ABS_Status_H_
-#define	_ABS_Status_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "DL-ABS-status.h"
-#include "UsableABSInformation.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* ABS-Status */
-typedef struct ABS_Status {
-	DL_ABS_status_t	 dL_ABS_status;
-	UsableABSInformation_t	 usableABSInformation;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ABS_Status_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ABS_Status;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ABS_Status_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ABSInformation.c b/3rdparty/libe2ap/ABSInformation.c
deleted file mode 100644
index b5b1080..0000000
--- a/3rdparty/libe2ap/ABSInformation.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ABSInformation.h"
-
-static asn_per_constraints_t asn_PER_type_ABSInformation_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_ABSInformation_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformation, choice.fdd),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ABSInformationFDD,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"fdd"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformation, choice.tdd),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ABSInformationTDD,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"tdd"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformation, choice.abs_inactive),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NULL,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"abs-inactive"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_ABSInformation_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* fdd */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* tdd */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* abs-inactive */
-};
-static asn_CHOICE_specifics_t asn_SPC_ABSInformation_specs_1 = {
-	sizeof(struct ABSInformation),
-	offsetof(struct ABSInformation, _asn_ctx),
-	offsetof(struct ABSInformation, present),
-	sizeof(((struct ABSInformation *)0)->present),
-	asn_MAP_ABSInformation_tag2el_1,
-	3,	/* Count of tags in the map */
-	0, 0,
-	3	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_ABSInformation = {
-	"ABSInformation",
-	"ABSInformation",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_ABSInformation_constr_1, CHOICE_constraint },
-	asn_MBR_ABSInformation_1,
-	3,	/* Elements count */
-	&asn_SPC_ABSInformation_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ABSInformation.h b/3rdparty/libe2ap/ABSInformation.h
deleted file mode 100644
index 0632fd9..0000000
--- a/3rdparty/libe2ap/ABSInformation.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ABSInformation_H_
-#define	_ABSInformation_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ABSInformationFDD.h"
-#include "ABSInformationTDD.h"
-#include "NULL.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum ABSInformation_PR {
-	ABSInformation_PR_NOTHING,	/* No components present */
-	ABSInformation_PR_fdd,
-	ABSInformation_PR_tdd,
-	ABSInformation_PR_abs_inactive
-	/* Extensions may appear below */
-	
-} ABSInformation_PR;
-
-/* ABSInformation */
-typedef struct ABSInformation {
-	ABSInformation_PR present;
-	union ABSInformation_u {
-		ABSInformationFDD_t	 fdd;
-		ABSInformationTDD_t	 tdd;
-		NULL_t	 abs_inactive;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ABSInformation_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ABSInformation;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ABSInformation_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ABSInformationFDD.c b/3rdparty/libe2ap/ABSInformationFDD.c
deleted file mode 100644
index c783237..0000000
--- a/3rdparty/libe2ap/ABSInformationFDD.c
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ABSInformationFDD.h"
-
-#include "ProtocolExtensionContainer.h"
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static int
-memb_abs_pattern_info_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 40)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_measurement_subset_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 40)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_type_numberOfCellSpecificAntennaPorts_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_abs_pattern_info_constr_2 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  40,  40 }	/* (SIZE(40..40)) */,
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_measurement_subset_constr_8 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  40,  40 }	/* (SIZE(40..40)) */,
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_numberOfCellSpecificAntennaPorts_value2enum_3[] = {
-	{ 0,	3,	"one" },
-	{ 1,	3,	"two" },
-	{ 2,	4,	"four" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_numberOfCellSpecificAntennaPorts_enum2value_3[] = {
-	2,	/* four(2) */
-	0,	/* one(0) */
-	1	/* two(1) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_numberOfCellSpecificAntennaPorts_specs_3 = {
-	asn_MAP_numberOfCellSpecificAntennaPorts_value2enum_3,	/* "tag" => N; sorted by tag */
-	asn_MAP_numberOfCellSpecificAntennaPorts_enum2value_3,	/* N => "tag"; sorted by N */
-	3,	/* Number of elements in the maps */
-	4,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_numberOfCellSpecificAntennaPorts_tags_3[] = {
-	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_numberOfCellSpecificAntennaPorts_3 = {
-	"numberOfCellSpecificAntennaPorts",
-	"numberOfCellSpecificAntennaPorts",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_numberOfCellSpecificAntennaPorts_tags_3,
-	sizeof(asn_DEF_numberOfCellSpecificAntennaPorts_tags_3)
-		/sizeof(asn_DEF_numberOfCellSpecificAntennaPorts_tags_3[0]) - 1, /* 1 */
-	asn_DEF_numberOfCellSpecificAntennaPorts_tags_3,	/* Same as above */
-	sizeof(asn_DEF_numberOfCellSpecificAntennaPorts_tags_3)
-		/sizeof(asn_DEF_numberOfCellSpecificAntennaPorts_tags_3[0]), /* 2 */
-	{ 0, &asn_PER_type_numberOfCellSpecificAntennaPorts_constr_3, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_numberOfCellSpecificAntennaPorts_specs_3	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ABSInformationFDD_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformationFDD, abs_pattern_info),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_abs_pattern_info_constr_2,  memb_abs_pattern_info_constraint_1 },
-		0, 0, /* No default value */
-		"abs-pattern-info"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformationFDD, numberOfCellSpecificAntennaPorts),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_numberOfCellSpecificAntennaPorts_3,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"numberOfCellSpecificAntennaPorts"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformationFDD, measurement_subset),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_measurement_subset_constr_8,  memb_measurement_subset_constraint_1 },
-		0, 0, /* No default value */
-		"measurement-subset"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ABSInformationFDD, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P20,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_ABSInformationFDD_oms_1[] = { 3 };
-static const ber_tlv_tag_t asn_DEF_ABSInformationFDD_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ABSInformationFDD_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* abs-pattern-info */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* numberOfCellSpecificAntennaPorts */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* measurement-subset */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ABSInformationFDD_specs_1 = {
-	sizeof(struct ABSInformationFDD),
-	offsetof(struct ABSInformationFDD, _asn_ctx),
-	asn_MAP_ABSInformationFDD_tag2el_1,
-	4,	/* Count of tags in the map */
-	asn_MAP_ABSInformationFDD_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ABSInformationFDD = {
-	"ABSInformationFDD",
-	"ABSInformationFDD",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ABSInformationFDD_tags_1,
-	sizeof(asn_DEF_ABSInformationFDD_tags_1)
-		/sizeof(asn_DEF_ABSInformationFDD_tags_1[0]), /* 1 */
-	asn_DEF_ABSInformationFDD_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ABSInformationFDD_tags_1)
-		/sizeof(asn_DEF_ABSInformationFDD_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ABSInformationFDD_1,
-	4,	/* Elements count */
-	&asn_SPC_ABSInformationFDD_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ABSInformationFDD.h b/3rdparty/libe2ap/ABSInformationFDD.h
deleted file mode 100644
index d2bb545..0000000
--- a/3rdparty/libe2ap/ABSInformationFDD.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ABSInformationFDD_H_
-#define	_ABSInformationFDD_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-#include "NativeEnumerated.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum ABSInformationFDD__numberOfCellSpecificAntennaPorts {
-	ABSInformationFDD__numberOfCellSpecificAntennaPorts_one	= 0,
-	ABSInformationFDD__numberOfCellSpecificAntennaPorts_two	= 1,
-	ABSInformationFDD__numberOfCellSpecificAntennaPorts_four	= 2
-	/*
-	 * Enumeration is extensible
-	 */
-} e_ABSInformationFDD__numberOfCellSpecificAntennaPorts;
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* ABSInformationFDD */
-typedef struct ABSInformationFDD {
-	BIT_STRING_t	 abs_pattern_info;
-	long	 numberOfCellSpecificAntennaPorts;
-	BIT_STRING_t	 measurement_subset;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ABSInformationFDD_t;
-
-/* Implementation */
-/* extern asn_TYPE_descriptor_t asn_DEF_numberOfCellSpecificAntennaPorts_3;	// (Use -fall-defs-global to expose) */
-extern asn_TYPE_descriptor_t asn_DEF_ABSInformationFDD;
-extern asn_SEQUENCE_specifics_t asn_SPC_ABSInformationFDD_specs_1;
-extern asn_TYPE_member_t asn_MBR_ABSInformationFDD_1[4];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ABSInformationFDD_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ABSInformationTDD.c b/3rdparty/libe2ap/ABSInformationTDD.c
deleted file mode 100644
index 71eeed5..0000000
--- a/3rdparty/libe2ap/ABSInformationTDD.c
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ABSInformationTDD.h"
-
-#include "ProtocolExtensionContainer.h"
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static int
-memb_abs_pattern_info_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size >= 1 && size <= 70)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_measurement_subset_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size >= 1 && size <= 70)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_type_numberOfCellSpecificAntennaPorts_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_abs_pattern_info_constr_2 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  7,  7,  1,  70 }	/* (SIZE(1..70,...)) */,
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_measurement_subset_constr_8 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  7,  7,  1,  70 }	/* (SIZE(1..70,...)) */,
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_numberOfCellSpecificAntennaPorts_value2enum_3[] = {
-	{ 0,	3,	"one" },
-	{ 1,	3,	"two" },
-	{ 2,	4,	"four" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_numberOfCellSpecificAntennaPorts_enum2value_3[] = {
-	2,	/* four(2) */
-	0,	/* one(0) */
-	1	/* two(1) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_numberOfCellSpecificAntennaPorts_specs_3 = {
-	asn_MAP_numberOfCellSpecificAntennaPorts_value2enum_3,	/* "tag" => N; sorted by tag */
-	asn_MAP_numberOfCellSpecificAntennaPorts_enum2value_3,	/* N => "tag"; sorted by N */
-	3,	/* Number of elements in the maps */
-	4,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_numberOfCellSpecificAntennaPorts_tags_3[] = {
-	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_numberOfCellSpecificAntennaPorts_3 = {
-	"numberOfCellSpecificAntennaPorts",
-	"numberOfCellSpecificAntennaPorts",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_numberOfCellSpecificAntennaPorts_tags_3,
-	sizeof(asn_DEF_numberOfCellSpecificAntennaPorts_tags_3)
-		/sizeof(asn_DEF_numberOfCellSpecificAntennaPorts_tags_3[0]) - 1, /* 1 */
-	asn_DEF_numberOfCellSpecificAntennaPorts_tags_3,	/* Same as above */
-	sizeof(asn_DEF_numberOfCellSpecificAntennaPorts_tags_3)
-		/sizeof(asn_DEF_numberOfCellSpecificAntennaPorts_tags_3[0]), /* 2 */
-	{ 0, &asn_PER_type_numberOfCellSpecificAntennaPorts_constr_3, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_numberOfCellSpecificAntennaPorts_specs_3	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ABSInformationTDD_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformationTDD, abs_pattern_info),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_abs_pattern_info_constr_2,  memb_abs_pattern_info_constraint_1 },
-		0, 0, /* No default value */
-		"abs-pattern-info"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformationTDD, numberOfCellSpecificAntennaPorts),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_numberOfCellSpecificAntennaPorts_3,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"numberOfCellSpecificAntennaPorts"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformationTDD, measurement_subset),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_measurement_subset_constr_8,  memb_measurement_subset_constraint_1 },
-		0, 0, /* No default value */
-		"measurement-subset"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ABSInformationTDD, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P21,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_ABSInformationTDD_oms_1[] = { 3 };
-static const ber_tlv_tag_t asn_DEF_ABSInformationTDD_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ABSInformationTDD_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* abs-pattern-info */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* numberOfCellSpecificAntennaPorts */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* measurement-subset */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ABSInformationTDD_specs_1 = {
-	sizeof(struct ABSInformationTDD),
-	offsetof(struct ABSInformationTDD, _asn_ctx),
-	asn_MAP_ABSInformationTDD_tag2el_1,
-	4,	/* Count of tags in the map */
-	asn_MAP_ABSInformationTDD_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ABSInformationTDD = {
-	"ABSInformationTDD",
-	"ABSInformationTDD",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ABSInformationTDD_tags_1,
-	sizeof(asn_DEF_ABSInformationTDD_tags_1)
-		/sizeof(asn_DEF_ABSInformationTDD_tags_1[0]), /* 1 */
-	asn_DEF_ABSInformationTDD_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ABSInformationTDD_tags_1)
-		/sizeof(asn_DEF_ABSInformationTDD_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ABSInformationTDD_1,
-	4,	/* Elements count */
-	&asn_SPC_ABSInformationTDD_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ABSInformationTDD.h b/3rdparty/libe2ap/ABSInformationTDD.h
deleted file mode 100644
index cc88659..0000000
--- a/3rdparty/libe2ap/ABSInformationTDD.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ABSInformationTDD_H_
-#define	_ABSInformationTDD_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-#include "NativeEnumerated.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum ABSInformationTDD__numberOfCellSpecificAntennaPorts {
-	ABSInformationTDD__numberOfCellSpecificAntennaPorts_one	= 0,
-	ABSInformationTDD__numberOfCellSpecificAntennaPorts_two	= 1,
-	ABSInformationTDD__numberOfCellSpecificAntennaPorts_four	= 2
-	/*
-	 * Enumeration is extensible
-	 */
-} e_ABSInformationTDD__numberOfCellSpecificAntennaPorts;
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* ABSInformationTDD */
-typedef struct ABSInformationTDD {
-	BIT_STRING_t	 abs_pattern_info;
-	long	 numberOfCellSpecificAntennaPorts;
-	BIT_STRING_t	 measurement_subset;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ABSInformationTDD_t;
-
-/* Implementation */
-/* extern asn_TYPE_descriptor_t asn_DEF_numberOfCellSpecificAntennaPorts_3;	// (Use -fall-defs-global to expose) */
-extern asn_TYPE_descriptor_t asn_DEF_ABSInformationTDD;
-extern asn_SEQUENCE_specifics_t asn_SPC_ABSInformationTDD_specs_1;
-extern asn_TYPE_member_t asn_MBR_ABSInformationTDD_1[4];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ABSInformationTDD_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ActionParameter-ID.c b/3rdparty/libe2ap/ActionParameter-ID.c
deleted file mode 100644
index 76f821f..0000000
--- a/3rdparty/libe2ap/ActionParameter-ID.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ActionParameter-ID.h"
-
-int
-ActionParameter_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 255)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_ActionParameter_ID_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 8,  8,  0,  255 }	/* (0..255) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_ActionParameter_ID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ActionParameter_ID = {
-	"ActionParameter-ID",
-	"ActionParameter-ID",
-	&asn_OP_NativeInteger,
-	asn_DEF_ActionParameter_ID_tags_1,
-	sizeof(asn_DEF_ActionParameter_ID_tags_1)
-		/sizeof(asn_DEF_ActionParameter_ID_tags_1[0]), /* 1 */
-	asn_DEF_ActionParameter_ID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ActionParameter_ID_tags_1)
-		/sizeof(asn_DEF_ActionParameter_ID_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ActionParameter_ID_constr_1, ActionParameter_ID_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/ActionParameter-ID.h b/3rdparty/libe2ap/ActionParameter-ID.h
deleted file mode 100644
index b15eeaf..0000000
--- a/3rdparty/libe2ap/ActionParameter-ID.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ActionParameter_ID_H_
-#define	_ActionParameter_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ActionParameter-ID */
-typedef long	 ActionParameter_ID_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_ActionParameter_ID_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_ActionParameter_ID;
-asn_struct_free_f ActionParameter_ID_free;
-asn_struct_print_f ActionParameter_ID_print;
-asn_constr_check_f ActionParameter_ID_constraint;
-ber_type_decoder_f ActionParameter_ID_decode_ber;
-der_type_encoder_f ActionParameter_ID_encode_der;
-xer_type_decoder_f ActionParameter_ID_decode_xer;
-xer_type_encoder_f ActionParameter_ID_encode_xer;
-per_type_decoder_f ActionParameter_ID_decode_uper;
-per_type_encoder_f ActionParameter_ID_encode_uper;
-per_type_decoder_f ActionParameter_ID_decode_aper;
-per_type_encoder_f ActionParameter_ID_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ActionParameter_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ActionParameter-Item.c b/3rdparty/libe2ap/ActionParameter-Item.c
deleted file mode 100644
index 5114860..0000000
--- a/3rdparty/libe2ap/ActionParameter-Item.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ActionParameter-Item.h"
-
-asn_TYPE_member_t asn_MBR_ActionParameter_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ActionParameter_Item, actionParameter_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ActionParameter_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"actionParameter-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ActionParameter_Item, actionParameter_Value),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_ActionParameter_Value,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"actionParameter-Value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ActionParameter_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ActionParameter_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* actionParameter-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* actionParameter-Value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ActionParameter_Item_specs_1 = {
-	sizeof(struct ActionParameter_Item),
-	offsetof(struct ActionParameter_Item, _asn_ctx),
-	asn_MAP_ActionParameter_Item_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ActionParameter_Item = {
-	"ActionParameter-Item",
-	"ActionParameter-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ActionParameter_Item_tags_1,
-	sizeof(asn_DEF_ActionParameter_Item_tags_1)
-		/sizeof(asn_DEF_ActionParameter_Item_tags_1[0]), /* 1 */
-	asn_DEF_ActionParameter_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ActionParameter_Item_tags_1)
-		/sizeof(asn_DEF_ActionParameter_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ActionParameter_Item_1,
-	2,	/* Elements count */
-	&asn_SPC_ActionParameter_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ActionParameter-Item.h b/3rdparty/libe2ap/ActionParameter-Item.h
deleted file mode 100644
index 7a0364a..0000000
--- a/3rdparty/libe2ap/ActionParameter-Item.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ActionParameter_Item_H_
-#define	_ActionParameter_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ActionParameter-ID.h"
-#include "ActionParameter-Value.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ActionParameter-Item */
-typedef struct ActionParameter_Item {
-	ActionParameter_ID_t	 actionParameter_ID;
-	ActionParameter_Value_t	 actionParameter_Value;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ActionParameter_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ActionParameter_Item;
-extern asn_SEQUENCE_specifics_t asn_SPC_ActionParameter_Item_specs_1;
-extern asn_TYPE_member_t asn_MBR_ActionParameter_Item_1[2];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ActionParameter_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ActionParameter-Value.c b/3rdparty/libe2ap/ActionParameter-Value.c
deleted file mode 100644
index 07f724e..0000000
--- a/3rdparty/libe2ap/ActionParameter-Value.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ActionParameter-Value.h"
-
-asn_per_constraints_t asn_PER_type_ActionParameter_Value_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  5 }	/* (0..5,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_ActionParameter_Value_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ActionParameter_Value, choice.valueInt),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"valueInt"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ActionParameter_Value, choice.valueEnum),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"valueEnum"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ActionParameter_Value, choice.valueBool),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BOOLEAN,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"valueBool"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ActionParameter_Value, choice.valueBitS),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"valueBitS"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ActionParameter_Value, choice.valueOctS),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_OCTET_STRING,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"valueOctS"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ActionParameter_Value, choice.valuePrtS),
-		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_PrintableString,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"valuePrtS"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_ActionParameter_Value_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* valueInt */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* valueEnum */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* valueBool */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* valueBitS */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* valueOctS */
-    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* valuePrtS */
-};
-asn_CHOICE_specifics_t asn_SPC_ActionParameter_Value_specs_1 = {
-	sizeof(struct ActionParameter_Value),
-	offsetof(struct ActionParameter_Value, _asn_ctx),
-	offsetof(struct ActionParameter_Value, present),
-	sizeof(((struct ActionParameter_Value *)0)->present),
-	asn_MAP_ActionParameter_Value_tag2el_1,
-	6,	/* Count of tags in the map */
-	0, 0,
-	6	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_ActionParameter_Value = {
-	"ActionParameter-Value",
-	"ActionParameter-Value",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_ActionParameter_Value_constr_1, CHOICE_constraint },
-	asn_MBR_ActionParameter_Value_1,
-	6,	/* Elements count */
-	&asn_SPC_ActionParameter_Value_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ActionParameter-Value.h b/3rdparty/libe2ap/ActionParameter-Value.h
deleted file mode 100644
index 9074e2d..0000000
--- a/3rdparty/libe2ap/ActionParameter-Value.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ActionParameter_Value_H_
-#define	_ActionParameter_Value_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "BOOLEAN.h"
-#include "BIT_STRING.h"
-#include "OCTET_STRING.h"
-#include "PrintableString.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum ActionParameter_Value_PR {
-	ActionParameter_Value_PR_NOTHING,	/* No components present */
-	ActionParameter_Value_PR_valueInt,
-	ActionParameter_Value_PR_valueEnum,
-	ActionParameter_Value_PR_valueBool,
-	ActionParameter_Value_PR_valueBitS,
-	ActionParameter_Value_PR_valueOctS,
-	ActionParameter_Value_PR_valuePrtS
-	/* Extensions may appear below */
-	
-} ActionParameter_Value_PR;
-
-/* ActionParameter-Value */
-typedef struct ActionParameter_Value {
-	ActionParameter_Value_PR present;
-	union ActionParameter_Value_u {
-		long	 valueInt;
-		long	 valueEnum;
-		BOOLEAN_t	 valueBool;
-		BIT_STRING_t	 valueBitS;
-		OCTET_STRING_t	 valueOctS;
-		PrintableString_t	 valuePrtS;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ActionParameter_Value_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ActionParameter_Value;
-extern asn_CHOICE_specifics_t asn_SPC_ActionParameter_Value_specs_1;
-extern asn_TYPE_member_t asn_MBR_ActionParameter_Value_1[6];
-extern asn_per_constraints_t asn_PER_type_ActionParameter_Value_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ActionParameter_Value_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/AdditionalSpecialSubframe-Info.c b/3rdparty/libe2ap/AdditionalSpecialSubframe-Info.c
deleted file mode 100644
index b7792b5..0000000
--- a/3rdparty/libe2ap/AdditionalSpecialSubframe-Info.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "AdditionalSpecialSubframe-Info.h"
-
-#include "ProtocolExtensionContainer.h"
-static asn_TYPE_member_t asn_MBR_AdditionalSpecialSubframe_Info_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframe_Info, additionalspecialSubframePatterns),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_AdditionalSpecialSubframePatterns,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"additionalspecialSubframePatterns"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframe_Info, cyclicPrefixDL),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CyclicPrefixDL,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cyclicPrefixDL"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframe_Info, cyclicPrefixUL),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CyclicPrefixUL,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cyclicPrefixUL"
-		},
-	{ ATF_POINTER, 1, offsetof(struct AdditionalSpecialSubframe_Info, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P23,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_AdditionalSpecialSubframe_Info_oms_1[] = { 3 };
-static const ber_tlv_tag_t asn_DEF_AdditionalSpecialSubframe_Info_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_AdditionalSpecialSubframe_Info_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* additionalspecialSubframePatterns */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cyclicPrefixDL */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* cyclicPrefixUL */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_AdditionalSpecialSubframe_Info_specs_1 = {
-	sizeof(struct AdditionalSpecialSubframe_Info),
-	offsetof(struct AdditionalSpecialSubframe_Info, _asn_ctx),
-	asn_MAP_AdditionalSpecialSubframe_Info_tag2el_1,
-	4,	/* Count of tags in the map */
-	asn_MAP_AdditionalSpecialSubframe_Info_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_AdditionalSpecialSubframe_Info = {
-	"AdditionalSpecialSubframe-Info",
-	"AdditionalSpecialSubframe-Info",
-	&asn_OP_SEQUENCE,
-	asn_DEF_AdditionalSpecialSubframe_Info_tags_1,
-	sizeof(asn_DEF_AdditionalSpecialSubframe_Info_tags_1)
-		/sizeof(asn_DEF_AdditionalSpecialSubframe_Info_tags_1[0]), /* 1 */
-	asn_DEF_AdditionalSpecialSubframe_Info_tags_1,	/* Same as above */
-	sizeof(asn_DEF_AdditionalSpecialSubframe_Info_tags_1)
-		/sizeof(asn_DEF_AdditionalSpecialSubframe_Info_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_AdditionalSpecialSubframe_Info_1,
-	4,	/* Elements count */
-	&asn_SPC_AdditionalSpecialSubframe_Info_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/AdditionalSpecialSubframe-Info.h b/3rdparty/libe2ap/AdditionalSpecialSubframe-Info.h
deleted file mode 100644
index e50f1f6..0000000
--- a/3rdparty/libe2ap/AdditionalSpecialSubframe-Info.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_AdditionalSpecialSubframe_Info_H_
-#define	_AdditionalSpecialSubframe_Info_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "AdditionalSpecialSubframePatterns.h"
-#include "CyclicPrefixDL.h"
-#include "CyclicPrefixUL.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* AdditionalSpecialSubframe-Info */
-typedef struct AdditionalSpecialSubframe_Info {
-	AdditionalSpecialSubframePatterns_t	 additionalspecialSubframePatterns;
-	CyclicPrefixDL_t	 cyclicPrefixDL;
-	CyclicPrefixUL_t	 cyclicPrefixUL;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} AdditionalSpecialSubframe_Info_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_AdditionalSpecialSubframe_Info;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _AdditionalSpecialSubframe_Info_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/AdditionalSpecialSubframeExtension-Info.c b/3rdparty/libe2ap/AdditionalSpecialSubframeExtension-Info.c
deleted file mode 100644
index a5a71f0..0000000
--- a/3rdparty/libe2ap/AdditionalSpecialSubframeExtension-Info.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "AdditionalSpecialSubframeExtension-Info.h"
-
-#include "ProtocolExtensionContainer.h"
-static asn_TYPE_member_t asn_MBR_AdditionalSpecialSubframeExtension_Info_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframeExtension_Info, additionalspecialSubframePatternsExtension),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_AdditionalSpecialSubframePatternsExtension,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"additionalspecialSubframePatternsExtension"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframeExtension_Info, cyclicPrefixDL),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CyclicPrefixDL,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cyclicPrefixDL"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframeExtension_Info, cyclicPrefixUL),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CyclicPrefixUL,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cyclicPrefixUL"
-		},
-	{ ATF_POINTER, 1, offsetof(struct AdditionalSpecialSubframeExtension_Info, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P24,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_AdditionalSpecialSubframeExtension_Info_oms_1[] = { 3 };
-static const ber_tlv_tag_t asn_DEF_AdditionalSpecialSubframeExtension_Info_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_AdditionalSpecialSubframeExtension_Info_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* additionalspecialSubframePatternsExtension */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cyclicPrefixDL */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* cyclicPrefixUL */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_AdditionalSpecialSubframeExtension_Info_specs_1 = {
-	sizeof(struct AdditionalSpecialSubframeExtension_Info),
-	offsetof(struct AdditionalSpecialSubframeExtension_Info, _asn_ctx),
-	asn_MAP_AdditionalSpecialSubframeExtension_Info_tag2el_1,
-	4,	/* Count of tags in the map */
-	asn_MAP_AdditionalSpecialSubframeExtension_Info_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_AdditionalSpecialSubframeExtension_Info = {
-	"AdditionalSpecialSubframeExtension-Info",
-	"AdditionalSpecialSubframeExtension-Info",
-	&asn_OP_SEQUENCE,
-	asn_DEF_AdditionalSpecialSubframeExtension_Info_tags_1,
-	sizeof(asn_DEF_AdditionalSpecialSubframeExtension_Info_tags_1)
-		/sizeof(asn_DEF_AdditionalSpecialSubframeExtension_Info_tags_1[0]), /* 1 */
-	asn_DEF_AdditionalSpecialSubframeExtension_Info_tags_1,	/* Same as above */
-	sizeof(asn_DEF_AdditionalSpecialSubframeExtension_Info_tags_1)
-		/sizeof(asn_DEF_AdditionalSpecialSubframeExtension_Info_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_AdditionalSpecialSubframeExtension_Info_1,
-	4,	/* Elements count */
-	&asn_SPC_AdditionalSpecialSubframeExtension_Info_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/AdditionalSpecialSubframeExtension-Info.h b/3rdparty/libe2ap/AdditionalSpecialSubframeExtension-Info.h
deleted file mode 100644
index e1f8bfd..0000000
--- a/3rdparty/libe2ap/AdditionalSpecialSubframeExtension-Info.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_AdditionalSpecialSubframeExtension_Info_H_
-#define	_AdditionalSpecialSubframeExtension_Info_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "AdditionalSpecialSubframePatternsExtension.h"
-#include "CyclicPrefixDL.h"
-#include "CyclicPrefixUL.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* AdditionalSpecialSubframeExtension-Info */
-typedef struct AdditionalSpecialSubframeExtension_Info {
-	AdditionalSpecialSubframePatternsExtension_t	 additionalspecialSubframePatternsExtension;
-	CyclicPrefixDL_t	 cyclicPrefixDL;
-	CyclicPrefixUL_t	 cyclicPrefixUL;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} AdditionalSpecialSubframeExtension_Info_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_AdditionalSpecialSubframeExtension_Info;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _AdditionalSpecialSubframeExtension_Info_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/AdditionalSpecialSubframePatterns.c b/3rdparty/libe2ap/AdditionalSpecialSubframePatterns.c
deleted file mode 100644
index 8c18c51..0000000
--- a/3rdparty/libe2ap/AdditionalSpecialSubframePatterns.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "AdditionalSpecialSubframePatterns.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_AdditionalSpecialSubframePatterns_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  4,  4,  0,  9 }	/* (0..9,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_AdditionalSpecialSubframePatterns_value2enum_1[] = {
-	{ 0,	4,	"ssp0" },
-	{ 1,	4,	"ssp1" },
-	{ 2,	4,	"ssp2" },
-	{ 3,	4,	"ssp3" },
-	{ 4,	4,	"ssp4" },
-	{ 5,	4,	"ssp5" },
-	{ 6,	4,	"ssp6" },
-	{ 7,	4,	"ssp7" },
-	{ 8,	4,	"ssp8" },
-	{ 9,	4,	"ssp9" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_AdditionalSpecialSubframePatterns_enum2value_1[] = {
-	0,	/* ssp0(0) */
-	1,	/* ssp1(1) */
-	2,	/* ssp2(2) */
-	3,	/* ssp3(3) */
-	4,	/* ssp4(4) */
-	5,	/* ssp5(5) */
-	6,	/* ssp6(6) */
-	7,	/* ssp7(7) */
-	8,	/* ssp8(8) */
-	9	/* ssp9(9) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_AdditionalSpecialSubframePatterns_specs_1 = {
-	asn_MAP_AdditionalSpecialSubframePatterns_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_AdditionalSpecialSubframePatterns_enum2value_1,	/* N => "tag"; sorted by N */
-	10,	/* Number of elements in the maps */
-	11,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_AdditionalSpecialSubframePatterns_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_AdditionalSpecialSubframePatterns = {
-	"AdditionalSpecialSubframePatterns",
-	"AdditionalSpecialSubframePatterns",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_AdditionalSpecialSubframePatterns_tags_1,
-	sizeof(asn_DEF_AdditionalSpecialSubframePatterns_tags_1)
-		/sizeof(asn_DEF_AdditionalSpecialSubframePatterns_tags_1[0]), /* 1 */
-	asn_DEF_AdditionalSpecialSubframePatterns_tags_1,	/* Same as above */
-	sizeof(asn_DEF_AdditionalSpecialSubframePatterns_tags_1)
-		/sizeof(asn_DEF_AdditionalSpecialSubframePatterns_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_AdditionalSpecialSubframePatterns_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_AdditionalSpecialSubframePatterns_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/AdditionalSpecialSubframePatterns.h b/3rdparty/libe2ap/AdditionalSpecialSubframePatterns.h
deleted file mode 100644
index 056ddd4..0000000
--- a/3rdparty/libe2ap/AdditionalSpecialSubframePatterns.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_AdditionalSpecialSubframePatterns_H_
-#define	_AdditionalSpecialSubframePatterns_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum AdditionalSpecialSubframePatterns {
-	AdditionalSpecialSubframePatterns_ssp0	= 0,
-	AdditionalSpecialSubframePatterns_ssp1	= 1,
-	AdditionalSpecialSubframePatterns_ssp2	= 2,
-	AdditionalSpecialSubframePatterns_ssp3	= 3,
-	AdditionalSpecialSubframePatterns_ssp4	= 4,
-	AdditionalSpecialSubframePatterns_ssp5	= 5,
-	AdditionalSpecialSubframePatterns_ssp6	= 6,
-	AdditionalSpecialSubframePatterns_ssp7	= 7,
-	AdditionalSpecialSubframePatterns_ssp8	= 8,
-	AdditionalSpecialSubframePatterns_ssp9	= 9
-	/*
-	 * Enumeration is extensible
-	 */
-} e_AdditionalSpecialSubframePatterns;
-
-/* AdditionalSpecialSubframePatterns */
-typedef long	 AdditionalSpecialSubframePatterns_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_AdditionalSpecialSubframePatterns_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_AdditionalSpecialSubframePatterns;
-extern const asn_INTEGER_specifics_t asn_SPC_AdditionalSpecialSubframePatterns_specs_1;
-asn_struct_free_f AdditionalSpecialSubframePatterns_free;
-asn_struct_print_f AdditionalSpecialSubframePatterns_print;
-asn_constr_check_f AdditionalSpecialSubframePatterns_constraint;
-ber_type_decoder_f AdditionalSpecialSubframePatterns_decode_ber;
-der_type_encoder_f AdditionalSpecialSubframePatterns_encode_der;
-xer_type_decoder_f AdditionalSpecialSubframePatterns_decode_xer;
-xer_type_encoder_f AdditionalSpecialSubframePatterns_encode_xer;
-per_type_decoder_f AdditionalSpecialSubframePatterns_decode_uper;
-per_type_encoder_f AdditionalSpecialSubframePatterns_encode_uper;
-per_type_decoder_f AdditionalSpecialSubframePatterns_decode_aper;
-per_type_encoder_f AdditionalSpecialSubframePatterns_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _AdditionalSpecialSubframePatterns_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/AdditionalSpecialSubframePatternsExtension.c b/3rdparty/libe2ap/AdditionalSpecialSubframePatternsExtension.c
deleted file mode 100644
index fd4bb86..0000000
--- a/3rdparty/libe2ap/AdditionalSpecialSubframePatternsExtension.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "AdditionalSpecialSubframePatternsExtension.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_AdditionalSpecialSubframePatternsExtension_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_AdditionalSpecialSubframePatternsExtension_value2enum_1[] = {
-	{ 0,	5,	"ssp10" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_AdditionalSpecialSubframePatternsExtension_enum2value_1[] = {
-	0	/* ssp10(0) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_AdditionalSpecialSubframePatternsExtension_specs_1 = {
-	asn_MAP_AdditionalSpecialSubframePatternsExtension_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_AdditionalSpecialSubframePatternsExtension_enum2value_1,	/* N => "tag"; sorted by N */
-	1,	/* Number of elements in the maps */
-	2,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_AdditionalSpecialSubframePatternsExtension_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_AdditionalSpecialSubframePatternsExtension = {
-	"AdditionalSpecialSubframePatternsExtension",
-	"AdditionalSpecialSubframePatternsExtension",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_AdditionalSpecialSubframePatternsExtension_tags_1,
-	sizeof(asn_DEF_AdditionalSpecialSubframePatternsExtension_tags_1)
-		/sizeof(asn_DEF_AdditionalSpecialSubframePatternsExtension_tags_1[0]), /* 1 */
-	asn_DEF_AdditionalSpecialSubframePatternsExtension_tags_1,	/* Same as above */
-	sizeof(asn_DEF_AdditionalSpecialSubframePatternsExtension_tags_1)
-		/sizeof(asn_DEF_AdditionalSpecialSubframePatternsExtension_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_AdditionalSpecialSubframePatternsExtension_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_AdditionalSpecialSubframePatternsExtension_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/AdditionalSpecialSubframePatternsExtension.h b/3rdparty/libe2ap/AdditionalSpecialSubframePatternsExtension.h
deleted file mode 100644
index 7e18880..0000000
--- a/3rdparty/libe2ap/AdditionalSpecialSubframePatternsExtension.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_AdditionalSpecialSubframePatternsExtension_H_
-#define	_AdditionalSpecialSubframePatternsExtension_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum AdditionalSpecialSubframePatternsExtension {
-	AdditionalSpecialSubframePatternsExtension_ssp10	= 0
-	/*
-	 * Enumeration is extensible
-	 */
-} e_AdditionalSpecialSubframePatternsExtension;
-
-/* AdditionalSpecialSubframePatternsExtension */
-typedef long	 AdditionalSpecialSubframePatternsExtension_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_AdditionalSpecialSubframePatternsExtension_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_AdditionalSpecialSubframePatternsExtension;
-extern const asn_INTEGER_specifics_t asn_SPC_AdditionalSpecialSubframePatternsExtension_specs_1;
-asn_struct_free_f AdditionalSpecialSubframePatternsExtension_free;
-asn_struct_print_f AdditionalSpecialSubframePatternsExtension_print;
-asn_constr_check_f AdditionalSpecialSubframePatternsExtension_constraint;
-ber_type_decoder_f AdditionalSpecialSubframePatternsExtension_decode_ber;
-der_type_encoder_f AdditionalSpecialSubframePatternsExtension_encode_der;
-xer_type_decoder_f AdditionalSpecialSubframePatternsExtension_decode_xer;
-xer_type_encoder_f AdditionalSpecialSubframePatternsExtension_encode_xer;
-per_type_decoder_f AdditionalSpecialSubframePatternsExtension_decode_uper;
-per_type_encoder_f AdditionalSpecialSubframePatternsExtension_encode_uper;
-per_type_decoder_f AdditionalSpecialSubframePatternsExtension_decode_aper;
-per_type_encoder_f AdditionalSpecialSubframePatternsExtension_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _AdditionalSpecialSubframePatternsExtension_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/BandInfo.c b/3rdparty/libe2ap/BandInfo.c
deleted file mode 100644
index 186b51e..0000000
--- a/3rdparty/libe2ap/BandInfo.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "BandInfo.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_BandInfo_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct BandInfo, freqBandIndicator),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_FreqBandIndicator,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"freqBandIndicator"
-		},
-	{ ATF_POINTER, 1, offsetof(struct BandInfo, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P50,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_BandInfo_oms_1[] = { 1 };
-static const ber_tlv_tag_t asn_DEF_BandInfo_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_BandInfo_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* freqBandIndicator */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_BandInfo_specs_1 = {
-	sizeof(struct BandInfo),
-	offsetof(struct BandInfo, _asn_ctx),
-	asn_MAP_BandInfo_tag2el_1,
-	2,	/* Count of tags in the map */
-	asn_MAP_BandInfo_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_BandInfo = {
-	"BandInfo",
-	"BandInfo",
-	&asn_OP_SEQUENCE,
-	asn_DEF_BandInfo_tags_1,
-	sizeof(asn_DEF_BandInfo_tags_1)
-		/sizeof(asn_DEF_BandInfo_tags_1[0]), /* 1 */
-	asn_DEF_BandInfo_tags_1,	/* Same as above */
-	sizeof(asn_DEF_BandInfo_tags_1)
-		/sizeof(asn_DEF_BandInfo_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_BandInfo_1,
-	2,	/* Elements count */
-	&asn_SPC_BandInfo_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/BandInfo.h b/3rdparty/libe2ap/BandInfo.h
deleted file mode 100644
index 070f16c..0000000
--- a/3rdparty/libe2ap/BandInfo.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_BandInfo_H_
-#define	_BandInfo_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "FreqBandIndicator.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* BandInfo */
-typedef struct BandInfo {
-	FreqBandIndicator_t	 freqBandIndicator;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} BandInfo_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_BandInfo;
-extern asn_SEQUENCE_specifics_t asn_SPC_BandInfo_specs_1;
-extern asn_TYPE_member_t asn_MBR_BandInfo_1[2];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _BandInfo_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/BandwidthReducedSI.c b/3rdparty/libe2ap/BandwidthReducedSI.c
deleted file mode 100644
index 03d0d6c..0000000
--- a/3rdparty/libe2ap/BandwidthReducedSI.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "BandwidthReducedSI.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_BandwidthReducedSI_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_BandwidthReducedSI_value2enum_1[] = {
-	{ 0,	9,	"scheduled" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_BandwidthReducedSI_enum2value_1[] = {
-	0	/* scheduled(0) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_BandwidthReducedSI_specs_1 = {
-	asn_MAP_BandwidthReducedSI_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_BandwidthReducedSI_enum2value_1,	/* N => "tag"; sorted by N */
-	1,	/* Number of elements in the maps */
-	2,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_BandwidthReducedSI_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_BandwidthReducedSI = {
-	"BandwidthReducedSI",
-	"BandwidthReducedSI",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_BandwidthReducedSI_tags_1,
-	sizeof(asn_DEF_BandwidthReducedSI_tags_1)
-		/sizeof(asn_DEF_BandwidthReducedSI_tags_1[0]), /* 1 */
-	asn_DEF_BandwidthReducedSI_tags_1,	/* Same as above */
-	sizeof(asn_DEF_BandwidthReducedSI_tags_1)
-		/sizeof(asn_DEF_BandwidthReducedSI_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_BandwidthReducedSI_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_BandwidthReducedSI_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/BandwidthReducedSI.h b/3rdparty/libe2ap/BandwidthReducedSI.h
deleted file mode 100644
index 08d43b4..0000000
--- a/3rdparty/libe2ap/BandwidthReducedSI.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_BandwidthReducedSI_H_
-#define	_BandwidthReducedSI_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum BandwidthReducedSI {
-	BandwidthReducedSI_scheduled	= 0
-	/*
-	 * Enumeration is extensible
-	 */
-} e_BandwidthReducedSI;
-
-/* BandwidthReducedSI */
-typedef long	 BandwidthReducedSI_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_BandwidthReducedSI;
-asn_struct_free_f BandwidthReducedSI_free;
-asn_struct_print_f BandwidthReducedSI_print;
-asn_constr_check_f BandwidthReducedSI_constraint;
-ber_type_decoder_f BandwidthReducedSI_decode_ber;
-der_type_encoder_f BandwidthReducedSI_encode_der;
-xer_type_decoder_f BandwidthReducedSI_decode_xer;
-xer_type_encoder_f BandwidthReducedSI_encode_xer;
-per_type_decoder_f BandwidthReducedSI_decode_uper;
-per_type_encoder_f BandwidthReducedSI_encode_uper;
-per_type_decoder_f BandwidthReducedSI_decode_aper;
-per_type_encoder_f BandwidthReducedSI_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _BandwidthReducedSI_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/BenefitMetric.c b/3rdparty/libe2ap/BenefitMetric.c
deleted file mode 100644
index 7022bcb..0000000
--- a/3rdparty/libe2ap/BenefitMetric.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "BenefitMetric.h"
-
-int
-BenefitMetric_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= -101 && value <= 100)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_BenefitMetric_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  8,  8, -101,  100 }	/* (-101..100,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_BenefitMetric_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_BenefitMetric = {
-	"BenefitMetric",
-	"BenefitMetric",
-	&asn_OP_NativeInteger,
-	asn_DEF_BenefitMetric_tags_1,
-	sizeof(asn_DEF_BenefitMetric_tags_1)
-		/sizeof(asn_DEF_BenefitMetric_tags_1[0]), /* 1 */
-	asn_DEF_BenefitMetric_tags_1,	/* Same as above */
-	sizeof(asn_DEF_BenefitMetric_tags_1)
-		/sizeof(asn_DEF_BenefitMetric_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_BenefitMetric_constr_1, BenefitMetric_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/BenefitMetric.h b/3rdparty/libe2ap/BenefitMetric.h
deleted file mode 100644
index cc8a313..0000000
--- a/3rdparty/libe2ap/BenefitMetric.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_BenefitMetric_H_
-#define	_BenefitMetric_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* BenefitMetric */
-typedef long	 BenefitMetric_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_BenefitMetric_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_BenefitMetric;
-asn_struct_free_f BenefitMetric_free;
-asn_struct_print_f BenefitMetric_print;
-asn_constr_check_f BenefitMetric_constraint;
-ber_type_decoder_f BenefitMetric_decode_ber;
-der_type_encoder_f BenefitMetric_encode_der;
-xer_type_decoder_f BenefitMetric_decode_xer;
-xer_type_encoder_f BenefitMetric_encode_xer;
-per_type_decoder_f BenefitMetric_decode_uper;
-per_type_encoder_f BenefitMetric_encode_uper;
-per_type_decoder_f BenefitMetric_decode_aper;
-per_type_encoder_f BenefitMetric_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _BenefitMetric_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/BroadcastPLMNs-Item.c b/3rdparty/libe2ap/BroadcastPLMNs-Item.c
deleted file mode 100644
index f2c803c..0000000
--- a/3rdparty/libe2ap/BroadcastPLMNs-Item.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "BroadcastPLMNs-Item.h"
-
-asn_per_constraints_t asn_PER_type_BroadcastPLMNs_Item_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 3,  3,  1,  6 }	/* (SIZE(1..6)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_BroadcastPLMNs_Item_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
-		0,
-		&asn_DEF_PLMN_Identity,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_BroadcastPLMNs_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_BroadcastPLMNs_Item_specs_1 = {
-	sizeof(struct BroadcastPLMNs_Item),
-	offsetof(struct BroadcastPLMNs_Item, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_BroadcastPLMNs_Item = {
-	"BroadcastPLMNs-Item",
-	"BroadcastPLMNs-Item",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_BroadcastPLMNs_Item_tags_1,
-	sizeof(asn_DEF_BroadcastPLMNs_Item_tags_1)
-		/sizeof(asn_DEF_BroadcastPLMNs_Item_tags_1[0]), /* 1 */
-	asn_DEF_BroadcastPLMNs_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_BroadcastPLMNs_Item_tags_1)
-		/sizeof(asn_DEF_BroadcastPLMNs_Item_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_BroadcastPLMNs_Item_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_BroadcastPLMNs_Item_1,
-	1,	/* Single element */
-	&asn_SPC_BroadcastPLMNs_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/BroadcastPLMNs-Item.h b/3rdparty/libe2ap/BroadcastPLMNs-Item.h
deleted file mode 100644
index 6365bf0..0000000
--- a/3rdparty/libe2ap/BroadcastPLMNs-Item.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_BroadcastPLMNs_Item_H_
-#define	_BroadcastPLMNs_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "PLMN-Identity.h"
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* BroadcastPLMNs-Item */
-typedef struct BroadcastPLMNs_Item {
-	A_SEQUENCE_OF(PLMN_Identity_t) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} BroadcastPLMNs_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_BroadcastPLMNs_Item;
-extern asn_SET_OF_specifics_t asn_SPC_BroadcastPLMNs_Item_specs_1;
-extern asn_TYPE_member_t asn_MBR_BroadcastPLMNs_Item_1[1];
-extern asn_per_constraints_t asn_PER_type_BroadcastPLMNs_Item_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _BroadcastPLMNs_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CSG-Id.c b/3rdparty/libe2ap/CSG-Id.c
deleted file mode 100644
index 4024aff..0000000
--- a/3rdparty/libe2ap/CSG-Id.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CSG-Id.h"
-
-int
-CSG_Id_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 27)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using BIT_STRING,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_CSG_Id_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  27,  27 }	/* (SIZE(27..27)) */,
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_CSG_Id_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_CSG_Id = {
-	"CSG-Id",
-	"CSG-Id",
-	&asn_OP_BIT_STRING,
-	asn_DEF_CSG_Id_tags_1,
-	sizeof(asn_DEF_CSG_Id_tags_1)
-		/sizeof(asn_DEF_CSG_Id_tags_1[0]), /* 1 */
-	asn_DEF_CSG_Id_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CSG_Id_tags_1)
-		/sizeof(asn_DEF_CSG_Id_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CSG_Id_constr_1, CSG_Id_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_BIT_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CSG-Id.h b/3rdparty/libe2ap/CSG-Id.h
deleted file mode 100644
index 4b34f14..0000000
--- a/3rdparty/libe2ap/CSG-Id.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CSG_Id_H_
-#define	_CSG_Id_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* CSG-Id */
-typedef BIT_STRING_t	 CSG_Id_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CSG_Id;
-asn_struct_free_f CSG_Id_free;
-asn_struct_print_f CSG_Id_print;
-asn_constr_check_f CSG_Id_constraint;
-ber_type_decoder_f CSG_Id_decode_ber;
-der_type_encoder_f CSG_Id_encode_der;
-xer_type_decoder_f CSG_Id_decode_xer;
-xer_type_encoder_f CSG_Id_encode_xer;
-per_type_decoder_f CSG_Id_decode_uper;
-per_type_encoder_f CSG_Id_encode_uper;
-per_type_decoder_f CSG_Id_decode_aper;
-per_type_encoder_f CSG_Id_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CSG_Id_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CSIReportList.c b/3rdparty/libe2ap/CSIReportList.c
deleted file mode 100644
index fdb5586..0000000
--- a/3rdparty/libe2ap/CSIReportList.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CSIReportList.h"
-
-#include "ProtocolExtensionContainer.h"
-static asn_per_constraints_t asn_PER_type_CSIReportList_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 7,  7,  1,  128 }	/* (SIZE(1..128)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_Member_2[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportList__Member, uEID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_UEID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"uEID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportList__Member, cSIReportPerCSIProcess),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CSIReportPerCSIProcess,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cSIReportPerCSIProcess"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CSIReportList__Member, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P35,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_Member_oms_2[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* uEID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cSIReportPerCSIProcess */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
-	sizeof(struct CSIReportList__Member),
-	offsetof(struct CSIReportList__Member, _asn_ctx),
-	asn_MAP_Member_tag2el_2,
-	3,	/* Count of tags in the map */
-	asn_MAP_Member_oms_2,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_Member_2 = {
-	"SEQUENCE",
-	"SEQUENCE",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Member_tags_2,
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	asn_DEF_Member_tags_2,	/* Same as above */
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Member_2,
-	3,	/* Elements count */
-	&asn_SPC_Member_specs_2	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_CSIReportList_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Member_2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CSIReportList_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_CSIReportList_specs_1 = {
-	sizeof(struct CSIReportList),
-	offsetof(struct CSIReportList, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_CSIReportList = {
-	"CSIReportList",
-	"CSIReportList",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_CSIReportList_tags_1,
-	sizeof(asn_DEF_CSIReportList_tags_1)
-		/sizeof(asn_DEF_CSIReportList_tags_1[0]), /* 1 */
-	asn_DEF_CSIReportList_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CSIReportList_tags_1)
-		/sizeof(asn_DEF_CSIReportList_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CSIReportList_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_CSIReportList_1,
-	1,	/* Single element */
-	&asn_SPC_CSIReportList_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CSIReportList.h b/3rdparty/libe2ap/CSIReportList.h
deleted file mode 100644
index 72530e9..0000000
--- a/3rdparty/libe2ap/CSIReportList.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CSIReportList_H_
-#define	_CSIReportList_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "UEID.h"
-#include "CSIReportPerCSIProcess.h"
-#include "constr_SEQUENCE.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* Forward definitions */
-typedef struct CSIReportList__Member {
-	UEID_t	 uEID;
-	CSIReportPerCSIProcess_t	 cSIReportPerCSIProcess;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CSIReportList__Member;
-
-/* CSIReportList */
-typedef struct CSIReportList {
-	A_SEQUENCE_OF(CSIReportList__Member) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CSIReportList_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CSIReportList;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CSIReportList_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CSIReportPerCSIProcess.c b/3rdparty/libe2ap/CSIReportPerCSIProcess.c
deleted file mode 100644
index 8af362a..0000000
--- a/3rdparty/libe2ap/CSIReportPerCSIProcess.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CSIReportPerCSIProcess.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_cSIProcessConfigurationIndex_constraint_2(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 1 && value <= 7)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_cSIProcessConfigurationIndex_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  1,  7 }	/* (1..7,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_CSIReportPerCSIProcess_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 2,  2,  1,  4 }	/* (SIZE(1..4)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_Member_2[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcess__Member, cSIProcessConfigurationIndex),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_cSIProcessConfigurationIndex_constr_3,  memb_cSIProcessConfigurationIndex_constraint_2 },
-		0, 0, /* No default value */
-		"cSIProcessConfigurationIndex"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcess__Member, cSIReportPerCSIProcessItem),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CSIReportPerCSIProcessItem,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cSIReportPerCSIProcessItem"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CSIReportPerCSIProcess__Member, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P36,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_Member_oms_2[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cSIProcessConfigurationIndex */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cSIReportPerCSIProcessItem */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
-	sizeof(struct CSIReportPerCSIProcess__Member),
-	offsetof(struct CSIReportPerCSIProcess__Member, _asn_ctx),
-	asn_MAP_Member_tag2el_2,
-	3,	/* Count of tags in the map */
-	asn_MAP_Member_oms_2,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_Member_2 = {
-	"SEQUENCE",
-	"SEQUENCE",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Member_tags_2,
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	asn_DEF_Member_tags_2,	/* Same as above */
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Member_2,
-	3,	/* Elements count */
-	&asn_SPC_Member_specs_2	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CSIReportPerCSIProcess_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Member_2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CSIReportPerCSIProcess_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_CSIReportPerCSIProcess_specs_1 = {
-	sizeof(struct CSIReportPerCSIProcess),
-	offsetof(struct CSIReportPerCSIProcess, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_CSIReportPerCSIProcess = {
-	"CSIReportPerCSIProcess",
-	"CSIReportPerCSIProcess",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_CSIReportPerCSIProcess_tags_1,
-	sizeof(asn_DEF_CSIReportPerCSIProcess_tags_1)
-		/sizeof(asn_DEF_CSIReportPerCSIProcess_tags_1[0]), /* 1 */
-	asn_DEF_CSIReportPerCSIProcess_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CSIReportPerCSIProcess_tags_1)
-		/sizeof(asn_DEF_CSIReportPerCSIProcess_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CSIReportPerCSIProcess_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_CSIReportPerCSIProcess_1,
-	1,	/* Single element */
-	&asn_SPC_CSIReportPerCSIProcess_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CSIReportPerCSIProcess.h b/3rdparty/libe2ap/CSIReportPerCSIProcess.h
deleted file mode 100644
index 33d228a..0000000
--- a/3rdparty/libe2ap/CSIReportPerCSIProcess.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CSIReportPerCSIProcess_H_
-#define	_CSIReportPerCSIProcess_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "NativeInteger.h"
-#include "CSIReportPerCSIProcessItem.h"
-#include "constr_SEQUENCE.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* Forward definitions */
-typedef struct CSIReportPerCSIProcess__Member {
-	long	 cSIProcessConfigurationIndex;
-	CSIReportPerCSIProcessItem_t	 cSIReportPerCSIProcessItem;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CSIReportPerCSIProcess__Member;
-
-/* CSIReportPerCSIProcess */
-typedef struct CSIReportPerCSIProcess {
-	A_SEQUENCE_OF(CSIReportPerCSIProcess__Member) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CSIReportPerCSIProcess_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CSIReportPerCSIProcess;
-extern asn_SET_OF_specifics_t asn_SPC_CSIReportPerCSIProcess_specs_1;
-extern asn_TYPE_member_t asn_MBR_CSIReportPerCSIProcess_1[1];
-extern asn_per_constraints_t asn_PER_type_CSIReportPerCSIProcess_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CSIReportPerCSIProcess_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CSIReportPerCSIProcessItem.c b/3rdparty/libe2ap/CSIReportPerCSIProcessItem.c
deleted file mode 100644
index 86e6a1f..0000000
--- a/3rdparty/libe2ap/CSIReportPerCSIProcessItem.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CSIReportPerCSIProcessItem.h"
-
-#include "SubbandCQIList.h"
-#include "ProtocolExtensionContainer.h"
-static int
-memb_rI_constraint_2(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 1 && value <= 8)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_rI_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  1,  8 }	/* (1..8,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_CSIReportPerCSIProcessItem_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 1,  1,  1,  2 }	/* (SIZE(1..2)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_Member_2[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcessItem__Member, rI),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_rI_constr_3,  memb_rI_constraint_2 },
-		0, 0, /* No default value */
-		"rI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcessItem__Member, widebandCQI),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_WidebandCQI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"widebandCQI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcessItem__Member, subbandSize),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_SubbandSize,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"subbandSize"
-		},
-	{ ATF_POINTER, 2, offsetof(struct CSIReportPerCSIProcessItem__Member, subbandCQIList),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_SubbandCQIList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"subbandCQIList"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CSIReportPerCSIProcessItem__Member, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P37,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_Member_oms_2[] = { 3, 4 };
-static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rI */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* widebandCQI */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* subbandSize */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* subbandCQIList */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
-	sizeof(struct CSIReportPerCSIProcessItem__Member),
-	offsetof(struct CSIReportPerCSIProcessItem__Member, _asn_ctx),
-	asn_MAP_Member_tag2el_2,
-	5,	/* Count of tags in the map */
-	asn_MAP_Member_oms_2,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	5,	/* First extension addition */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_Member_2 = {
-	"SEQUENCE",
-	"SEQUENCE",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Member_tags_2,
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	asn_DEF_Member_tags_2,	/* Same as above */
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Member_2,
-	5,	/* Elements count */
-	&asn_SPC_Member_specs_2	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CSIReportPerCSIProcessItem_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Member_2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CSIReportPerCSIProcessItem_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_CSIReportPerCSIProcessItem_specs_1 = {
-	sizeof(struct CSIReportPerCSIProcessItem),
-	offsetof(struct CSIReportPerCSIProcessItem, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_CSIReportPerCSIProcessItem = {
-	"CSIReportPerCSIProcessItem",
-	"CSIReportPerCSIProcessItem",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_CSIReportPerCSIProcessItem_tags_1,
-	sizeof(asn_DEF_CSIReportPerCSIProcessItem_tags_1)
-		/sizeof(asn_DEF_CSIReportPerCSIProcessItem_tags_1[0]), /* 1 */
-	asn_DEF_CSIReportPerCSIProcessItem_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CSIReportPerCSIProcessItem_tags_1)
-		/sizeof(asn_DEF_CSIReportPerCSIProcessItem_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CSIReportPerCSIProcessItem_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_CSIReportPerCSIProcessItem_1,
-	1,	/* Single element */
-	&asn_SPC_CSIReportPerCSIProcessItem_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CSIReportPerCSIProcessItem.h b/3rdparty/libe2ap/CSIReportPerCSIProcessItem.h
deleted file mode 100644
index 09661a2..0000000
--- a/3rdparty/libe2ap/CSIReportPerCSIProcessItem.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CSIReportPerCSIProcessItem_H_
-#define	_CSIReportPerCSIProcessItem_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "NativeInteger.h"
-#include "WidebandCQI.h"
-#include "SubbandSize.h"
-#include "constr_SEQUENCE.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct SubbandCQIList;
-struct ProtocolExtensionContainer;
-
-/* Forward definitions */
-typedef struct CSIReportPerCSIProcessItem__Member {
-	long	 rI;
-	WidebandCQI_t	 widebandCQI;
-	SubbandSize_t	 subbandSize;
-	struct SubbandCQIList	*subbandCQIList;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CSIReportPerCSIProcessItem__Member;
-
-/* CSIReportPerCSIProcessItem */
-typedef struct CSIReportPerCSIProcessItem {
-	A_SEQUENCE_OF(CSIReportPerCSIProcessItem__Member) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CSIReportPerCSIProcessItem_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CSIReportPerCSIProcessItem;
-extern asn_SET_OF_specifics_t asn_SPC_CSIReportPerCSIProcessItem_specs_1;
-extern asn_TYPE_member_t asn_MBR_CSIReportPerCSIProcessItem_1[1];
-extern asn_per_constraints_t asn_PER_type_CSIReportPerCSIProcessItem_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CSIReportPerCSIProcessItem_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CallProcess-ID.c b/3rdparty/libe2ap/CallProcess-ID.c
deleted file mode 100644
index f12d25d..0000000
--- a/3rdparty/libe2ap/CallProcess-ID.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CallProcess-ID.h"
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-static const ber_tlv_tag_t asn_DEF_CallProcess_ID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_CallProcess_ID = {
-	"CallProcess-ID",
-	"CallProcess-ID",
-	&asn_OP_NativeInteger,
-	asn_DEF_CallProcess_ID_tags_1,
-	sizeof(asn_DEF_CallProcess_ID_tags_1)
-		/sizeof(asn_DEF_CallProcess_ID_tags_1[0]), /* 1 */
-	asn_DEF_CallProcess_ID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CallProcess_ID_tags_1)
-		/sizeof(asn_DEF_CallProcess_ID_tags_1[0]), /* 1 */
-	{ 0, 0, NativeInteger_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/CallProcess-ID.h b/3rdparty/libe2ap/CallProcess-ID.h
deleted file mode 100644
index b08f22d..0000000
--- a/3rdparty/libe2ap/CallProcess-ID.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CallProcess_ID_H_
-#define	_CallProcess_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* CallProcess-ID */
-typedef long	 CallProcess_ID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CallProcess_ID;
-asn_struct_free_f CallProcess_ID_free;
-asn_struct_print_f CallProcess_ID_print;
-asn_constr_check_f CallProcess_ID_constraint;
-ber_type_decoder_f CallProcess_ID_decode_ber;
-der_type_encoder_f CallProcess_ID_encode_der;
-xer_type_decoder_f CallProcess_ID_decode_xer;
-xer_type_encoder_f CallProcess_ID_encode_xer;
-per_type_decoder_f CallProcess_ID_decode_uper;
-per_type_encoder_f CallProcess_ID_encode_uper;
-per_type_decoder_f CallProcess_ID_decode_aper;
-per_type_encoder_f CallProcess_ID_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CallProcess_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CapacityValue.c b/3rdparty/libe2ap/CapacityValue.c
deleted file mode 100644
index 058d3ba..0000000
--- a/3rdparty/libe2ap/CapacityValue.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CapacityValue.h"
-
-int
-CapacityValue_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 100)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_CapacityValue_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 7,  7,  0,  100 }	/* (0..100) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_CapacityValue_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_CapacityValue = {
-	"CapacityValue",
-	"CapacityValue",
-	&asn_OP_NativeInteger,
-	asn_DEF_CapacityValue_tags_1,
-	sizeof(asn_DEF_CapacityValue_tags_1)
-		/sizeof(asn_DEF_CapacityValue_tags_1[0]), /* 1 */
-	asn_DEF_CapacityValue_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CapacityValue_tags_1)
-		/sizeof(asn_DEF_CapacityValue_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CapacityValue_constr_1, CapacityValue_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/CapacityValue.h b/3rdparty/libe2ap/CapacityValue.h
deleted file mode 100644
index 0f96e86..0000000
--- a/3rdparty/libe2ap/CapacityValue.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CapacityValue_H_
-#define	_CapacityValue_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* CapacityValue */
-typedef long	 CapacityValue_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_CapacityValue_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_CapacityValue;
-asn_struct_free_f CapacityValue_free;
-asn_struct_print_f CapacityValue_print;
-asn_constr_check_f CapacityValue_constraint;
-ber_type_decoder_f CapacityValue_decode_ber;
-der_type_encoder_f CapacityValue_encode_der;
-xer_type_decoder_f CapacityValue_decode_xer;
-xer_type_encoder_f CapacityValue_encode_xer;
-per_type_decoder_f CapacityValue_decode_uper;
-per_type_encoder_f CapacityValue_encode_uper;
-per_type_decoder_f CapacityValue_decode_aper;
-per_type_encoder_f CapacityValue_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CapacityValue_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/Cause.c b/3rdparty/libe2ap/Cause.c
deleted file mode 100644
index 49331fe..0000000
--- a/3rdparty/libe2ap/Cause.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "Cause.h"
-
-asn_per_constraints_t asn_PER_type_Cause_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  3 }	/* (0..3,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_Cause_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct Cause, choice.radioNetwork),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CauseRadioNetwork,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"radioNetwork"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct Cause, choice.transport),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CauseTransport,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"transport"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct Cause, choice.protocol),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CauseProtocol,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocol"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct Cause, choice.misc),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CauseMisc,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"misc"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_Cause_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* radioNetwork */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* transport */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* protocol */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* misc */
-};
-asn_CHOICE_specifics_t asn_SPC_Cause_specs_1 = {
-	sizeof(struct Cause),
-	offsetof(struct Cause, _asn_ctx),
-	offsetof(struct Cause, present),
-	sizeof(((struct Cause *)0)->present),
-	asn_MAP_Cause_tag2el_1,
-	4,	/* Count of tags in the map */
-	0, 0,
-	4	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_Cause = {
-	"Cause",
-	"Cause",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_Cause_constr_1, CHOICE_constraint },
-	asn_MBR_Cause_1,
-	4,	/* Elements count */
-	&asn_SPC_Cause_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/Cause.h b/3rdparty/libe2ap/Cause.h
deleted file mode 100644
index 98a2dfa..0000000
--- a/3rdparty/libe2ap/Cause.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_Cause_H_
-#define	_Cause_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "CauseRadioNetwork.h"
-#include "CauseTransport.h"
-#include "CauseProtocol.h"
-#include "CauseMisc.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum Cause_PR {
-	Cause_PR_NOTHING,	/* No components present */
-	Cause_PR_radioNetwork,
-	Cause_PR_transport,
-	Cause_PR_protocol,
-	Cause_PR_misc
-	/* Extensions may appear below */
-	
-} Cause_PR;
-
-/* Cause */
-typedef struct Cause {
-	Cause_PR present;
-	union Cause_u {
-		CauseRadioNetwork_t	 radioNetwork;
-		CauseTransport_t	 transport;
-		CauseProtocol_t	 protocol;
-		CauseMisc_t	 misc;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} Cause_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_Cause;
-extern asn_CHOICE_specifics_t asn_SPC_Cause_specs_1;
-extern asn_TYPE_member_t asn_MBR_Cause_1[4];
-extern asn_per_constraints_t asn_PER_type_Cause_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _Cause_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CauseMisc.c b/3rdparty/libe2ap/CauseMisc.c
deleted file mode 100644
index 6093040..0000000
--- a/3rdparty/libe2ap/CauseMisc.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CauseMisc.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_CauseMisc_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  4 }	/* (0..4,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_CauseMisc_value2enum_1[] = {
-	{ 0,	27,	"control-processing-overload" },
-	{ 1,	16,	"hardware-failure" },
-	{ 2,	15,	"om-intervention" },
-	{ 3,	42,	"not-enough-user-plane-processing-resources" },
-	{ 4,	11,	"unspecified" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_CauseMisc_enum2value_1[] = {
-	0,	/* control-processing-overload(0) */
-	1,	/* hardware-failure(1) */
-	3,	/* not-enough-user-plane-processing-resources(3) */
-	2,	/* om-intervention(2) */
-	4	/* unspecified(4) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_CauseMisc_specs_1 = {
-	asn_MAP_CauseMisc_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_CauseMisc_enum2value_1,	/* N => "tag"; sorted by N */
-	5,	/* Number of elements in the maps */
-	6,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_CauseMisc_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_CauseMisc = {
-	"CauseMisc",
-	"CauseMisc",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_CauseMisc_tags_1,
-	sizeof(asn_DEF_CauseMisc_tags_1)
-		/sizeof(asn_DEF_CauseMisc_tags_1[0]), /* 1 */
-	asn_DEF_CauseMisc_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CauseMisc_tags_1)
-		/sizeof(asn_DEF_CauseMisc_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CauseMisc_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_CauseMisc_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CauseMisc.h b/3rdparty/libe2ap/CauseMisc.h
deleted file mode 100644
index d3afd4b..0000000
--- a/3rdparty/libe2ap/CauseMisc.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CauseMisc_H_
-#define	_CauseMisc_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum CauseMisc {
-	CauseMisc_control_processing_overload	= 0,
-	CauseMisc_hardware_failure	= 1,
-	CauseMisc_om_intervention	= 2,
-	CauseMisc_not_enough_user_plane_processing_resources	= 3,
-	CauseMisc_unspecified	= 4
-	/*
-	 * Enumeration is extensible
-	 */
-} e_CauseMisc;
-
-/* CauseMisc */
-typedef long	 CauseMisc_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_CauseMisc_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_CauseMisc;
-extern const asn_INTEGER_specifics_t asn_SPC_CauseMisc_specs_1;
-asn_struct_free_f CauseMisc_free;
-asn_struct_print_f CauseMisc_print;
-asn_constr_check_f CauseMisc_constraint;
-ber_type_decoder_f CauseMisc_decode_ber;
-der_type_encoder_f CauseMisc_encode_der;
-xer_type_decoder_f CauseMisc_decode_xer;
-xer_type_encoder_f CauseMisc_encode_xer;
-per_type_decoder_f CauseMisc_decode_uper;
-per_type_encoder_f CauseMisc_encode_uper;
-per_type_decoder_f CauseMisc_decode_aper;
-per_type_encoder_f CauseMisc_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CauseMisc_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CauseProtocol.c b/3rdparty/libe2ap/CauseProtocol.c
deleted file mode 100644
index 94ca736..0000000
--- a/3rdparty/libe2ap/CauseProtocol.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CauseProtocol.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_CauseProtocol_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  6 }	/* (0..6,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_CauseProtocol_value2enum_1[] = {
-	{ 0,	21,	"transfer-syntax-error" },
-	{ 1,	28,	"abstract-syntax-error-reject" },
-	{ 2,	39,	"abstract-syntax-error-ignore-and-notify" },
-	{ 3,	42,	"message-not-compatible-with-receiver-state" },
-	{ 4,	14,	"semantic-error" },
-	{ 5,	11,	"unspecified" },
-	{ 6,	49,	"abstract-syntax-error-falsely-constructed-message" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_CauseProtocol_enum2value_1[] = {
-	6,	/* abstract-syntax-error-falsely-constructed-message(6) */
-	2,	/* abstract-syntax-error-ignore-and-notify(2) */
-	1,	/* abstract-syntax-error-reject(1) */
-	3,	/* message-not-compatible-with-receiver-state(3) */
-	4,	/* semantic-error(4) */
-	0,	/* transfer-syntax-error(0) */
-	5	/* unspecified(5) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_CauseProtocol_specs_1 = {
-	asn_MAP_CauseProtocol_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_CauseProtocol_enum2value_1,	/* N => "tag"; sorted by N */
-	7,	/* Number of elements in the maps */
-	8,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_CauseProtocol_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_CauseProtocol = {
-	"CauseProtocol",
-	"CauseProtocol",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_CauseProtocol_tags_1,
-	sizeof(asn_DEF_CauseProtocol_tags_1)
-		/sizeof(asn_DEF_CauseProtocol_tags_1[0]), /* 1 */
-	asn_DEF_CauseProtocol_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CauseProtocol_tags_1)
-		/sizeof(asn_DEF_CauseProtocol_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CauseProtocol_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_CauseProtocol_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CauseProtocol.h b/3rdparty/libe2ap/CauseProtocol.h
deleted file mode 100644
index 7b7a190..0000000
--- a/3rdparty/libe2ap/CauseProtocol.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CauseProtocol_H_
-#define	_CauseProtocol_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum CauseProtocol {
-	CauseProtocol_transfer_syntax_error	= 0,
-	CauseProtocol_abstract_syntax_error_reject	= 1,
-	CauseProtocol_abstract_syntax_error_ignore_and_notify	= 2,
-	CauseProtocol_message_not_compatible_with_receiver_state	= 3,
-	CauseProtocol_semantic_error	= 4,
-	CauseProtocol_unspecified	= 5,
-	CauseProtocol_abstract_syntax_error_falsely_constructed_message	= 6
-	/*
-	 * Enumeration is extensible
-	 */
-} e_CauseProtocol;
-
-/* CauseProtocol */
-typedef long	 CauseProtocol_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_CauseProtocol_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_CauseProtocol;
-extern const asn_INTEGER_specifics_t asn_SPC_CauseProtocol_specs_1;
-asn_struct_free_f CauseProtocol_free;
-asn_struct_print_f CauseProtocol_print;
-asn_constr_check_f CauseProtocol_constraint;
-ber_type_decoder_f CauseProtocol_decode_ber;
-der_type_encoder_f CauseProtocol_encode_der;
-xer_type_decoder_f CauseProtocol_decode_xer;
-xer_type_encoder_f CauseProtocol_encode_xer;
-per_type_decoder_f CauseProtocol_decode_uper;
-per_type_encoder_f CauseProtocol_encode_uper;
-per_type_decoder_f CauseProtocol_decode_aper;
-per_type_encoder_f CauseProtocol_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CauseProtocol_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CauseRIC.c b/3rdparty/libe2ap/CauseRIC.c
deleted file mode 100644
index 5ff0728..0000000
--- a/3rdparty/libe2ap/CauseRIC.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CauseRIC.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_CauseRIC_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  4,  4,  0,  12 }	/* (0..12,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_CauseRIC_value2enum_1[] = {
-	{ 0,	19,	"function-id-Invalid" },
-	{ 1,	20,	"action-not-supported" },
-	{ 2,	17,	"excessive-actions" },
-	{ 3,	16,	"duplicate-action" },
-	{ 4,	15,	"duplicate-event" },
-	{ 5,	23,	"function-resource-limit" },
-	{ 6,	18,	"request-id-unknown" },
-	{ 7,	46,	"inconsistent-action-subsequent-action-sequence" },
-	{ 8,	23,	"control-message-invalid" },
-	{ 9,	23,	"call-process-id-invalid" },
-	{ 10,	21,	"function-not-required" },
-	{ 11,	19,	"excessive-functions" },
-	{ 12,	18,	"ric-resource-limit" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_CauseRIC_enum2value_1[] = {
-	1,	/* action-not-supported(1) */
-	9,	/* call-process-id-invalid(9) */
-	8,	/* control-message-invalid(8) */
-	3,	/* duplicate-action(3) */
-	4,	/* duplicate-event(4) */
-	2,	/* excessive-actions(2) */
-	11,	/* excessive-functions(11) */
-	0,	/* function-id-Invalid(0) */
-	10,	/* function-not-required(10) */
-	5,	/* function-resource-limit(5) */
-	7,	/* inconsistent-action-subsequent-action-sequence(7) */
-	6,	/* request-id-unknown(6) */
-	12	/* ric-resource-limit(12) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_CauseRIC_specs_1 = {
-	asn_MAP_CauseRIC_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_CauseRIC_enum2value_1,	/* N => "tag"; sorted by N */
-	13,	/* Number of elements in the maps */
-	14,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_CauseRIC_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_CauseRIC = {
-	"CauseRIC",
-	"CauseRIC",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_CauseRIC_tags_1,
-	sizeof(asn_DEF_CauseRIC_tags_1)
-		/sizeof(asn_DEF_CauseRIC_tags_1[0]), /* 1 */
-	asn_DEF_CauseRIC_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CauseRIC_tags_1)
-		/sizeof(asn_DEF_CauseRIC_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CauseRIC_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_CauseRIC_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CauseRIC.h b/3rdparty/libe2ap/CauseRIC.h
deleted file mode 100644
index c8b04e1..0000000
--- a/3rdparty/libe2ap/CauseRIC.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CauseRIC_H_
-#define	_CauseRIC_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum CauseRIC {
-	CauseRIC_function_id_Invalid	= 0,
-	CauseRIC_action_not_supported	= 1,
-	CauseRIC_excessive_actions	= 2,
-	CauseRIC_duplicate_action	= 3,
-	CauseRIC_duplicate_event	= 4,
-	CauseRIC_function_resource_limit	= 5,
-	CauseRIC_request_id_unknown	= 6,
-	CauseRIC_inconsistent_action_subsequent_action_sequence	= 7,
-	CauseRIC_control_message_invalid	= 8,
-	CauseRIC_call_process_id_invalid	= 9,
-	CauseRIC_function_not_required	= 10,
-	CauseRIC_excessive_functions	= 11,
-	CauseRIC_ric_resource_limit	= 12
-	/*
-	 * Enumeration is extensible
-	 */
-} e_CauseRIC;
-
-/* CauseRIC */
-typedef long	 CauseRIC_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_CauseRIC_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_CauseRIC;
-extern const asn_INTEGER_specifics_t asn_SPC_CauseRIC_specs_1;
-asn_struct_free_f CauseRIC_free;
-asn_struct_print_f CauseRIC_print;
-asn_constr_check_f CauseRIC_constraint;
-ber_type_decoder_f CauseRIC_decode_ber;
-der_type_encoder_f CauseRIC_encode_der;
-xer_type_decoder_f CauseRIC_decode_xer;
-xer_type_encoder_f CauseRIC_encode_xer;
-per_type_decoder_f CauseRIC_decode_uper;
-per_type_encoder_f CauseRIC_encode_uper;
-per_type_decoder_f CauseRIC_decode_aper;
-per_type_encoder_f CauseRIC_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CauseRIC_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CauseRadioNetwork.c b/3rdparty/libe2ap/CauseRadioNetwork.c
deleted file mode 100644
index 20e8bc1..0000000
--- a/3rdparty/libe2ap/CauseRadioNetwork.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CauseRadioNetwork.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_CauseRadioNetwork_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  5,  5,  0,  21 }	/* (0..21,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_CauseRadioNetwork_value2enum_1[] = {
-	{ 0,	36,	"handover-desirable-for-radio-reasons" },
-	{ 1,	22,	"time-critical-handover" },
-	{ 2,	30,	"resource-optimisation-handover" },
-	{ 3,	27,	"reduce-load-in-serving-cell" },
-	{ 4,	16,	"partial-handover" },
-	{ 5,	26,	"unknown-new-eNB-UE-X2AP-ID" },
-	{ 6,	26,	"unknown-old-eNB-UE-X2AP-ID" },
-	{ 7,	26,	"unknown-pair-of-UE-X2AP-ID" },
-	{ 8,	21,	"ho-target-not-allowed" },
-	{ 9,	22,	"tx2relocoverall-expiry" },
-	{ 10,	17,	"trelocprep-expiry" },
-	{ 11,	18,	"cell-not-available" },
-	{ 12,	43,	"no-radio-resources-available-in-target-cell" },
-	{ 13,	19,	"invalid-MME-GroupID" },
-	{ 14,	16,	"unknown-MME-Code" },
-	{ 15,	63,	"encryption-and-or-integrity-protection-algorithms-not-supported" },
-	{ 16,	26,	"reportCharacteristicsEmpty" },
-	{ 17,	19,	"noReportPeriodicity" },
-	{ 18,	21,	"existingMeasurementID" },
-	{ 19,	26,	"unknown-eNB-Measurement-ID" },
-	{ 20,	37,	"measurement-temporarily-not-available" },
-	{ 21,	11,	"unspecified" },
-	{ 22,	14,	"load-balancing" },
-	{ 23,	21,	"handover-optimisation" },
-	{ 24,	26,	"value-out-of-allowed-range" },
-	{ 25,	27,	"multiple-E-RAB-ID-instances" },
-	{ 26,	18,	"switch-off-ongoing" },
-	{ 27,	23,	"not-supported-QCI-value" },
-	{ 28,	40,	"measurement-not-supported-for-the-object" },
-	{ 29,	17,	"tDCoverall-expiry" },
-	{ 30,	14,	"tDCprep-expiry" },
-	{ 31,	34,	"action-desirable-for-radio-reasons" },
-	{ 32,	11,	"reduce-load" },
-	{ 33,	21,	"resource-optimisation" },
-	{ 34,	20,	"time-critical-action" },
-	{ 35,	18,	"target-not-allowed" },
-	{ 36,	28,	"no-radio-resources-available" },
-	{ 37,	23,	"invalid-QoS-combination" },
-	{ 38,	35,	"encryption-algorithms-not-aupported" },
-	{ 39,	19,	"procedure-cancelled" },
-	{ 40,	11,	"rRM-purpose" },
-	{ 41,	21,	"improve-user-bit-rate" },
-	{ 42,	15,	"user-inactivity" },
-	{ 43,	29,	"radio-connection-with-UE-lost" },
-	{ 44,	40,	"failure-in-the-radio-interface-procedure" },
-	{ 45,	27,	"bearer-option-not-supported" },
-	{ 46,	12,	"mCG-Mobility" },
-	{ 47,	12,	"sCG-Mobility" },
-	{ 48,	23,	"count-reaches-max-value" },
-	{ 49,	29,	"unknown-old-en-gNB-UE-X2AP-ID" },
-	{ 50,	13,	"pDCP-Overload" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_CauseRadioNetwork_enum2value_1[] = {
-	31,	/* action-desirable-for-radio-reasons(31) */
-	45,	/* bearer-option-not-supported(45) */
-	11,	/* cell-not-available(11) */
-	48,	/* count-reaches-max-value(48) */
-	38,	/* encryption-algorithms-not-aupported(38) */
-	15,	/* encryption-and-or-integrity-protection-algorithms-not-supported(15) */
-	18,	/* existingMeasurementID(18) */
-	44,	/* failure-in-the-radio-interface-procedure(44) */
-	0,	/* handover-desirable-for-radio-reasons(0) */
-	23,	/* handover-optimisation(23) */
-	8,	/* ho-target-not-allowed(8) */
-	41,	/* improve-user-bit-rate(41) */
-	13,	/* invalid-MME-GroupID(13) */
-	37,	/* invalid-QoS-combination(37) */
-	22,	/* load-balancing(22) */
-	46,	/* mCG-Mobility(46) */
-	28,	/* measurement-not-supported-for-the-object(28) */
-	20,	/* measurement-temporarily-not-available(20) */
-	25,	/* multiple-E-RAB-ID-instances(25) */
-	36,	/* no-radio-resources-available(36) */
-	12,	/* no-radio-resources-available-in-target-cell(12) */
-	17,	/* noReportPeriodicity(17) */
-	27,	/* not-supported-QCI-value(27) */
-	50,	/* pDCP-Overload(50) */
-	4,	/* partial-handover(4) */
-	39,	/* procedure-cancelled(39) */
-	40,	/* rRM-purpose(40) */
-	43,	/* radio-connection-with-UE-lost(43) */
-	32,	/* reduce-load(32) */
-	3,	/* reduce-load-in-serving-cell(3) */
-	16,	/* reportCharacteristicsEmpty(16) */
-	33,	/* resource-optimisation(33) */
-	2,	/* resource-optimisation-handover(2) */
-	47,	/* sCG-Mobility(47) */
-	26,	/* switch-off-ongoing(26) */
-	29,	/* tDCoverall-expiry(29) */
-	30,	/* tDCprep-expiry(30) */
-	35,	/* target-not-allowed(35) */
-	34,	/* time-critical-action(34) */
-	1,	/* time-critical-handover(1) */
-	10,	/* trelocprep-expiry(10) */
-	9,	/* tx2relocoverall-expiry(9) */
-	14,	/* unknown-MME-Code(14) */
-	19,	/* unknown-eNB-Measurement-ID(19) */
-	5,	/* unknown-new-eNB-UE-X2AP-ID(5) */
-	6,	/* unknown-old-eNB-UE-X2AP-ID(6) */
-	49,	/* unknown-old-en-gNB-UE-X2AP-ID(49) */
-	7,	/* unknown-pair-of-UE-X2AP-ID(7) */
-	21,	/* unspecified(21) */
-	42,	/* user-inactivity(42) */
-	24	/* value-out-of-allowed-range(24) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_CauseRadioNetwork_specs_1 = {
-	asn_MAP_CauseRadioNetwork_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_CauseRadioNetwork_enum2value_1,	/* N => "tag"; sorted by N */
-	51,	/* Number of elements in the maps */
-	23,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_CauseRadioNetwork_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_CauseRadioNetwork = {
-	"CauseRadioNetwork",
-	"CauseRadioNetwork",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_CauseRadioNetwork_tags_1,
-	sizeof(asn_DEF_CauseRadioNetwork_tags_1)
-		/sizeof(asn_DEF_CauseRadioNetwork_tags_1[0]), /* 1 */
-	asn_DEF_CauseRadioNetwork_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CauseRadioNetwork_tags_1)
-		/sizeof(asn_DEF_CauseRadioNetwork_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CauseRadioNetwork_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_CauseRadioNetwork_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CauseRadioNetwork.h b/3rdparty/libe2ap/CauseRadioNetwork.h
deleted file mode 100644
index d43c972..0000000
--- a/3rdparty/libe2ap/CauseRadioNetwork.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CauseRadioNetwork_H_
-#define	_CauseRadioNetwork_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum CauseRadioNetwork {
-	CauseRadioNetwork_handover_desirable_for_radio_reasons	= 0,
-	CauseRadioNetwork_time_critical_handover	= 1,
-	CauseRadioNetwork_resource_optimisation_handover	= 2,
-	CauseRadioNetwork_reduce_load_in_serving_cell	= 3,
-	CauseRadioNetwork_partial_handover	= 4,
-	CauseRadioNetwork_unknown_new_eNB_UE_X2AP_ID	= 5,
-	CauseRadioNetwork_unknown_old_eNB_UE_X2AP_ID	= 6,
-	CauseRadioNetwork_unknown_pair_of_UE_X2AP_ID	= 7,
-	CauseRadioNetwork_ho_target_not_allowed	= 8,
-	CauseRadioNetwork_tx2relocoverall_expiry	= 9,
-	CauseRadioNetwork_trelocprep_expiry	= 10,
-	CauseRadioNetwork_cell_not_available	= 11,
-	CauseRadioNetwork_no_radio_resources_available_in_target_cell	= 12,
-	CauseRadioNetwork_invalid_MME_GroupID	= 13,
-	CauseRadioNetwork_unknown_MME_Code	= 14,
-	CauseRadioNetwork_encryption_and_or_integrity_protection_algorithms_not_supported	= 15,
-	CauseRadioNetwork_reportCharacteristicsEmpty	= 16,
-	CauseRadioNetwork_noReportPeriodicity	= 17,
-	CauseRadioNetwork_existingMeasurementID	= 18,
-	CauseRadioNetwork_unknown_eNB_Measurement_ID	= 19,
-	CauseRadioNetwork_measurement_temporarily_not_available	= 20,
-	CauseRadioNetwork_unspecified	= 21,
-	/*
-	 * Enumeration is extensible
-	 */
-	CauseRadioNetwork_load_balancing	= 22,
-	CauseRadioNetwork_handover_optimisation	= 23,
-	CauseRadioNetwork_value_out_of_allowed_range	= 24,
-	CauseRadioNetwork_multiple_E_RAB_ID_instances	= 25,
-	CauseRadioNetwork_switch_off_ongoing	= 26,
-	CauseRadioNetwork_not_supported_QCI_value	= 27,
-	CauseRadioNetwork_measurement_not_supported_for_the_object	= 28,
-	CauseRadioNetwork_tDCoverall_expiry	= 29,
-	CauseRadioNetwork_tDCprep_expiry	= 30,
-	CauseRadioNetwork_action_desirable_for_radio_reasons	= 31,
-	CauseRadioNetwork_reduce_load	= 32,
-	CauseRadioNetwork_resource_optimisation	= 33,
-	CauseRadioNetwork_time_critical_action	= 34,
-	CauseRadioNetwork_target_not_allowed	= 35,
-	CauseRadioNetwork_no_radio_resources_available	= 36,
-	CauseRadioNetwork_invalid_QoS_combination	= 37,
-	CauseRadioNetwork_encryption_algorithms_not_aupported	= 38,
-	CauseRadioNetwork_procedure_cancelled	= 39,
-	CauseRadioNetwork_rRM_purpose	= 40,
-	CauseRadioNetwork_improve_user_bit_rate	= 41,
-	CauseRadioNetwork_user_inactivity	= 42,
-	CauseRadioNetwork_radio_connection_with_UE_lost	= 43,
-	CauseRadioNetwork_failure_in_the_radio_interface_procedure	= 44,
-	CauseRadioNetwork_bearer_option_not_supported	= 45,
-	CauseRadioNetwork_mCG_Mobility	= 46,
-	CauseRadioNetwork_sCG_Mobility	= 47,
-	CauseRadioNetwork_count_reaches_max_value	= 48,
-	CauseRadioNetwork_unknown_old_en_gNB_UE_X2AP_ID	= 49,
-	CauseRadioNetwork_pDCP_Overload	= 50
-} e_CauseRadioNetwork;
-
-/* CauseRadioNetwork */
-typedef long	 CauseRadioNetwork_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_CauseRadioNetwork_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_CauseRadioNetwork;
-extern const asn_INTEGER_specifics_t asn_SPC_CauseRadioNetwork_specs_1;
-asn_struct_free_f CauseRadioNetwork_free;
-asn_struct_print_f CauseRadioNetwork_print;
-asn_constr_check_f CauseRadioNetwork_constraint;
-ber_type_decoder_f CauseRadioNetwork_decode_ber;
-der_type_encoder_f CauseRadioNetwork_encode_der;
-xer_type_decoder_f CauseRadioNetwork_decode_xer;
-xer_type_encoder_f CauseRadioNetwork_encode_xer;
-per_type_decoder_f CauseRadioNetwork_decode_uper;
-per_type_encoder_f CauseRadioNetwork_encode_uper;
-per_type_decoder_f CauseRadioNetwork_decode_aper;
-per_type_encoder_f CauseRadioNetwork_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CauseRadioNetwork_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CauseTransport.c b/3rdparty/libe2ap/CauseTransport.c
deleted file mode 100644
index 64869bb..0000000
--- a/3rdparty/libe2ap/CauseTransport.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CauseTransport.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_CauseTransport_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_CauseTransport_value2enum_1[] = {
-	{ 0,	30,	"transport-resource-unavailable" },
-	{ 1,	11,	"unspecified" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_CauseTransport_enum2value_1[] = {
-	0,	/* transport-resource-unavailable(0) */
-	1	/* unspecified(1) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_CauseTransport_specs_1 = {
-	asn_MAP_CauseTransport_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_CauseTransport_enum2value_1,	/* N => "tag"; sorted by N */
-	2,	/* Number of elements in the maps */
-	3,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_CauseTransport_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_CauseTransport = {
-	"CauseTransport",
-	"CauseTransport",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_CauseTransport_tags_1,
-	sizeof(asn_DEF_CauseTransport_tags_1)
-		/sizeof(asn_DEF_CauseTransport_tags_1[0]), /* 1 */
-	asn_DEF_CauseTransport_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CauseTransport_tags_1)
-		/sizeof(asn_DEF_CauseTransport_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CauseTransport_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_CauseTransport_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CauseTransport.h b/3rdparty/libe2ap/CauseTransport.h
deleted file mode 100644
index cb323c6..0000000
--- a/3rdparty/libe2ap/CauseTransport.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CauseTransport_H_
-#define	_CauseTransport_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum CauseTransport {
-	CauseTransport_transport_resource_unavailable	= 0,
-	CauseTransport_unspecified	= 1
-	/*
-	 * Enumeration is extensible
-	 */
-} e_CauseTransport;
-
-/* CauseTransport */
-typedef long	 CauseTransport_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_CauseTransport_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_CauseTransport;
-extern const asn_INTEGER_specifics_t asn_SPC_CauseTransport_specs_1;
-asn_struct_free_f CauseTransport_free;
-asn_struct_print_f CauseTransport_print;
-asn_constr_check_f CauseTransport_constraint;
-ber_type_decoder_f CauseTransport_decode_ber;
-der_type_encoder_f CauseTransport_encode_der;
-xer_type_decoder_f CauseTransport_decode_xer;
-xer_type_encoder_f CauseTransport_encode_xer;
-per_type_decoder_f CauseTransport_decode_uper;
-per_type_encoder_f CauseTransport_encode_uper;
-per_type_decoder_f CauseTransport_decode_aper;
-per_type_encoder_f CauseTransport_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CauseTransport_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CellAssistanceInformation.c b/3rdparty/libe2ap/CellAssistanceInformation.c
deleted file mode 100644
index a1c443b..0000000
--- a/3rdparty/libe2ap/CellAssistanceInformation.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CellAssistanceInformation.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_full_list_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_type_CellAssistanceInformation_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_full_list_value2enum_3[] = {
-	{ 0,	16,	"allServedNRcells" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_full_list_enum2value_3[] = {
-	0	/* allServedNRcells(0) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_full_list_specs_3 = {
-	asn_MAP_full_list_value2enum_3,	/* "tag" => N; sorted by tag */
-	asn_MAP_full_list_enum2value_3,	/* N => "tag"; sorted by N */
-	1,	/* Number of elements in the maps */
-	2,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_full_list_tags_3[] = {
-	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_full_list_3 = {
-	"full-list",
-	"full-list",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_full_list_tags_3,
-	sizeof(asn_DEF_full_list_tags_3)
-		/sizeof(asn_DEF_full_list_tags_3[0]) - 1, /* 1 */
-	asn_DEF_full_list_tags_3,	/* Same as above */
-	sizeof(asn_DEF_full_list_tags_3)
-		/sizeof(asn_DEF_full_list_tags_3[0]), /* 2 */
-	{ 0, &asn_PER_type_full_list_constr_3, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_full_list_specs_3	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_CellAssistanceInformation_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellAssistanceInformation, choice.limited_list),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Limited_list,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"limited-list"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellAssistanceInformation, choice.full_list),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_full_list_3,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"full-list"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_CellAssistanceInformation_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* limited-list */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* full-list */
-};
-static asn_CHOICE_specifics_t asn_SPC_CellAssistanceInformation_specs_1 = {
-	sizeof(struct CellAssistanceInformation),
-	offsetof(struct CellAssistanceInformation, _asn_ctx),
-	offsetof(struct CellAssistanceInformation, present),
-	sizeof(((struct CellAssistanceInformation *)0)->present),
-	asn_MAP_CellAssistanceInformation_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0,
-	2	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_CellAssistanceInformation = {
-	"CellAssistanceInformation",
-	"CellAssistanceInformation",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_CellAssistanceInformation_constr_1, CHOICE_constraint },
-	asn_MBR_CellAssistanceInformation_1,
-	2,	/* Elements count */
-	&asn_SPC_CellAssistanceInformation_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CellAssistanceInformation.h b/3rdparty/libe2ap/CellAssistanceInformation.h
deleted file mode 100644
index 09a2a45..0000000
--- a/3rdparty/libe2ap/CellAssistanceInformation.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CellAssistanceInformation_H_
-#define	_CellAssistanceInformation_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "Limited-list.h"
-#include "NativeEnumerated.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum CellAssistanceInformation_PR {
-	CellAssistanceInformation_PR_NOTHING,	/* No components present */
-	CellAssistanceInformation_PR_limited_list,
-	CellAssistanceInformation_PR_full_list
-	/* Extensions may appear below */
-	
-} CellAssistanceInformation_PR;
-typedef enum CellAssistanceInformation__full_list {
-	CellAssistanceInformation__full_list_allServedNRcells	= 0
-	/*
-	 * Enumeration is extensible
-	 */
-} e_CellAssistanceInformation__full_list;
-
-/* CellAssistanceInformation */
-typedef struct CellAssistanceInformation {
-	CellAssistanceInformation_PR present;
-	union CellAssistanceInformation_u {
-		Limited_list_t	 limited_list;
-		long	 full_list;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellAssistanceInformation_t;
-
-/* Implementation */
-/* extern asn_TYPE_descriptor_t asn_DEF_full_list_3;	// (Use -fall-defs-global to expose) */
-extern asn_TYPE_descriptor_t asn_DEF_CellAssistanceInformation;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CellAssistanceInformation_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CellBasedQMC.c b/3rdparty/libe2ap/CellBasedQMC.c
deleted file mode 100644
index 23b8a7c..0000000
--- a/3rdparty/libe2ap/CellBasedQMC.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CellBasedQMC.h"
-
-#include "ProtocolExtensionContainer.h"
-static asn_TYPE_member_t asn_MBR_CellBasedQMC_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellBasedQMC, cellIdListforQMC),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CellIdListforQMC,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cellIdListforQMC"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CellBasedQMC, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P25,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_CellBasedQMC_oms_1[] = { 1 };
-static const ber_tlv_tag_t asn_DEF_CellBasedQMC_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CellBasedQMC_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cellIdListforQMC */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_CellBasedQMC_specs_1 = {
-	sizeof(struct CellBasedQMC),
-	offsetof(struct CellBasedQMC, _asn_ctx),
-	asn_MAP_CellBasedQMC_tag2el_1,
-	2,	/* Count of tags in the map */
-	asn_MAP_CellBasedQMC_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CellBasedQMC = {
-	"CellBasedQMC",
-	"CellBasedQMC",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CellBasedQMC_tags_1,
-	sizeof(asn_DEF_CellBasedQMC_tags_1)
-		/sizeof(asn_DEF_CellBasedQMC_tags_1[0]), /* 1 */
-	asn_DEF_CellBasedQMC_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CellBasedQMC_tags_1)
-		/sizeof(asn_DEF_CellBasedQMC_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellBasedQMC_1,
-	2,	/* Elements count */
-	&asn_SPC_CellBasedQMC_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CellBasedQMC.h b/3rdparty/libe2ap/CellBasedQMC.h
deleted file mode 100644
index 50e55aa..0000000
--- a/3rdparty/libe2ap/CellBasedQMC.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CellBasedQMC_H_
-#define	_CellBasedQMC_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "CellIdListforQMC.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* CellBasedQMC */
-typedef struct CellBasedQMC {
-	CellIdListforQMC_t	 cellIdListforQMC;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellBasedQMC_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CellBasedQMC;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CellBasedQMC_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CellCapacityClassValue.c b/3rdparty/libe2ap/CellCapacityClassValue.c
deleted file mode 100644
index 37343fc..0000000
--- a/3rdparty/libe2ap/CellCapacityClassValue.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CellCapacityClassValue.h"
-
-int
-CellCapacityClassValue_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 1 && value <= 100)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_CellCapacityClassValue_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  7,  7,  1,  100 }	/* (1..100,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_CellCapacityClassValue_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_CellCapacityClassValue = {
-	"CellCapacityClassValue",
-	"CellCapacityClassValue",
-	&asn_OP_NativeInteger,
-	asn_DEF_CellCapacityClassValue_tags_1,
-	sizeof(asn_DEF_CellCapacityClassValue_tags_1)
-		/sizeof(asn_DEF_CellCapacityClassValue_tags_1[0]), /* 1 */
-	asn_DEF_CellCapacityClassValue_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CellCapacityClassValue_tags_1)
-		/sizeof(asn_DEF_CellCapacityClassValue_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CellCapacityClassValue_constr_1, CellCapacityClassValue_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/CellCapacityClassValue.h b/3rdparty/libe2ap/CellCapacityClassValue.h
deleted file mode 100644
index 23a7d53..0000000
--- a/3rdparty/libe2ap/CellCapacityClassValue.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CellCapacityClassValue_H_
-#define	_CellCapacityClassValue_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* CellCapacityClassValue */
-typedef long	 CellCapacityClassValue_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_CellCapacityClassValue_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_CellCapacityClassValue;
-asn_struct_free_f CellCapacityClassValue_free;
-asn_struct_print_f CellCapacityClassValue_print;
-asn_constr_check_f CellCapacityClassValue_constraint;
-ber_type_decoder_f CellCapacityClassValue_decode_ber;
-der_type_encoder_f CellCapacityClassValue_encode_der;
-xer_type_decoder_f CellCapacityClassValue_decode_xer;
-xer_type_encoder_f CellCapacityClassValue_encode_xer;
-per_type_decoder_f CellCapacityClassValue_decode_uper;
-per_type_encoder_f CellCapacityClassValue_encode_uper;
-per_type_decoder_f CellCapacityClassValue_decode_aper;
-per_type_encoder_f CellCapacityClassValue_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CellCapacityClassValue_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CellDeploymentStatusIndicator.c b/3rdparty/libe2ap/CellDeploymentStatusIndicator.c
deleted file mode 100644
index 0f0c116..0000000
--- a/3rdparty/libe2ap/CellDeploymentStatusIndicator.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CellDeploymentStatusIndicator.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_CellDeploymentStatusIndicator_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_CellDeploymentStatusIndicator_value2enum_1[] = {
-	{ 0,	23,	"pre-change-notification" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_CellDeploymentStatusIndicator_enum2value_1[] = {
-	0	/* pre-change-notification(0) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_CellDeploymentStatusIndicator_specs_1 = {
-	asn_MAP_CellDeploymentStatusIndicator_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_CellDeploymentStatusIndicator_enum2value_1,	/* N => "tag"; sorted by N */
-	1,	/* Number of elements in the maps */
-	2,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_CellDeploymentStatusIndicator_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_CellDeploymentStatusIndicator = {
-	"CellDeploymentStatusIndicator",
-	"CellDeploymentStatusIndicator",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_CellDeploymentStatusIndicator_tags_1,
-	sizeof(asn_DEF_CellDeploymentStatusIndicator_tags_1)
-		/sizeof(asn_DEF_CellDeploymentStatusIndicator_tags_1[0]), /* 1 */
-	asn_DEF_CellDeploymentStatusIndicator_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CellDeploymentStatusIndicator_tags_1)
-		/sizeof(asn_DEF_CellDeploymentStatusIndicator_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CellDeploymentStatusIndicator_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_CellDeploymentStatusIndicator_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CellDeploymentStatusIndicator.h b/3rdparty/libe2ap/CellDeploymentStatusIndicator.h
deleted file mode 100644
index 475d8ee..0000000
--- a/3rdparty/libe2ap/CellDeploymentStatusIndicator.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CellDeploymentStatusIndicator_H_
-#define	_CellDeploymentStatusIndicator_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum CellDeploymentStatusIndicator {
-	CellDeploymentStatusIndicator_pre_change_notification	= 0
-	/*
-	 * Enumeration is extensible
-	 */
-} e_CellDeploymentStatusIndicator;
-
-/* CellDeploymentStatusIndicator */
-typedef long	 CellDeploymentStatusIndicator_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_CellDeploymentStatusIndicator_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_CellDeploymentStatusIndicator;
-extern const asn_INTEGER_specifics_t asn_SPC_CellDeploymentStatusIndicator_specs_1;
-asn_struct_free_f CellDeploymentStatusIndicator_free;
-asn_struct_print_f CellDeploymentStatusIndicator_print;
-asn_constr_check_f CellDeploymentStatusIndicator_constraint;
-ber_type_decoder_f CellDeploymentStatusIndicator_decode_ber;
-der_type_encoder_f CellDeploymentStatusIndicator_encode_der;
-xer_type_decoder_f CellDeploymentStatusIndicator_decode_xer;
-xer_type_encoder_f CellDeploymentStatusIndicator_encode_xer;
-per_type_decoder_f CellDeploymentStatusIndicator_decode_uper;
-per_type_encoder_f CellDeploymentStatusIndicator_encode_uper;
-per_type_decoder_f CellDeploymentStatusIndicator_decode_aper;
-per_type_encoder_f CellDeploymentStatusIndicator_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CellDeploymentStatusIndicator_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CellIdListforQMC.c b/3rdparty/libe2ap/CellIdListforQMC.c
deleted file mode 100644
index 524385f..0000000
--- a/3rdparty/libe2ap/CellIdListforQMC.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CellIdListforQMC.h"
-
-#include "ECGI.h"
-asn_per_constraints_t asn_PER_type_CellIdListforQMC_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 5,  5,  1,  32 }	/* (SIZE(1..32)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_CellIdListforQMC_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CellIdListforQMC_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_CellIdListforQMC_specs_1 = {
-	sizeof(struct CellIdListforQMC),
-	offsetof(struct CellIdListforQMC, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_CellIdListforQMC = {
-	"CellIdListforQMC",
-	"CellIdListforQMC",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_CellIdListforQMC_tags_1,
-	sizeof(asn_DEF_CellIdListforQMC_tags_1)
-		/sizeof(asn_DEF_CellIdListforQMC_tags_1[0]), /* 1 */
-	asn_DEF_CellIdListforQMC_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CellIdListforQMC_tags_1)
-		/sizeof(asn_DEF_CellIdListforQMC_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CellIdListforQMC_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_CellIdListforQMC_1,
-	1,	/* Single element */
-	&asn_SPC_CellIdListforQMC_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CellIdListforQMC.h b/3rdparty/libe2ap/CellIdListforQMC.h
deleted file mode 100644
index 1a22801..0000000
--- a/3rdparty/libe2ap/CellIdListforQMC.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CellIdListforQMC_H_
-#define	_CellIdListforQMC_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ECGI;
-
-/* CellIdListforQMC */
-typedef struct CellIdListforQMC {
-	A_SEQUENCE_OF(struct ECGI) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellIdListforQMC_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CellIdListforQMC;
-extern asn_SET_OF_specifics_t asn_SPC_CellIdListforQMC_specs_1;
-extern asn_TYPE_member_t asn_MBR_CellIdListforQMC_1[1];
-extern asn_per_constraints_t asn_PER_type_CellIdListforQMC_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CellIdListforQMC_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CellInformation-Item.c b/3rdparty/libe2ap/CellInformation-Item.c
deleted file mode 100644
index 20ade7d..0000000
--- a/3rdparty/libe2ap/CellInformation-Item.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CellInformation-Item.h"
-
-#include "UL-InterferenceOverloadIndication.h"
-#include "UL-HighInterferenceIndicationInfo.h"
-#include "RelativeNarrowbandTxPower.h"
-#include "ProtocolExtensionContainer.h"
-static asn_TYPE_member_t asn_MBR_CellInformation_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item, cell_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cell-ID"
-		},
-	{ ATF_POINTER, 4, offsetof(struct CellInformation_Item, ul_InterferenceOverloadIndication),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_UL_InterferenceOverloadIndication,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ul-InterferenceOverloadIndication"
-		},
-	{ ATF_POINTER, 3, offsetof(struct CellInformation_Item, ul_HighInterferenceIndicationInfo),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_UL_HighInterferenceIndicationInfo,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ul-HighInterferenceIndicationInfo"
-		},
-	{ ATF_POINTER, 2, offsetof(struct CellInformation_Item, relativeNarrowbandTxPower),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RelativeNarrowbandTxPower,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"relativeNarrowbandTxPower"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CellInformation_Item, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P0,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_CellInformation_Item_oms_1[] = { 1, 2, 3, 4 };
-static const ber_tlv_tag_t asn_DEF_CellInformation_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CellInformation_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cell-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ul-InterferenceOverloadIndication */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ul-HighInterferenceIndicationInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* relativeNarrowbandTxPower */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_CellInformation_Item_specs_1 = {
-	sizeof(struct CellInformation_Item),
-	offsetof(struct CellInformation_Item, _asn_ctx),
-	asn_MAP_CellInformation_Item_tag2el_1,
-	5,	/* Count of tags in the map */
-	asn_MAP_CellInformation_Item_oms_1,	/* Optional members */
-	4, 0,	/* Root/Additions */
-	5,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CellInformation_Item = {
-	"CellInformation-Item",
-	"CellInformation-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CellInformation_Item_tags_1,
-	sizeof(asn_DEF_CellInformation_Item_tags_1)
-		/sizeof(asn_DEF_CellInformation_Item_tags_1[0]), /* 1 */
-	asn_DEF_CellInformation_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CellInformation_Item_tags_1)
-		/sizeof(asn_DEF_CellInformation_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellInformation_Item_1,
-	5,	/* Elements count */
-	&asn_SPC_CellInformation_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CellInformation-Item.h b/3rdparty/libe2ap/CellInformation-Item.h
deleted file mode 100644
index e5821a5..0000000
--- a/3rdparty/libe2ap/CellInformation-Item.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CellInformation_Item_H_
-#define	_CellInformation_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ECGI.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct UL_InterferenceOverloadIndication;
-struct UL_HighInterferenceIndicationInfo;
-struct RelativeNarrowbandTxPower;
-struct ProtocolExtensionContainer;
-
-/* CellInformation-Item */
-typedef struct CellInformation_Item {
-	ECGI_t	 cell_ID;
-	struct UL_InterferenceOverloadIndication	*ul_InterferenceOverloadIndication;	/* OPTIONAL */
-	struct UL_HighInterferenceIndicationInfo	*ul_HighInterferenceIndicationInfo;	/* OPTIONAL */
-	struct RelativeNarrowbandTxPower	*relativeNarrowbandTxPower;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellInformation_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CellInformation_Item;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CellInformation_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CellInformation-List.c b/3rdparty/libe2ap/CellInformation-List.c
deleted file mode 100644
index dbd2382..0000000
--- a/3rdparty/libe2ap/CellInformation-List.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CellInformation-List.h"
-
-#include "ProtocolIE-Single-Container.h"
-static asn_per_constraints_t asn_PER_type_CellInformation_List_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_CellInformation_List_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtocolIE_Single_Container_8810P6,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CellInformation_List_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_CellInformation_List_specs_1 = {
-	sizeof(struct CellInformation_List),
-	offsetof(struct CellInformation_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_CellInformation_List = {
-	"CellInformation-List",
-	"CellInformation-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_CellInformation_List_tags_1,
-	sizeof(asn_DEF_CellInformation_List_tags_1)
-		/sizeof(asn_DEF_CellInformation_List_tags_1[0]), /* 1 */
-	asn_DEF_CellInformation_List_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CellInformation_List_tags_1)
-		/sizeof(asn_DEF_CellInformation_List_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CellInformation_List_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_CellInformation_List_1,
-	1,	/* Single element */
-	&asn_SPC_CellInformation_List_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CellInformation-List.h b/3rdparty/libe2ap/CellInformation-List.h
deleted file mode 100644
index aa3ea5b..0000000
--- a/3rdparty/libe2ap/CellInformation-List.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CellInformation_List_H_
-#define	_CellInformation_List_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolIE_Single_Container;
-
-/* CellInformation-List */
-typedef struct CellInformation_List {
-	A_SEQUENCE_OF(struct ProtocolIE_Single_Container) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellInformation_List_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CellInformation_List;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CellInformation_List_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CellMeasurementResult-Item.c b/3rdparty/libe2ap/CellMeasurementResult-Item.c
deleted file mode 100644
index 082845d..0000000
--- a/3rdparty/libe2ap/CellMeasurementResult-Item.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CellMeasurementResult-Item.h"
-
-#include "HWLoadIndicator.h"
-#include "S1TNLLoadIndicator.h"
-#include "RadioResourceStatus.h"
-#include "ProtocolExtensionContainer.h"
-static asn_TYPE_member_t asn_MBR_CellMeasurementResult_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item, cell_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cell-ID"
-		},
-	{ ATF_POINTER, 4, offsetof(struct CellMeasurementResult_Item, hWLoadIndicator),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_HWLoadIndicator,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"hWLoadIndicator"
-		},
-	{ ATF_POINTER, 3, offsetof(struct CellMeasurementResult_Item, s1TNLLoadIndicator),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_S1TNLLoadIndicator,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"s1TNLLoadIndicator"
-		},
-	{ ATF_POINTER, 2, offsetof(struct CellMeasurementResult_Item, radioResourceStatus),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RadioResourceStatus,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"radioResourceStatus"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CellMeasurementResult_Item, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P6,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_CellMeasurementResult_Item_oms_1[] = { 1, 2, 3, 4 };
-static const ber_tlv_tag_t asn_DEF_CellMeasurementResult_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CellMeasurementResult_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cell-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* hWLoadIndicator */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* s1TNLLoadIndicator */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* radioResourceStatus */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_CellMeasurementResult_Item_specs_1 = {
-	sizeof(struct CellMeasurementResult_Item),
-	offsetof(struct CellMeasurementResult_Item, _asn_ctx),
-	asn_MAP_CellMeasurementResult_Item_tag2el_1,
-	5,	/* Count of tags in the map */
-	asn_MAP_CellMeasurementResult_Item_oms_1,	/* Optional members */
-	4, 0,	/* Root/Additions */
-	5,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CellMeasurementResult_Item = {
-	"CellMeasurementResult-Item",
-	"CellMeasurementResult-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CellMeasurementResult_Item_tags_1,
-	sizeof(asn_DEF_CellMeasurementResult_Item_tags_1)
-		/sizeof(asn_DEF_CellMeasurementResult_Item_tags_1[0]), /* 1 */
-	asn_DEF_CellMeasurementResult_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CellMeasurementResult_Item_tags_1)
-		/sizeof(asn_DEF_CellMeasurementResult_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellMeasurementResult_Item_1,
-	5,	/* Elements count */
-	&asn_SPC_CellMeasurementResult_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CellMeasurementResult-Item.h b/3rdparty/libe2ap/CellMeasurementResult-Item.h
deleted file mode 100644
index 116d00f..0000000
--- a/3rdparty/libe2ap/CellMeasurementResult-Item.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CellMeasurementResult_Item_H_
-#define	_CellMeasurementResult_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ECGI.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct HWLoadIndicator;
-struct S1TNLLoadIndicator;
-struct RadioResourceStatus;
-struct ProtocolExtensionContainer;
-
-/* CellMeasurementResult-Item */
-typedef struct CellMeasurementResult_Item {
-	ECGI_t	 cell_ID;
-	struct HWLoadIndicator	*hWLoadIndicator;	/* OPTIONAL */
-	struct S1TNLLoadIndicator	*s1TNLLoadIndicator;	/* OPTIONAL */
-	struct RadioResourceStatus	*radioResourceStatus;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellMeasurementResult_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CellMeasurementResult_Item;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CellMeasurementResult_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CellMeasurementResult-List.c b/3rdparty/libe2ap/CellMeasurementResult-List.c
deleted file mode 100644
index c85845c..0000000
--- a/3rdparty/libe2ap/CellMeasurementResult-List.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CellMeasurementResult-List.h"
-
-#include "ProtocolIE-Single-Container.h"
-static asn_per_constraints_t asn_PER_type_CellMeasurementResult_List_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_CellMeasurementResult_List_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtocolIE_Single_Container_8810P11,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CellMeasurementResult_List_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_CellMeasurementResult_List_specs_1 = {
-	sizeof(struct CellMeasurementResult_List),
-	offsetof(struct CellMeasurementResult_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_CellMeasurementResult_List = {
-	"CellMeasurementResult-List",
-	"CellMeasurementResult-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_CellMeasurementResult_List_tags_1,
-	sizeof(asn_DEF_CellMeasurementResult_List_tags_1)
-		/sizeof(asn_DEF_CellMeasurementResult_List_tags_1[0]), /* 1 */
-	asn_DEF_CellMeasurementResult_List_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CellMeasurementResult_List_tags_1)
-		/sizeof(asn_DEF_CellMeasurementResult_List_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CellMeasurementResult_List_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_CellMeasurementResult_List_1,
-	1,	/* Single element */
-	&asn_SPC_CellMeasurementResult_List_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CellMeasurementResult-List.h b/3rdparty/libe2ap/CellMeasurementResult-List.h
deleted file mode 100644
index 23e749d..0000000
--- a/3rdparty/libe2ap/CellMeasurementResult-List.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CellMeasurementResult_List_H_
-#define	_CellMeasurementResult_List_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolIE_Single_Container;
-
-/* CellMeasurementResult-List */
-typedef struct CellMeasurementResult_List {
-	A_SEQUENCE_OF(struct ProtocolIE_Single_Container) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellMeasurementResult_List_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CellMeasurementResult_List;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CellMeasurementResult_List_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CellReplacingInfo.c b/3rdparty/libe2ap/CellReplacingInfo.c
deleted file mode 100644
index 1dbc7e6..0000000
--- a/3rdparty/libe2ap/CellReplacingInfo.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CellReplacingInfo.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_CellReplacingInfo_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellReplacingInfo, replacingCellsList),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ReplacingCellsList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"replacingCellsList"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CellReplacingInfo, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P26,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_CellReplacingInfo_oms_1[] = { 1 };
-static const ber_tlv_tag_t asn_DEF_CellReplacingInfo_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CellReplacingInfo_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* replacingCellsList */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CellReplacingInfo_specs_1 = {
-	sizeof(struct CellReplacingInfo),
-	offsetof(struct CellReplacingInfo, _asn_ctx),
-	asn_MAP_CellReplacingInfo_tag2el_1,
-	2,	/* Count of tags in the map */
-	asn_MAP_CellReplacingInfo_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CellReplacingInfo = {
-	"CellReplacingInfo",
-	"CellReplacingInfo",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CellReplacingInfo_tags_1,
-	sizeof(asn_DEF_CellReplacingInfo_tags_1)
-		/sizeof(asn_DEF_CellReplacingInfo_tags_1[0]), /* 1 */
-	asn_DEF_CellReplacingInfo_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CellReplacingInfo_tags_1)
-		/sizeof(asn_DEF_CellReplacingInfo_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellReplacingInfo_1,
-	2,	/* Elements count */
-	&asn_SPC_CellReplacingInfo_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CellReplacingInfo.h b/3rdparty/libe2ap/CellReplacingInfo.h
deleted file mode 100644
index 6bf2db6..0000000
--- a/3rdparty/libe2ap/CellReplacingInfo.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CellReplacingInfo_H_
-#define	_CellReplacingInfo_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ReplacingCellsList.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* CellReplacingInfo */
-typedef struct CellReplacingInfo {
-	ReplacingCellsList_t	 replacingCellsList;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellReplacingInfo_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CellReplacingInfo;
-extern asn_SEQUENCE_specifics_t asn_SPC_CellReplacingInfo_specs_1;
-extern asn_TYPE_member_t asn_MBR_CellReplacingInfo_1[2];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CellReplacingInfo_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CellReportingIndicator.c b/3rdparty/libe2ap/CellReportingIndicator.c
deleted file mode 100644
index 79e78ed..0000000
--- a/3rdparty/libe2ap/CellReportingIndicator.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CellReportingIndicator.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_CellReportingIndicator_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_CellReportingIndicator_value2enum_1[] = {
-	{ 0,	12,	"stop-request" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_CellReportingIndicator_enum2value_1[] = {
-	0	/* stop-request(0) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_CellReportingIndicator_specs_1 = {
-	asn_MAP_CellReportingIndicator_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_CellReportingIndicator_enum2value_1,	/* N => "tag"; sorted by N */
-	1,	/* Number of elements in the maps */
-	2,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_CellReportingIndicator_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_CellReportingIndicator = {
-	"CellReportingIndicator",
-	"CellReportingIndicator",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_CellReportingIndicator_tags_1,
-	sizeof(asn_DEF_CellReportingIndicator_tags_1)
-		/sizeof(asn_DEF_CellReportingIndicator_tags_1[0]), /* 1 */
-	asn_DEF_CellReportingIndicator_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CellReportingIndicator_tags_1)
-		/sizeof(asn_DEF_CellReportingIndicator_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CellReportingIndicator_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_CellReportingIndicator_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CellReportingIndicator.h b/3rdparty/libe2ap/CellReportingIndicator.h
deleted file mode 100644
index e415345..0000000
--- a/3rdparty/libe2ap/CellReportingIndicator.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CellReportingIndicator_H_
-#define	_CellReportingIndicator_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum CellReportingIndicator {
-	CellReportingIndicator_stop_request	= 0
-	/*
-	 * Enumeration is extensible
-	 */
-} e_CellReportingIndicator;
-
-/* CellReportingIndicator */
-typedef long	 CellReportingIndicator_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CellReportingIndicator;
-asn_struct_free_f CellReportingIndicator_free;
-asn_struct_print_f CellReportingIndicator_print;
-asn_constr_check_f CellReportingIndicator_constraint;
-ber_type_decoder_f CellReportingIndicator_decode_ber;
-der_type_encoder_f CellReportingIndicator_encode_der;
-xer_type_decoder_f CellReportingIndicator_decode_xer;
-xer_type_encoder_f CellReportingIndicator_encode_xer;
-per_type_decoder_f CellReportingIndicator_decode_uper;
-per_type_encoder_f CellReportingIndicator_encode_uper;
-per_type_decoder_f CellReportingIndicator_decode_aper;
-per_type_encoder_f CellReportingIndicator_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CellReportingIndicator_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CellToReport-Item.c b/3rdparty/libe2ap/CellToReport-Item.c
deleted file mode 100644
index 602ba10..0000000
--- a/3rdparty/libe2ap/CellToReport-Item.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CellToReport-Item.h"
-
-#include "ProtocolExtensionContainer.h"
-static asn_TYPE_member_t asn_MBR_CellToReport_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellToReport_Item, cell_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cell-ID"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CellToReport_Item, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_CellToReport_Item_oms_1[] = { 1 };
-static const ber_tlv_tag_t asn_DEF_CellToReport_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CellToReport_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cell-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_CellToReport_Item_specs_1 = {
-	sizeof(struct CellToReport_Item),
-	offsetof(struct CellToReport_Item, _asn_ctx),
-	asn_MAP_CellToReport_Item_tag2el_1,
-	2,	/* Count of tags in the map */
-	asn_MAP_CellToReport_Item_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CellToReport_Item = {
-	"CellToReport-Item",
-	"CellToReport-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CellToReport_Item_tags_1,
-	sizeof(asn_DEF_CellToReport_Item_tags_1)
-		/sizeof(asn_DEF_CellToReport_Item_tags_1[0]), /* 1 */
-	asn_DEF_CellToReport_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CellToReport_Item_tags_1)
-		/sizeof(asn_DEF_CellToReport_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellToReport_Item_1,
-	2,	/* Elements count */
-	&asn_SPC_CellToReport_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CellToReport-Item.h b/3rdparty/libe2ap/CellToReport-Item.h
deleted file mode 100644
index ef04b1f..0000000
--- a/3rdparty/libe2ap/CellToReport-Item.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CellToReport_Item_H_
-#define	_CellToReport_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ECGI.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* CellToReport-Item */
-typedef struct CellToReport_Item {
-	ECGI_t	 cell_ID;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellToReport_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CellToReport_Item;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CellToReport_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CellToReport-List.c b/3rdparty/libe2ap/CellToReport-List.c
deleted file mode 100644
index d89196b..0000000
--- a/3rdparty/libe2ap/CellToReport-List.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CellToReport-List.h"
-
-#include "ProtocolIE-Single-Container.h"
-static asn_per_constraints_t asn_PER_type_CellToReport_List_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_CellToReport_List_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtocolIE_Single_Container_8810P7,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CellToReport_List_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_CellToReport_List_specs_1 = {
-	sizeof(struct CellToReport_List),
-	offsetof(struct CellToReport_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_CellToReport_List = {
-	"CellToReport-List",
-	"CellToReport-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_CellToReport_List_tags_1,
-	sizeof(asn_DEF_CellToReport_List_tags_1)
-		/sizeof(asn_DEF_CellToReport_List_tags_1[0]), /* 1 */
-	asn_DEF_CellToReport_List_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CellToReport_List_tags_1)
-		/sizeof(asn_DEF_CellToReport_List_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CellToReport_List_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_CellToReport_List_1,
-	1,	/* Single element */
-	&asn_SPC_CellToReport_List_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CellToReport-List.h b/3rdparty/libe2ap/CellToReport-List.h
deleted file mode 100644
index 3743f5a..0000000
--- a/3rdparty/libe2ap/CellToReport-List.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CellToReport_List_H_
-#define	_CellToReport_List_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolIE_Single_Container;
-
-/* CellToReport-List */
-typedef struct CellToReport_List {
-	A_SEQUENCE_OF(struct ProtocolIE_Single_Container) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellToReport_List_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CellToReport_List;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CellToReport_List_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CoMPHypothesisSet.c b/3rdparty/libe2ap/CoMPHypothesisSet.c
deleted file mode 100644
index 76c2977..0000000
--- a/3rdparty/libe2ap/CoMPHypothesisSet.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CoMPHypothesisSet.h"
-
-#include "CoMPHypothesisSetItem.h"
-asn_per_constraints_t asn_PER_type_CoMPHypothesisSet_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 5,  5,  1,  32 }	/* (SIZE(1..32)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_CoMPHypothesisSet_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CoMPHypothesisSetItem,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CoMPHypothesisSet_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_CoMPHypothesisSet_specs_1 = {
-	sizeof(struct CoMPHypothesisSet),
-	offsetof(struct CoMPHypothesisSet, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_CoMPHypothesisSet = {
-	"CoMPHypothesisSet",
-	"CoMPHypothesisSet",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_CoMPHypothesisSet_tags_1,
-	sizeof(asn_DEF_CoMPHypothesisSet_tags_1)
-		/sizeof(asn_DEF_CoMPHypothesisSet_tags_1[0]), /* 1 */
-	asn_DEF_CoMPHypothesisSet_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CoMPHypothesisSet_tags_1)
-		/sizeof(asn_DEF_CoMPHypothesisSet_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CoMPHypothesisSet_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_CoMPHypothesisSet_1,
-	1,	/* Single element */
-	&asn_SPC_CoMPHypothesisSet_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CoMPHypothesisSet.h b/3rdparty/libe2ap/CoMPHypothesisSet.h
deleted file mode 100644
index 2e7236f..0000000
--- a/3rdparty/libe2ap/CoMPHypothesisSet.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CoMPHypothesisSet_H_
-#define	_CoMPHypothesisSet_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct CoMPHypothesisSetItem;
-
-/* CoMPHypothesisSet */
-typedef struct CoMPHypothesisSet {
-	A_SEQUENCE_OF(struct CoMPHypothesisSetItem) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CoMPHypothesisSet_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CoMPHypothesisSet;
-extern asn_SET_OF_specifics_t asn_SPC_CoMPHypothesisSet_specs_1;
-extern asn_TYPE_member_t asn_MBR_CoMPHypothesisSet_1[1];
-extern asn_per_constraints_t asn_PER_type_CoMPHypothesisSet_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CoMPHypothesisSet_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CoMPHypothesisSetItem.c b/3rdparty/libe2ap/CoMPHypothesisSetItem.c
deleted file mode 100644
index 5c06295..0000000
--- a/3rdparty/libe2ap/CoMPHypothesisSetItem.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CoMPHypothesisSetItem.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_coMPHypothesis_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size >= 6 && size <= 4400)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_coMPHypothesis_constr_3 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  13,  13,  6,  4400 }	/* (SIZE(6..4400,...)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_CoMPHypothesisSetItem_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPHypothesisSetItem, coMPCellID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"coMPCellID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPHypothesisSetItem, coMPHypothesis),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_coMPHypothesis_constr_3,  memb_coMPHypothesis_constraint_1 },
-		0, 0, /* No default value */
-		"coMPHypothesis"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CoMPHypothesisSetItem, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P27,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_CoMPHypothesisSetItem_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_CoMPHypothesisSetItem_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CoMPHypothesisSetItem_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* coMPCellID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* coMPHypothesis */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CoMPHypothesisSetItem_specs_1 = {
-	sizeof(struct CoMPHypothesisSetItem),
-	offsetof(struct CoMPHypothesisSetItem, _asn_ctx),
-	asn_MAP_CoMPHypothesisSetItem_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_CoMPHypothesisSetItem_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CoMPHypothesisSetItem = {
-	"CoMPHypothesisSetItem",
-	"CoMPHypothesisSetItem",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CoMPHypothesisSetItem_tags_1,
-	sizeof(asn_DEF_CoMPHypothesisSetItem_tags_1)
-		/sizeof(asn_DEF_CoMPHypothesisSetItem_tags_1[0]), /* 1 */
-	asn_DEF_CoMPHypothesisSetItem_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CoMPHypothesisSetItem_tags_1)
-		/sizeof(asn_DEF_CoMPHypothesisSetItem_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CoMPHypothesisSetItem_1,
-	3,	/* Elements count */
-	&asn_SPC_CoMPHypothesisSetItem_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CoMPHypothesisSetItem.h b/3rdparty/libe2ap/CoMPHypothesisSetItem.h
deleted file mode 100644
index 532ce56..0000000
--- a/3rdparty/libe2ap/CoMPHypothesisSetItem.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CoMPHypothesisSetItem_H_
-#define	_CoMPHypothesisSetItem_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ECGI.h"
-#include "BIT_STRING.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* CoMPHypothesisSetItem */
-typedef struct CoMPHypothesisSetItem {
-	ECGI_t	 coMPCellID;
-	BIT_STRING_t	 coMPHypothesis;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CoMPHypothesisSetItem_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CoMPHypothesisSetItem;
-extern asn_SEQUENCE_specifics_t asn_SPC_CoMPHypothesisSetItem_specs_1;
-extern asn_TYPE_member_t asn_MBR_CoMPHypothesisSetItem_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CoMPHypothesisSetItem_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CoMPInformation.c b/3rdparty/libe2ap/CoMPInformation.c
deleted file mode 100644
index 5ff71ae..0000000
--- a/3rdparty/libe2ap/CoMPInformation.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CoMPInformation.h"
-
-#include "ProtocolExtensionContainer.h"
-static asn_TYPE_member_t asn_MBR_CoMPInformation_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformation, coMPInformationItem),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CoMPInformationItem,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"coMPInformationItem"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformation, coMPInformationStartTime),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CoMPInformationStartTime,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"coMPInformationStartTime"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CoMPInformation, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P28,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_CoMPInformation_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_CoMPInformation_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CoMPInformation_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* coMPInformationItem */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* coMPInformationStartTime */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_CoMPInformation_specs_1 = {
-	sizeof(struct CoMPInformation),
-	offsetof(struct CoMPInformation, _asn_ctx),
-	asn_MAP_CoMPInformation_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_CoMPInformation_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CoMPInformation = {
-	"CoMPInformation",
-	"CoMPInformation",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CoMPInformation_tags_1,
-	sizeof(asn_DEF_CoMPInformation_tags_1)
-		/sizeof(asn_DEF_CoMPInformation_tags_1[0]), /* 1 */
-	asn_DEF_CoMPInformation_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CoMPInformation_tags_1)
-		/sizeof(asn_DEF_CoMPInformation_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CoMPInformation_1,
-	3,	/* Elements count */
-	&asn_SPC_CoMPInformation_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CoMPInformation.h b/3rdparty/libe2ap/CoMPInformation.h
deleted file mode 100644
index 83f6ec3..0000000
--- a/3rdparty/libe2ap/CoMPInformation.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CoMPInformation_H_
-#define	_CoMPInformation_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "CoMPInformationItem.h"
-#include "CoMPInformationStartTime.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* CoMPInformation */
-typedef struct CoMPInformation {
-	CoMPInformationItem_t	 coMPInformationItem;
-	CoMPInformationStartTime_t	 coMPInformationStartTime;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CoMPInformation_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CoMPInformation;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CoMPInformation_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CoMPInformationItem.c b/3rdparty/libe2ap/CoMPInformationItem.c
deleted file mode 100644
index 3d3786d..0000000
--- a/3rdparty/libe2ap/CoMPInformationItem.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CoMPInformationItem.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_per_constraints_t asn_PER_type_CoMPInformationItem_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_Member_2[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformationItem__Member, coMPHypothesisSet),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CoMPHypothesisSet,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"coMPHypothesisSet"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformationItem__Member, benefitMetric),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BenefitMetric,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"benefitMetric"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CoMPInformationItem__Member, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P29,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_Member_oms_2[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* coMPHypothesisSet */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* benefitMetric */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
-	sizeof(struct CoMPInformationItem__Member),
-	offsetof(struct CoMPInformationItem__Member, _asn_ctx),
-	asn_MAP_Member_tag2el_2,
-	3,	/* Count of tags in the map */
-	asn_MAP_Member_oms_2,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_Member_2 = {
-	"SEQUENCE",
-	"SEQUENCE",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Member_tags_2,
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	asn_DEF_Member_tags_2,	/* Same as above */
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Member_2,
-	3,	/* Elements count */
-	&asn_SPC_Member_specs_2	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CoMPInformationItem_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Member_2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CoMPInformationItem_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_CoMPInformationItem_specs_1 = {
-	sizeof(struct CoMPInformationItem),
-	offsetof(struct CoMPInformationItem, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_CoMPInformationItem = {
-	"CoMPInformationItem",
-	"CoMPInformationItem",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_CoMPInformationItem_tags_1,
-	sizeof(asn_DEF_CoMPInformationItem_tags_1)
-		/sizeof(asn_DEF_CoMPInformationItem_tags_1[0]), /* 1 */
-	asn_DEF_CoMPInformationItem_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CoMPInformationItem_tags_1)
-		/sizeof(asn_DEF_CoMPInformationItem_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CoMPInformationItem_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_CoMPInformationItem_1,
-	1,	/* Single element */
-	&asn_SPC_CoMPInformationItem_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CoMPInformationItem.h b/3rdparty/libe2ap/CoMPInformationItem.h
deleted file mode 100644
index 5f8344d..0000000
--- a/3rdparty/libe2ap/CoMPInformationItem.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CoMPInformationItem_H_
-#define	_CoMPInformationItem_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "CoMPHypothesisSet.h"
-#include "BenefitMetric.h"
-#include "constr_SEQUENCE.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* Forward definitions */
-typedef struct CoMPInformationItem__Member {
-	CoMPHypothesisSet_t	 coMPHypothesisSet;
-	BenefitMetric_t	 benefitMetric;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CoMPInformationItem__Member;
-
-/* CoMPInformationItem */
-typedef struct CoMPInformationItem {
-	A_SEQUENCE_OF(CoMPInformationItem__Member) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CoMPInformationItem_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CoMPInformationItem;
-extern asn_SET_OF_specifics_t asn_SPC_CoMPInformationItem_specs_1;
-extern asn_TYPE_member_t asn_MBR_CoMPInformationItem_1[1];
-extern asn_per_constraints_t asn_PER_type_CoMPInformationItem_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CoMPInformationItem_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CoMPInformationStartTime.c b/3rdparty/libe2ap/CoMPInformationStartTime.c
deleted file mode 100644
index e52e0f8..0000000
--- a/3rdparty/libe2ap/CoMPInformationStartTime.c
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CoMPInformationStartTime.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_startSFN_constraint_2(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 1023)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_startSubframeNumber_constraint_2(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 9)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_startSFN_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  10,  10,  0,  1023 }	/* (0..1023,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_startSubframeNumber_constr_4 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  4,  4,  0,  9 }	/* (0..9,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_CoMPInformationStartTime_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 1,  1,  0,  1 }	/* (SIZE(0..1)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_Member_2[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformationStartTime__Member, startSFN),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_startSFN_constr_3,  memb_startSFN_constraint_2 },
-		0, 0, /* No default value */
-		"startSFN"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformationStartTime__Member, startSubframeNumber),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_startSubframeNumber_constr_4,  memb_startSubframeNumber_constraint_2 },
-		0, 0, /* No default value */
-		"startSubframeNumber"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CoMPInformationStartTime__Member, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P30,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_Member_oms_2[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* startSFN */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* startSubframeNumber */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
-	sizeof(struct CoMPInformationStartTime__Member),
-	offsetof(struct CoMPInformationStartTime__Member, _asn_ctx),
-	asn_MAP_Member_tag2el_2,
-	3,	/* Count of tags in the map */
-	asn_MAP_Member_oms_2,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_Member_2 = {
-	"SEQUENCE",
-	"SEQUENCE",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Member_tags_2,
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	asn_DEF_Member_tags_2,	/* Same as above */
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Member_2,
-	3,	/* Elements count */
-	&asn_SPC_Member_specs_2	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CoMPInformationStartTime_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Member_2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CoMPInformationStartTime_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_CoMPInformationStartTime_specs_1 = {
-	sizeof(struct CoMPInformationStartTime),
-	offsetof(struct CoMPInformationStartTime, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_CoMPInformationStartTime = {
-	"CoMPInformationStartTime",
-	"CoMPInformationStartTime",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_CoMPInformationStartTime_tags_1,
-	sizeof(asn_DEF_CoMPInformationStartTime_tags_1)
-		/sizeof(asn_DEF_CoMPInformationStartTime_tags_1[0]), /* 1 */
-	asn_DEF_CoMPInformationStartTime_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CoMPInformationStartTime_tags_1)
-		/sizeof(asn_DEF_CoMPInformationStartTime_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CoMPInformationStartTime_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_CoMPInformationStartTime_1,
-	1,	/* Single element */
-	&asn_SPC_CoMPInformationStartTime_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CoMPInformationStartTime.h b/3rdparty/libe2ap/CoMPInformationStartTime.h
deleted file mode 100644
index 656157d..0000000
--- a/3rdparty/libe2ap/CoMPInformationStartTime.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CoMPInformationStartTime_H_
-#define	_CoMPInformationStartTime_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "NativeInteger.h"
-#include "constr_SEQUENCE.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* Forward definitions */
-typedef struct CoMPInformationStartTime__Member {
-	long	 startSFN;
-	long	 startSubframeNumber;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CoMPInformationStartTime__Member;
-
-/* CoMPInformationStartTime */
-typedef struct CoMPInformationStartTime {
-	A_SEQUENCE_OF(CoMPInformationStartTime__Member) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CoMPInformationStartTime_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CoMPInformationStartTime;
-extern asn_SET_OF_specifics_t asn_SPC_CoMPInformationStartTime_specs_1;
-extern asn_TYPE_member_t asn_MBR_CoMPInformationStartTime_1[1];
-extern asn_per_constraints_t asn_PER_type_CoMPInformationStartTime_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CoMPInformationStartTime_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CompleteFailureCauseInformation-Item.c b/3rdparty/libe2ap/CompleteFailureCauseInformation-Item.c
deleted file mode 100644
index 3edd719..0000000
--- a/3rdparty/libe2ap/CompleteFailureCauseInformation-Item.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CompleteFailureCauseInformation-Item.h"
-
-#include "ProtocolExtensionContainer.h"
-static asn_TYPE_member_t asn_MBR_CompleteFailureCauseInformation_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CompleteFailureCauseInformation_Item, cell_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cell-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CompleteFailureCauseInformation_Item, measurementFailureCause_List),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_MeasurementFailureCause_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"measurementFailureCause-List"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CompleteFailureCauseInformation_Item, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P5,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_CompleteFailureCauseInformation_Item_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_CompleteFailureCauseInformation_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CompleteFailureCauseInformation_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cell-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* measurementFailureCause-List */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_CompleteFailureCauseInformation_Item_specs_1 = {
-	sizeof(struct CompleteFailureCauseInformation_Item),
-	offsetof(struct CompleteFailureCauseInformation_Item, _asn_ctx),
-	asn_MAP_CompleteFailureCauseInformation_Item_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_CompleteFailureCauseInformation_Item_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CompleteFailureCauseInformation_Item = {
-	"CompleteFailureCauseInformation-Item",
-	"CompleteFailureCauseInformation-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CompleteFailureCauseInformation_Item_tags_1,
-	sizeof(asn_DEF_CompleteFailureCauseInformation_Item_tags_1)
-		/sizeof(asn_DEF_CompleteFailureCauseInformation_Item_tags_1[0]), /* 1 */
-	asn_DEF_CompleteFailureCauseInformation_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CompleteFailureCauseInformation_Item_tags_1)
-		/sizeof(asn_DEF_CompleteFailureCauseInformation_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CompleteFailureCauseInformation_Item_1,
-	3,	/* Elements count */
-	&asn_SPC_CompleteFailureCauseInformation_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CompleteFailureCauseInformation-Item.h b/3rdparty/libe2ap/CompleteFailureCauseInformation-Item.h
deleted file mode 100644
index d5834ee..0000000
--- a/3rdparty/libe2ap/CompleteFailureCauseInformation-Item.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CompleteFailureCauseInformation_Item_H_
-#define	_CompleteFailureCauseInformation_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ECGI.h"
-#include "MeasurementFailureCause-List.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* CompleteFailureCauseInformation-Item */
-typedef struct CompleteFailureCauseInformation_Item {
-	ECGI_t	 cell_ID;
-	MeasurementFailureCause_List_t	 measurementFailureCause_List;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CompleteFailureCauseInformation_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CompleteFailureCauseInformation_Item;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CompleteFailureCauseInformation_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CompleteFailureCauseInformation-List.c b/3rdparty/libe2ap/CompleteFailureCauseInformation-List.c
deleted file mode 100644
index 9dbc132..0000000
--- a/3rdparty/libe2ap/CompleteFailureCauseInformation-List.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CompleteFailureCauseInformation-List.h"
-
-#include "ProtocolIE-Single-Container.h"
-static asn_per_constraints_t asn_PER_type_CompleteFailureCauseInformation_List_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_CompleteFailureCauseInformation_List_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtocolIE_Single_Container_8810P10,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CompleteFailureCauseInformation_List_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_CompleteFailureCauseInformation_List_specs_1 = {
-	sizeof(struct CompleteFailureCauseInformation_List),
-	offsetof(struct CompleteFailureCauseInformation_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_CompleteFailureCauseInformation_List = {
-	"CompleteFailureCauseInformation-List",
-	"CompleteFailureCauseInformation-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_CompleteFailureCauseInformation_List_tags_1,
-	sizeof(asn_DEF_CompleteFailureCauseInformation_List_tags_1)
-		/sizeof(asn_DEF_CompleteFailureCauseInformation_List_tags_1[0]), /* 1 */
-	asn_DEF_CompleteFailureCauseInformation_List_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CompleteFailureCauseInformation_List_tags_1)
-		/sizeof(asn_DEF_CompleteFailureCauseInformation_List_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CompleteFailureCauseInformation_List_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_CompleteFailureCauseInformation_List_1,
-	1,	/* Single element */
-	&asn_SPC_CompleteFailureCauseInformation_List_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CompleteFailureCauseInformation-List.h b/3rdparty/libe2ap/CompleteFailureCauseInformation-List.h
deleted file mode 100644
index 080af7c..0000000
--- a/3rdparty/libe2ap/CompleteFailureCauseInformation-List.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CompleteFailureCauseInformation_List_H_
-#define	_CompleteFailureCauseInformation_List_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolIE_Single_Container;
-
-/* CompleteFailureCauseInformation-List */
-typedef struct CompleteFailureCauseInformation_List {
-	A_SEQUENCE_OF(struct ProtocolIE_Single_Container) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CompleteFailureCauseInformation_List_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CompleteFailureCauseInformation_List;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CompleteFailureCauseInformation_List_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CompositeAvailableCapacity.c b/3rdparty/libe2ap/CompositeAvailableCapacity.c
deleted file mode 100644
index 0a3a1cc..0000000
--- a/3rdparty/libe2ap/CompositeAvailableCapacity.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CompositeAvailableCapacity.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_CompositeAvailableCapacity_1[] = {
-	{ ATF_POINTER, 1, offsetof(struct CompositeAvailableCapacity, cellCapacityClassValue),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CellCapacityClassValue,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cellCapacityClassValue"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CompositeAvailableCapacity, capacityValue),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CapacityValue,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"capacityValue"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CompositeAvailableCapacity, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P31,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_CompositeAvailableCapacity_oms_1[] = { 0, 2 };
-static const ber_tlv_tag_t asn_DEF_CompositeAvailableCapacity_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CompositeAvailableCapacity_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cellCapacityClassValue */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* capacityValue */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CompositeAvailableCapacity_specs_1 = {
-	sizeof(struct CompositeAvailableCapacity),
-	offsetof(struct CompositeAvailableCapacity, _asn_ctx),
-	asn_MAP_CompositeAvailableCapacity_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_CompositeAvailableCapacity_oms_1,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CompositeAvailableCapacity = {
-	"CompositeAvailableCapacity",
-	"CompositeAvailableCapacity",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CompositeAvailableCapacity_tags_1,
-	sizeof(asn_DEF_CompositeAvailableCapacity_tags_1)
-		/sizeof(asn_DEF_CompositeAvailableCapacity_tags_1[0]), /* 1 */
-	asn_DEF_CompositeAvailableCapacity_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CompositeAvailableCapacity_tags_1)
-		/sizeof(asn_DEF_CompositeAvailableCapacity_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CompositeAvailableCapacity_1,
-	3,	/* Elements count */
-	&asn_SPC_CompositeAvailableCapacity_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CompositeAvailableCapacity.h b/3rdparty/libe2ap/CompositeAvailableCapacity.h
deleted file mode 100644
index c744542..0000000
--- a/3rdparty/libe2ap/CompositeAvailableCapacity.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CompositeAvailableCapacity_H_
-#define	_CompositeAvailableCapacity_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "CellCapacityClassValue.h"
-#include "CapacityValue.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* CompositeAvailableCapacity */
-typedef struct CompositeAvailableCapacity {
-	CellCapacityClassValue_t	*cellCapacityClassValue;	/* OPTIONAL */
-	CapacityValue_t	 capacityValue;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CompositeAvailableCapacity_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CompositeAvailableCapacity;
-extern asn_SEQUENCE_specifics_t asn_SPC_CompositeAvailableCapacity_specs_1;
-extern asn_TYPE_member_t asn_MBR_CompositeAvailableCapacity_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CompositeAvailableCapacity_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CompositeAvailableCapacityGroup.c b/3rdparty/libe2ap/CompositeAvailableCapacityGroup.c
deleted file mode 100644
index df7ce8c..0000000
--- a/3rdparty/libe2ap/CompositeAvailableCapacityGroup.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CompositeAvailableCapacityGroup.h"
-
-#include "ProtocolExtensionContainer.h"
-static asn_TYPE_member_t asn_MBR_CompositeAvailableCapacityGroup_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CompositeAvailableCapacityGroup, dL_CompositeAvailableCapacity),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CompositeAvailableCapacity,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"dL-CompositeAvailableCapacity"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CompositeAvailableCapacityGroup, uL_CompositeAvailableCapacity),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CompositeAvailableCapacity,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"uL-CompositeAvailableCapacity"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CompositeAvailableCapacityGroup, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P32,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_CompositeAvailableCapacityGroup_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_CompositeAvailableCapacityGroup_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CompositeAvailableCapacityGroup_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* dL-CompositeAvailableCapacity */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* uL-CompositeAvailableCapacity */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_CompositeAvailableCapacityGroup_specs_1 = {
-	sizeof(struct CompositeAvailableCapacityGroup),
-	offsetof(struct CompositeAvailableCapacityGroup, _asn_ctx),
-	asn_MAP_CompositeAvailableCapacityGroup_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_CompositeAvailableCapacityGroup_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CompositeAvailableCapacityGroup = {
-	"CompositeAvailableCapacityGroup",
-	"CompositeAvailableCapacityGroup",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CompositeAvailableCapacityGroup_tags_1,
-	sizeof(asn_DEF_CompositeAvailableCapacityGroup_tags_1)
-		/sizeof(asn_DEF_CompositeAvailableCapacityGroup_tags_1[0]), /* 1 */
-	asn_DEF_CompositeAvailableCapacityGroup_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CompositeAvailableCapacityGroup_tags_1)
-		/sizeof(asn_DEF_CompositeAvailableCapacityGroup_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CompositeAvailableCapacityGroup_1,
-	3,	/* Elements count */
-	&asn_SPC_CompositeAvailableCapacityGroup_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CompositeAvailableCapacityGroup.h b/3rdparty/libe2ap/CompositeAvailableCapacityGroup.h
deleted file mode 100644
index 2f54e50..0000000
--- a/3rdparty/libe2ap/CompositeAvailableCapacityGroup.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CompositeAvailableCapacityGroup_H_
-#define	_CompositeAvailableCapacityGroup_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "CompositeAvailableCapacity.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* CompositeAvailableCapacityGroup */
-typedef struct CompositeAvailableCapacityGroup {
-	CompositeAvailableCapacity_t	 dL_CompositeAvailableCapacity;
-	CompositeAvailableCapacity_t	 uL_CompositeAvailableCapacity;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CompositeAvailableCapacityGroup_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CompositeAvailableCapacityGroup;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CompositeAvailableCapacityGroup_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CoverageModification-Item.c b/3rdparty/libe2ap/CoverageModification-Item.c
deleted file mode 100644
index d288029..0000000
--- a/3rdparty/libe2ap/CoverageModification-Item.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CoverageModification-Item.h"
-
-#include "CellReplacingInfo.h"
-static int
-memb_coverageState_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 15)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_coverageState_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  4,  4,  0,  15 }	/* (0..15,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_CoverageModification_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CoverageModification_Item, eCGI),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"eCGI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CoverageModification_Item, coverageState),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_coverageState_constr_3,  memb_coverageState_constraint_1 },
-		0, 0, /* No default value */
-		"coverageState"
-		},
-	{ ATF_POINTER, 2, offsetof(struct CoverageModification_Item, cellDeploymentStatusIndicator),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CellDeploymentStatusIndicator,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cellDeploymentStatusIndicator"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CoverageModification_Item, cellReplacingInfo),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CellReplacingInfo,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cellReplacingInfo"
-		},
-};
-static const int asn_MAP_CoverageModification_Item_oms_1[] = { 2, 3 };
-static const ber_tlv_tag_t asn_DEF_CoverageModification_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CoverageModification_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* eCGI */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* coverageState */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* cellDeploymentStatusIndicator */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* cellReplacingInfo */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CoverageModification_Item_specs_1 = {
-	sizeof(struct CoverageModification_Item),
-	offsetof(struct CoverageModification_Item, _asn_ctx),
-	asn_MAP_CoverageModification_Item_tag2el_1,
-	4,	/* Count of tags in the map */
-	asn_MAP_CoverageModification_Item_oms_1,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CoverageModification_Item = {
-	"CoverageModification-Item",
-	"CoverageModification-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CoverageModification_Item_tags_1,
-	sizeof(asn_DEF_CoverageModification_Item_tags_1)
-		/sizeof(asn_DEF_CoverageModification_Item_tags_1[0]), /* 1 */
-	asn_DEF_CoverageModification_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CoverageModification_Item_tags_1)
-		/sizeof(asn_DEF_CoverageModification_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CoverageModification_Item_1,
-	4,	/* Elements count */
-	&asn_SPC_CoverageModification_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CoverageModification-Item.h b/3rdparty/libe2ap/CoverageModification-Item.h
deleted file mode 100644
index 897f4fa..0000000
--- a/3rdparty/libe2ap/CoverageModification-Item.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CoverageModification_Item_H_
-#define	_CoverageModification_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ECGI.h"
-#include "NativeInteger.h"
-#include "CellDeploymentStatusIndicator.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct CellReplacingInfo;
-
-/* CoverageModification-Item */
-typedef struct CoverageModification_Item {
-	ECGI_t	 eCGI;
-	long	 coverageState;
-	CellDeploymentStatusIndicator_t	*cellDeploymentStatusIndicator;	/* OPTIONAL */
-	struct CellReplacingInfo	*cellReplacingInfo;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CoverageModification_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CoverageModification_Item;
-extern asn_SEQUENCE_specifics_t asn_SPC_CoverageModification_Item_specs_1;
-extern asn_TYPE_member_t asn_MBR_CoverageModification_Item_1[4];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CoverageModification_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CoverageModificationList.c b/3rdparty/libe2ap/CoverageModificationList.c
deleted file mode 100644
index 3544da1..0000000
--- a/3rdparty/libe2ap/CoverageModificationList.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CoverageModificationList.h"
-
-#include "CoverageModification-Item.h"
-static asn_per_constraints_t asn_PER_type_CoverageModificationList_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_CoverageModificationList_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CoverageModification_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CoverageModificationList_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_CoverageModificationList_specs_1 = {
-	sizeof(struct CoverageModificationList),
-	offsetof(struct CoverageModificationList, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_CoverageModificationList = {
-	"CoverageModificationList",
-	"CoverageModificationList",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_CoverageModificationList_tags_1,
-	sizeof(asn_DEF_CoverageModificationList_tags_1)
-		/sizeof(asn_DEF_CoverageModificationList_tags_1[0]), /* 1 */
-	asn_DEF_CoverageModificationList_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CoverageModificationList_tags_1)
-		/sizeof(asn_DEF_CoverageModificationList_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CoverageModificationList_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_CoverageModificationList_1,
-	1,	/* Single element */
-	&asn_SPC_CoverageModificationList_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CoverageModificationList.h b/3rdparty/libe2ap/CoverageModificationList.h
deleted file mode 100644
index 992f4f6..0000000
--- a/3rdparty/libe2ap/CoverageModificationList.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CoverageModificationList_H_
-#define	_CoverageModificationList_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct CoverageModification_Item;
-
-/* CoverageModificationList */
-typedef struct CoverageModificationList {
-	A_SEQUENCE_OF(struct CoverageModification_Item) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CoverageModificationList_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CoverageModificationList;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CoverageModificationList_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/Criticality.c b/3rdparty/libe2ap/Criticality.c
deleted file mode 100644
index 71b7f6c..0000000
--- a/3rdparty/libe2ap/Criticality.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-CommonDataTypes"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "Criticality.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_Criticality_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_Criticality_value2enum_1[] = {
-	{ 0,	6,	"reject" },
-	{ 1,	6,	"ignore" },
-	{ 2,	6,	"notify" }
-};
-static const unsigned int asn_MAP_Criticality_enum2value_1[] = {
-	1,	/* ignore(1) */
-	2,	/* notify(2) */
-	0	/* reject(0) */
-};
-const asn_INTEGER_specifics_t asn_SPC_Criticality_specs_1 = {
-	asn_MAP_Criticality_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_Criticality_enum2value_1,	/* N => "tag"; sorted by N */
-	3,	/* Number of elements in the maps */
-	0,	/* Enumeration is not extensible */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_Criticality_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_Criticality = {
-	"Criticality",
-	"Criticality",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_Criticality_tags_1,
-	sizeof(asn_DEF_Criticality_tags_1)
-		/sizeof(asn_DEF_Criticality_tags_1[0]), /* 1 */
-	asn_DEF_Criticality_tags_1,	/* Same as above */
-	sizeof(asn_DEF_Criticality_tags_1)
-		/sizeof(asn_DEF_Criticality_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_Criticality_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_Criticality_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/Criticality.h b/3rdparty/libe2ap/Criticality.h
deleted file mode 100644
index 87ca5f4..0000000
--- a/3rdparty/libe2ap/Criticality.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-CommonDataTypes"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_Criticality_H_
-#define	_Criticality_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum Criticality {
-	Criticality_reject	= 0,
-	Criticality_ignore	= 1,
-	Criticality_notify	= 2
-} e_Criticality;
-
-/* Criticality */
-typedef long	 Criticality_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_Criticality_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_Criticality;
-extern const asn_INTEGER_specifics_t asn_SPC_Criticality_specs_1;
-asn_struct_free_f Criticality_free;
-asn_struct_print_f Criticality_print;
-asn_constr_check_f Criticality_constraint;
-ber_type_decoder_f Criticality_decode_ber;
-der_type_encoder_f Criticality_encode_der;
-xer_type_decoder_f Criticality_decode_xer;
-xer_type_encoder_f Criticality_encode_xer;
-per_type_decoder_f Criticality_decode_uper;
-per_type_encoder_f Criticality_encode_uper;
-per_type_decoder_f Criticality_decode_aper;
-per_type_encoder_f Criticality_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _Criticality_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CriticalityDiagnostics-IE-List.c b/3rdparty/libe2ap/CriticalityDiagnostics-IE-List.c
deleted file mode 100644
index 210eb31..0000000
--- a/3rdparty/libe2ap/CriticalityDiagnostics-IE-List.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CriticalityDiagnostics-IE-List.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_per_constraints_t asn_PER_type_CriticalityDiagnostics_IE_List_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_Member_2[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_List__Member, iECriticality),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iECriticality"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_List__Member, iE_ID),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_List__Member, typeOfError),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_TypeOfError,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"typeOfError"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CriticalityDiagnostics_IE_List__Member, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P34,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_Member_oms_2[] = { 3 };
-static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* iECriticality */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iE-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* typeOfError */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
-	sizeof(struct CriticalityDiagnostics_IE_List__Member),
-	offsetof(struct CriticalityDiagnostics_IE_List__Member, _asn_ctx),
-	asn_MAP_Member_tag2el_2,
-	4,	/* Count of tags in the map */
-	asn_MAP_Member_oms_2,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_Member_2 = {
-	"SEQUENCE",
-	"SEQUENCE",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Member_tags_2,
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	asn_DEF_Member_tags_2,	/* Same as above */
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Member_2,
-	4,	/* Elements count */
-	&asn_SPC_Member_specs_2	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_List_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Member_2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CriticalityDiagnostics_IE_List_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_CriticalityDiagnostics_IE_List_specs_1 = {
-	sizeof(struct CriticalityDiagnostics_IE_List),
-	offsetof(struct CriticalityDiagnostics_IE_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_List = {
-	"CriticalityDiagnostics-IE-List",
-	"CriticalityDiagnostics-IE-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_CriticalityDiagnostics_IE_List_tags_1,
-	sizeof(asn_DEF_CriticalityDiagnostics_IE_List_tags_1)
-		/sizeof(asn_DEF_CriticalityDiagnostics_IE_List_tags_1[0]), /* 1 */
-	asn_DEF_CriticalityDiagnostics_IE_List_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CriticalityDiagnostics_IE_List_tags_1)
-		/sizeof(asn_DEF_CriticalityDiagnostics_IE_List_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CriticalityDiagnostics_IE_List_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_CriticalityDiagnostics_IE_List_1,
-	1,	/* Single element */
-	&asn_SPC_CriticalityDiagnostics_IE_List_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CriticalityDiagnostics-IE-List.h b/3rdparty/libe2ap/CriticalityDiagnostics-IE-List.h
deleted file mode 100644
index 3c4076f..0000000
--- a/3rdparty/libe2ap/CriticalityDiagnostics-IE-List.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CriticalityDiagnostics_IE_List_H_
-#define	_CriticalityDiagnostics_IE_List_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "Criticality.h"
-#include "ProtocolIE-ID.h"
-#include "TypeOfError.h"
-#include "constr_SEQUENCE.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* Forward definitions */
-typedef struct CriticalityDiagnostics_IE_List__Member {
-	Criticality_t	 iECriticality;
-	ProtocolIE_ID_t	 iE_ID;
-	TypeOfError_t	 typeOfError;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CriticalityDiagnostics_IE_List__Member;
-
-/* CriticalityDiagnostics-IE-List */
-typedef struct CriticalityDiagnostics_IE_List {
-	A_SEQUENCE_OF(CriticalityDiagnostics_IE_List__Member) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CriticalityDiagnostics_IE_List_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_List;
-extern asn_SET_OF_specifics_t asn_SPC_CriticalityDiagnostics_IE_List_specs_1;
-extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_List_1[1];
-extern asn_per_constraints_t asn_PER_type_CriticalityDiagnostics_IE_List_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CriticalityDiagnostics_IE_List_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CriticalityDiagnostics.c b/3rdparty/libe2ap/CriticalityDiagnostics.c
deleted file mode 100644
index 13e14e9..0000000
--- a/3rdparty/libe2ap/CriticalityDiagnostics.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CriticalityDiagnostics.h"
-
-#include "CriticalityDiagnostics-IE-List.h"
-#include "ProtocolExtensionContainer.h"
-static asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_1[] = {
-	{ ATF_POINTER, 5, offsetof(struct CriticalityDiagnostics, procedureCode),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProcedureCode,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"procedureCode"
-		},
-	{ ATF_POINTER, 4, offsetof(struct CriticalityDiagnostics, triggeringMessage),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_TriggeringMessage,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"triggeringMessage"
-		},
-	{ ATF_POINTER, 3, offsetof(struct CriticalityDiagnostics, procedureCriticality),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"procedureCriticality"
-		},
-	{ ATF_POINTER, 2, offsetof(struct CriticalityDiagnostics, iEsCriticalityDiagnostics),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CriticalityDiagnostics_IE_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iEsCriticalityDiagnostics"
-		},
-	{ ATF_POINTER, 1, offsetof(struct CriticalityDiagnostics, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P33,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_CriticalityDiagnostics_oms_1[] = { 0, 1, 2, 3, 4 };
-static const ber_tlv_tag_t asn_DEF_CriticalityDiagnostics_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CriticalityDiagnostics_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* triggeringMessage */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* procedureCriticality */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* iEsCriticalityDiagnostics */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_specs_1 = {
-	sizeof(struct CriticalityDiagnostics),
-	offsetof(struct CriticalityDiagnostics, _asn_ctx),
-	asn_MAP_CriticalityDiagnostics_tag2el_1,
-	5,	/* Count of tags in the map */
-	asn_MAP_CriticalityDiagnostics_oms_1,	/* Optional members */
-	5, 0,	/* Root/Additions */
-	5,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics = {
-	"CriticalityDiagnostics",
-	"CriticalityDiagnostics",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CriticalityDiagnostics_tags_1,
-	sizeof(asn_DEF_CriticalityDiagnostics_tags_1)
-		/sizeof(asn_DEF_CriticalityDiagnostics_tags_1[0]), /* 1 */
-	asn_DEF_CriticalityDiagnostics_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CriticalityDiagnostics_tags_1)
-		/sizeof(asn_DEF_CriticalityDiagnostics_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CriticalityDiagnostics_1,
-	5,	/* Elements count */
-	&asn_SPC_CriticalityDiagnostics_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CriticalityDiagnostics.h b/3rdparty/libe2ap/CriticalityDiagnostics.h
deleted file mode 100644
index 33eb59c..0000000
--- a/3rdparty/libe2ap/CriticalityDiagnostics.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CriticalityDiagnostics_H_
-#define	_CriticalityDiagnostics_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProcedureCode.h"
-#include "TriggeringMessage.h"
-#include "Criticality.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct CriticalityDiagnostics_IE_List;
-struct ProtocolExtensionContainer;
-
-/* CriticalityDiagnostics */
-typedef struct CriticalityDiagnostics {
-	ProcedureCode_t	*procedureCode;	/* OPTIONAL */
-	TriggeringMessage_t	*triggeringMessage;	/* OPTIONAL */
-	Criticality_t	*procedureCriticality;	/* OPTIONAL */
-	struct CriticalityDiagnostics_IE_List	*iEsCriticalityDiagnostics;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CriticalityDiagnostics_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CriticalityDiagnostics_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CyclicPrefixDL.c b/3rdparty/libe2ap/CyclicPrefixDL.c
deleted file mode 100644
index 5d9f7b7..0000000
--- a/3rdparty/libe2ap/CyclicPrefixDL.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CyclicPrefixDL.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_CyclicPrefixDL_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_CyclicPrefixDL_value2enum_1[] = {
-	{ 0,	6,	"normal" },
-	{ 1,	8,	"extended" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_CyclicPrefixDL_enum2value_1[] = {
-	1,	/* extended(1) */
-	0	/* normal(0) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_CyclicPrefixDL_specs_1 = {
-	asn_MAP_CyclicPrefixDL_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_CyclicPrefixDL_enum2value_1,	/* N => "tag"; sorted by N */
-	2,	/* Number of elements in the maps */
-	3,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_CyclicPrefixDL_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_CyclicPrefixDL = {
-	"CyclicPrefixDL",
-	"CyclicPrefixDL",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_CyclicPrefixDL_tags_1,
-	sizeof(asn_DEF_CyclicPrefixDL_tags_1)
-		/sizeof(asn_DEF_CyclicPrefixDL_tags_1[0]), /* 1 */
-	asn_DEF_CyclicPrefixDL_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CyclicPrefixDL_tags_1)
-		/sizeof(asn_DEF_CyclicPrefixDL_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CyclicPrefixDL_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_CyclicPrefixDL_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CyclicPrefixDL.h b/3rdparty/libe2ap/CyclicPrefixDL.h
deleted file mode 100644
index a0dc316..0000000
--- a/3rdparty/libe2ap/CyclicPrefixDL.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CyclicPrefixDL_H_
-#define	_CyclicPrefixDL_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum CyclicPrefixDL {
-	CyclicPrefixDL_normal	= 0,
-	CyclicPrefixDL_extended	= 1
-	/*
-	 * Enumeration is extensible
-	 */
-} e_CyclicPrefixDL;
-
-/* CyclicPrefixDL */
-typedef long	 CyclicPrefixDL_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_CyclicPrefixDL_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_CyclicPrefixDL;
-extern const asn_INTEGER_specifics_t asn_SPC_CyclicPrefixDL_specs_1;
-asn_struct_free_f CyclicPrefixDL_free;
-asn_struct_print_f CyclicPrefixDL_print;
-asn_constr_check_f CyclicPrefixDL_constraint;
-ber_type_decoder_f CyclicPrefixDL_decode_ber;
-der_type_encoder_f CyclicPrefixDL_encode_der;
-xer_type_decoder_f CyclicPrefixDL_decode_xer;
-xer_type_encoder_f CyclicPrefixDL_encode_xer;
-per_type_decoder_f CyclicPrefixDL_decode_uper;
-per_type_encoder_f CyclicPrefixDL_encode_uper;
-per_type_decoder_f CyclicPrefixDL_decode_aper;
-per_type_encoder_f CyclicPrefixDL_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CyclicPrefixDL_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/CyclicPrefixUL.c b/3rdparty/libe2ap/CyclicPrefixUL.c
deleted file mode 100644
index 4ebd8e5..0000000
--- a/3rdparty/libe2ap/CyclicPrefixUL.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "CyclicPrefixUL.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_CyclicPrefixUL_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_CyclicPrefixUL_value2enum_1[] = {
-	{ 0,	6,	"normal" },
-	{ 1,	8,	"extended" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_CyclicPrefixUL_enum2value_1[] = {
-	1,	/* extended(1) */
-	0	/* normal(0) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_CyclicPrefixUL_specs_1 = {
-	asn_MAP_CyclicPrefixUL_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_CyclicPrefixUL_enum2value_1,	/* N => "tag"; sorted by N */
-	2,	/* Number of elements in the maps */
-	3,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_CyclicPrefixUL_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_CyclicPrefixUL = {
-	"CyclicPrefixUL",
-	"CyclicPrefixUL",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_CyclicPrefixUL_tags_1,
-	sizeof(asn_DEF_CyclicPrefixUL_tags_1)
-		/sizeof(asn_DEF_CyclicPrefixUL_tags_1[0]), /* 1 */
-	asn_DEF_CyclicPrefixUL_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CyclicPrefixUL_tags_1)
-		/sizeof(asn_DEF_CyclicPrefixUL_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_CyclicPrefixUL_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_CyclicPrefixUL_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/CyclicPrefixUL.h b/3rdparty/libe2ap/CyclicPrefixUL.h
deleted file mode 100644
index dd07182..0000000
--- a/3rdparty/libe2ap/CyclicPrefixUL.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_CyclicPrefixUL_H_
-#define	_CyclicPrefixUL_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum CyclicPrefixUL {
-	CyclicPrefixUL_normal	= 0,
-	CyclicPrefixUL_extended	= 1
-	/*
-	 * Enumeration is extensible
-	 */
-} e_CyclicPrefixUL;
-
-/* CyclicPrefixUL */
-typedef long	 CyclicPrefixUL_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_CyclicPrefixUL_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_CyclicPrefixUL;
-extern const asn_INTEGER_specifics_t asn_SPC_CyclicPrefixUL_specs_1;
-asn_struct_free_f CyclicPrefixUL_free;
-asn_struct_print_f CyclicPrefixUL_print;
-asn_constr_check_f CyclicPrefixUL_constraint;
-ber_type_decoder_f CyclicPrefixUL_decode_ber;
-der_type_encoder_f CyclicPrefixUL_encode_der;
-xer_type_decoder_f CyclicPrefixUL_decode_xer;
-xer_type_encoder_f CyclicPrefixUL_encode_xer;
-per_type_decoder_f CyclicPrefixUL_decode_uper;
-per_type_encoder_f CyclicPrefixUL_encode_uper;
-per_type_decoder_f CyclicPrefixUL_decode_aper;
-per_type_encoder_f CyclicPrefixUL_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _CyclicPrefixUL_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/DL-ABS-status.c b/3rdparty/libe2ap/DL-ABS-status.c
deleted file mode 100644
index 29bdf1a..0000000
--- a/3rdparty/libe2ap/DL-ABS-status.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "DL-ABS-status.h"
-
-int
-DL_ABS_status_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 100)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_DL_ABS_status_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 7,  7,  0,  100 }	/* (0..100) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_DL_ABS_status_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_DL_ABS_status = {
-	"DL-ABS-status",
-	"DL-ABS-status",
-	&asn_OP_NativeInteger,
-	asn_DEF_DL_ABS_status_tags_1,
-	sizeof(asn_DEF_DL_ABS_status_tags_1)
-		/sizeof(asn_DEF_DL_ABS_status_tags_1[0]), /* 1 */
-	asn_DEF_DL_ABS_status_tags_1,	/* Same as above */
-	sizeof(asn_DEF_DL_ABS_status_tags_1)
-		/sizeof(asn_DEF_DL_ABS_status_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_DL_ABS_status_constr_1, DL_ABS_status_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/DL-ABS-status.h b/3rdparty/libe2ap/DL-ABS-status.h
deleted file mode 100644
index 8eb4fbd..0000000
--- a/3rdparty/libe2ap/DL-ABS-status.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_DL_ABS_status_H_
-#define	_DL_ABS_status_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* DL-ABS-status */
-typedef long	 DL_ABS_status_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_DL_ABS_status_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_DL_ABS_status;
-asn_struct_free_f DL_ABS_status_free;
-asn_struct_print_f DL_ABS_status_print;
-asn_constr_check_f DL_ABS_status_constraint;
-ber_type_decoder_f DL_ABS_status_decode_ber;
-der_type_encoder_f DL_ABS_status_encode_der;
-xer_type_decoder_f DL_ABS_status_decode_xer;
-xer_type_encoder_f DL_ABS_status_encode_xer;
-per_type_decoder_f DL_ABS_status_decode_uper;
-per_type_encoder_f DL_ABS_status_encode_uper;
-per_type_decoder_f DL_ABS_status_decode_aper;
-per_type_encoder_f DL_ABS_status_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _DL_ABS_status_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/DL-GBR-PRB-usage.c b/3rdparty/libe2ap/DL-GBR-PRB-usage.c
deleted file mode 100644
index 019e643..0000000
--- a/3rdparty/libe2ap/DL-GBR-PRB-usage.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "DL-GBR-PRB-usage.h"
-
-int
-DL_GBR_PRB_usage_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 100)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_DL_GBR_PRB_usage_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 7,  7,  0,  100 }	/* (0..100) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_DL_GBR_PRB_usage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_DL_GBR_PRB_usage = {
-	"DL-GBR-PRB-usage",
-	"DL-GBR-PRB-usage",
-	&asn_OP_NativeInteger,
-	asn_DEF_DL_GBR_PRB_usage_tags_1,
-	sizeof(asn_DEF_DL_GBR_PRB_usage_tags_1)
-		/sizeof(asn_DEF_DL_GBR_PRB_usage_tags_1[0]), /* 1 */
-	asn_DEF_DL_GBR_PRB_usage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_DL_GBR_PRB_usage_tags_1)
-		/sizeof(asn_DEF_DL_GBR_PRB_usage_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_DL_GBR_PRB_usage_constr_1, DL_GBR_PRB_usage_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/DL-GBR-PRB-usage.h b/3rdparty/libe2ap/DL-GBR-PRB-usage.h
deleted file mode 100644
index cd80baf..0000000
--- a/3rdparty/libe2ap/DL-GBR-PRB-usage.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_DL_GBR_PRB_usage_H_
-#define	_DL_GBR_PRB_usage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* DL-GBR-PRB-usage */
-typedef long	 DL_GBR_PRB_usage_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_DL_GBR_PRB_usage_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_DL_GBR_PRB_usage;
-asn_struct_free_f DL_GBR_PRB_usage_free;
-asn_struct_print_f DL_GBR_PRB_usage_print;
-asn_constr_check_f DL_GBR_PRB_usage_constraint;
-ber_type_decoder_f DL_GBR_PRB_usage_decode_ber;
-der_type_encoder_f DL_GBR_PRB_usage_encode_der;
-xer_type_decoder_f DL_GBR_PRB_usage_decode_xer;
-xer_type_encoder_f DL_GBR_PRB_usage_encode_xer;
-per_type_decoder_f DL_GBR_PRB_usage_decode_uper;
-per_type_encoder_f DL_GBR_PRB_usage_encode_uper;
-per_type_decoder_f DL_GBR_PRB_usage_decode_aper;
-per_type_encoder_f DL_GBR_PRB_usage_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _DL_GBR_PRB_usage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/DL-Total-PRB-usage.c b/3rdparty/libe2ap/DL-Total-PRB-usage.c
deleted file mode 100644
index 30798f2..0000000
--- a/3rdparty/libe2ap/DL-Total-PRB-usage.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "DL-Total-PRB-usage.h"
-
-int
-DL_Total_PRB_usage_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 100)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_DL_Total_PRB_usage_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 7,  7,  0,  100 }	/* (0..100) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_DL_Total_PRB_usage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_DL_Total_PRB_usage = {
-	"DL-Total-PRB-usage",
-	"DL-Total-PRB-usage",
-	&asn_OP_NativeInteger,
-	asn_DEF_DL_Total_PRB_usage_tags_1,
-	sizeof(asn_DEF_DL_Total_PRB_usage_tags_1)
-		/sizeof(asn_DEF_DL_Total_PRB_usage_tags_1[0]), /* 1 */
-	asn_DEF_DL_Total_PRB_usage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_DL_Total_PRB_usage_tags_1)
-		/sizeof(asn_DEF_DL_Total_PRB_usage_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_DL_Total_PRB_usage_constr_1, DL_Total_PRB_usage_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/DL-Total-PRB-usage.h b/3rdparty/libe2ap/DL-Total-PRB-usage.h
deleted file mode 100644
index 79c6dfc..0000000
--- a/3rdparty/libe2ap/DL-Total-PRB-usage.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_DL_Total_PRB_usage_H_
-#define	_DL_Total_PRB_usage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* DL-Total-PRB-usage */
-typedef long	 DL_Total_PRB_usage_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_DL_Total_PRB_usage_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_DL_Total_PRB_usage;
-asn_struct_free_f DL_Total_PRB_usage_free;
-asn_struct_print_f DL_Total_PRB_usage_print;
-asn_constr_check_f DL_Total_PRB_usage_constraint;
-ber_type_decoder_f DL_Total_PRB_usage_decode_ber;
-der_type_encoder_f DL_Total_PRB_usage_encode_der;
-xer_type_decoder_f DL_Total_PRB_usage_decode_xer;
-xer_type_encoder_f DL_Total_PRB_usage_encode_xer;
-per_type_decoder_f DL_Total_PRB_usage_decode_uper;
-per_type_encoder_f DL_Total_PRB_usage_encode_uper;
-per_type_decoder_f DL_Total_PRB_usage_decode_aper;
-per_type_encoder_f DL_Total_PRB_usage_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _DL_Total_PRB_usage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/DL-non-GBR-PRB-usage.c b/3rdparty/libe2ap/DL-non-GBR-PRB-usage.c
deleted file mode 100644
index 8595d76..0000000
--- a/3rdparty/libe2ap/DL-non-GBR-PRB-usage.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "DL-non-GBR-PRB-usage.h"
-
-int
-DL_non_GBR_PRB_usage_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 100)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_DL_non_GBR_PRB_usage_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 7,  7,  0,  100 }	/* (0..100) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_DL_non_GBR_PRB_usage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_DL_non_GBR_PRB_usage = {
-	"DL-non-GBR-PRB-usage",
-	"DL-non-GBR-PRB-usage",
-	&asn_OP_NativeInteger,
-	asn_DEF_DL_non_GBR_PRB_usage_tags_1,
-	sizeof(asn_DEF_DL_non_GBR_PRB_usage_tags_1)
-		/sizeof(asn_DEF_DL_non_GBR_PRB_usage_tags_1[0]), /* 1 */
-	asn_DEF_DL_non_GBR_PRB_usage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_DL_non_GBR_PRB_usage_tags_1)
-		/sizeof(asn_DEF_DL_non_GBR_PRB_usage_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_DL_non_GBR_PRB_usage_constr_1, DL_non_GBR_PRB_usage_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/DL-non-GBR-PRB-usage.h b/3rdparty/libe2ap/DL-non-GBR-PRB-usage.h
deleted file mode 100644
index d3e3c63..0000000
--- a/3rdparty/libe2ap/DL-non-GBR-PRB-usage.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_DL_non_GBR_PRB_usage_H_
-#define	_DL_non_GBR_PRB_usage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* DL-non-GBR-PRB-usage */
-typedef long	 DL_non_GBR_PRB_usage_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_DL_non_GBR_PRB_usage_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_DL_non_GBR_PRB_usage;
-asn_struct_free_f DL_non_GBR_PRB_usage_free;
-asn_struct_print_f DL_non_GBR_PRB_usage_print;
-asn_constr_check_f DL_non_GBR_PRB_usage_constraint;
-ber_type_decoder_f DL_non_GBR_PRB_usage_decode_ber;
-der_type_encoder_f DL_non_GBR_PRB_usage_encode_der;
-xer_type_decoder_f DL_non_GBR_PRB_usage_decode_xer;
-xer_type_encoder_f DL_non_GBR_PRB_usage_encode_xer;
-per_type_decoder_f DL_non_GBR_PRB_usage_decode_uper;
-per_type_encoder_f DL_non_GBR_PRB_usage_encode_uper;
-per_type_decoder_f DL_non_GBR_PRB_usage_decode_aper;
-per_type_encoder_f DL_non_GBR_PRB_usage_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _DL_non_GBR_PRB_usage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/DL-scheduling-PDCCH-CCE-usage.c b/3rdparty/libe2ap/DL-scheduling-PDCCH-CCE-usage.c
deleted file mode 100644
index 23a605d..0000000
--- a/3rdparty/libe2ap/DL-scheduling-PDCCH-CCE-usage.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "DL-scheduling-PDCCH-CCE-usage.h"
-
-int
-DL_scheduling_PDCCH_CCE_usage_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 100)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_DL_scheduling_PDCCH_CCE_usage_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 7,  7,  0,  100 }	/* (0..100) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_DL_scheduling_PDCCH_CCE_usage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_DL_scheduling_PDCCH_CCE_usage = {
-	"DL-scheduling-PDCCH-CCE-usage",
-	"DL-scheduling-PDCCH-CCE-usage",
-	&asn_OP_NativeInteger,
-	asn_DEF_DL_scheduling_PDCCH_CCE_usage_tags_1,
-	sizeof(asn_DEF_DL_scheduling_PDCCH_CCE_usage_tags_1)
-		/sizeof(asn_DEF_DL_scheduling_PDCCH_CCE_usage_tags_1[0]), /* 1 */
-	asn_DEF_DL_scheduling_PDCCH_CCE_usage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_DL_scheduling_PDCCH_CCE_usage_tags_1)
-		/sizeof(asn_DEF_DL_scheduling_PDCCH_CCE_usage_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_DL_scheduling_PDCCH_CCE_usage_constr_1, DL_scheduling_PDCCH_CCE_usage_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/DL-scheduling-PDCCH-CCE-usage.h b/3rdparty/libe2ap/DL-scheduling-PDCCH-CCE-usage.h
deleted file mode 100644
index 49003d7..0000000
--- a/3rdparty/libe2ap/DL-scheduling-PDCCH-CCE-usage.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_DL_scheduling_PDCCH_CCE_usage_H_
-#define	_DL_scheduling_PDCCH_CCE_usage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* DL-scheduling-PDCCH-CCE-usage */
-typedef long	 DL_scheduling_PDCCH_CCE_usage_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_DL_scheduling_PDCCH_CCE_usage;
-asn_struct_free_f DL_scheduling_PDCCH_CCE_usage_free;
-asn_struct_print_f DL_scheduling_PDCCH_CCE_usage_print;
-asn_constr_check_f DL_scheduling_PDCCH_CCE_usage_constraint;
-ber_type_decoder_f DL_scheduling_PDCCH_CCE_usage_decode_ber;
-der_type_encoder_f DL_scheduling_PDCCH_CCE_usage_encode_der;
-xer_type_decoder_f DL_scheduling_PDCCH_CCE_usage_decode_xer;
-xer_type_encoder_f DL_scheduling_PDCCH_CCE_usage_encode_xer;
-per_type_decoder_f DL_scheduling_PDCCH_CCE_usage_decode_uper;
-per_type_encoder_f DL_scheduling_PDCCH_CCE_usage_encode_uper;
-per_type_decoder_f DL_scheduling_PDCCH_CCE_usage_decode_aper;
-per_type_encoder_f DL_scheduling_PDCCH_CCE_usage_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _DL_scheduling_PDCCH_CCE_usage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/DeactivationIndication.c b/3rdparty/libe2ap/DeactivationIndication.c
deleted file mode 100644
index 645531d..0000000
--- a/3rdparty/libe2ap/DeactivationIndication.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "DeactivationIndication.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_DeactivationIndication_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_DeactivationIndication_value2enum_1[] = {
-	{ 0,	11,	"deactivated" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_DeactivationIndication_enum2value_1[] = {
-	0	/* deactivated(0) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_DeactivationIndication_specs_1 = {
-	asn_MAP_DeactivationIndication_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_DeactivationIndication_enum2value_1,	/* N => "tag"; sorted by N */
-	1,	/* Number of elements in the maps */
-	2,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_DeactivationIndication_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_DeactivationIndication = {
-	"DeactivationIndication",
-	"DeactivationIndication",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_DeactivationIndication_tags_1,
-	sizeof(asn_DEF_DeactivationIndication_tags_1)
-		/sizeof(asn_DEF_DeactivationIndication_tags_1[0]), /* 1 */
-	asn_DEF_DeactivationIndication_tags_1,	/* Same as above */
-	sizeof(asn_DEF_DeactivationIndication_tags_1)
-		/sizeof(asn_DEF_DeactivationIndication_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_DeactivationIndication_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_DeactivationIndication_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/DeactivationIndication.h b/3rdparty/libe2ap/DeactivationIndication.h
deleted file mode 100644
index a533fab..0000000
--- a/3rdparty/libe2ap/DeactivationIndication.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_DeactivationIndication_H_
-#define	_DeactivationIndication_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum DeactivationIndication {
-	DeactivationIndication_deactivated	= 0
-	/*
-	 * Enumeration is extensible
-	 */
-} e_DeactivationIndication;
-
-/* DeactivationIndication */
-typedef long	 DeactivationIndication_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_DeactivationIndication_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_DeactivationIndication;
-extern const asn_INTEGER_specifics_t asn_SPC_DeactivationIndication_specs_1;
-asn_struct_free_f DeactivationIndication_free;
-asn_struct_print_f DeactivationIndication_print;
-asn_constr_check_f DeactivationIndication_constraint;
-ber_type_decoder_f DeactivationIndication_decode_ber;
-der_type_encoder_f DeactivationIndication_encode_der;
-xer_type_decoder_f DeactivationIndication_decode_xer;
-xer_type_encoder_f DeactivationIndication_encode_xer;
-per_type_decoder_f DeactivationIndication_decode_uper;
-per_type_encoder_f DeactivationIndication_encode_uper;
-per_type_decoder_f DeactivationIndication_decode_aper;
-per_type_encoder_f DeactivationIndication_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _DeactivationIndication_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/DynamicDLTransmissionInformation.c b/3rdparty/libe2ap/DynamicDLTransmissionInformation.c
deleted file mode 100644
index 65ea58d..0000000
--- a/3rdparty/libe2ap/DynamicDLTransmissionInformation.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "DynamicDLTransmissionInformation.h"
-
-static asn_per_constraints_t asn_PER_type_DynamicDLTransmissionInformation_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_DynamicDLTransmissionInformation_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct DynamicDLTransmissionInformation, choice.naics_active),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_DynamicNAICSInformation,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"naics-active"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct DynamicDLTransmissionInformation, choice.naics_inactive),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NULL,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"naics-inactive"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_DynamicDLTransmissionInformation_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* naics-active */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* naics-inactive */
-};
-static asn_CHOICE_specifics_t asn_SPC_DynamicDLTransmissionInformation_specs_1 = {
-	sizeof(struct DynamicDLTransmissionInformation),
-	offsetof(struct DynamicDLTransmissionInformation, _asn_ctx),
-	offsetof(struct DynamicDLTransmissionInformation, present),
-	sizeof(((struct DynamicDLTransmissionInformation *)0)->present),
-	asn_MAP_DynamicDLTransmissionInformation_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0,
-	2	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_DynamicDLTransmissionInformation = {
-	"DynamicDLTransmissionInformation",
-	"DynamicDLTransmissionInformation",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_DynamicDLTransmissionInformation_constr_1, CHOICE_constraint },
-	asn_MBR_DynamicDLTransmissionInformation_1,
-	2,	/* Elements count */
-	&asn_SPC_DynamicDLTransmissionInformation_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/DynamicDLTransmissionInformation.h b/3rdparty/libe2ap/DynamicDLTransmissionInformation.h
deleted file mode 100644
index de1b931..0000000
--- a/3rdparty/libe2ap/DynamicDLTransmissionInformation.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_DynamicDLTransmissionInformation_H_
-#define	_DynamicDLTransmissionInformation_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "DynamicNAICSInformation.h"
-#include "NULL.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum DynamicDLTransmissionInformation_PR {
-	DynamicDLTransmissionInformation_PR_NOTHING,	/* No components present */
-	DynamicDLTransmissionInformation_PR_naics_active,
-	DynamicDLTransmissionInformation_PR_naics_inactive
-	/* Extensions may appear below */
-	
-} DynamicDLTransmissionInformation_PR;
-
-/* DynamicDLTransmissionInformation */
-typedef struct DynamicDLTransmissionInformation {
-	DynamicDLTransmissionInformation_PR present;
-	union DynamicDLTransmissionInformation_u {
-		DynamicNAICSInformation_t	 naics_active;
-		NULL_t	 naics_inactive;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} DynamicDLTransmissionInformation_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_DynamicDLTransmissionInformation;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _DynamicDLTransmissionInformation_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/DynamicNAICSInformation.c b/3rdparty/libe2ap/DynamicNAICSInformation.c
deleted file mode 100644
index 8097963..0000000
--- a/3rdparty/libe2ap/DynamicNAICSInformation.c
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "DynamicNAICSInformation.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_transmissionModes_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 8)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_pB_information_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 3)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_pA_list_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	/* Determine the number of elements */
-	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
-	
-	if((size <= 3)) {
-		/* Perform validation of the inner elements */
-		return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_type_pA_list_constr_4 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 2,  2,  0,  3 }	/* (SIZE(0..3)) */,
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_transmissionModes_constr_2 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  8,  8 }	/* (SIZE(8..8)) */,
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_pB_information_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  3 }	/* (0..3) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_pA_list_constr_4 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 2,  2,  0,  3 }	/* (SIZE(0..3)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_pA_list_4[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_PA_Values,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_pA_list_tags_4[] = {
-	(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_pA_list_specs_4 = {
-	sizeof(struct DynamicNAICSInformation__pA_list),
-	offsetof(struct DynamicNAICSInformation__pA_list, _asn_ctx),
-	1,	/* XER encoding is XMLValueList */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_pA_list_4 = {
-	"pA-list",
-	"pA-list",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_pA_list_tags_4,
-	sizeof(asn_DEF_pA_list_tags_4)
-		/sizeof(asn_DEF_pA_list_tags_4[0]) - 1, /* 1 */
-	asn_DEF_pA_list_tags_4,	/* Same as above */
-	sizeof(asn_DEF_pA_list_tags_4)
-		/sizeof(asn_DEF_pA_list_tags_4[0]), /* 2 */
-	{ 0, &asn_PER_type_pA_list_constr_4, SEQUENCE_OF_constraint },
-	asn_MBR_pA_list_4,
-	1,	/* Single element */
-	&asn_SPC_pA_list_specs_4	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_DynamicNAICSInformation_1[] = {
-	{ ATF_POINTER, 2, offsetof(struct DynamicNAICSInformation, transmissionModes),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_transmissionModes_constr_2,  memb_transmissionModes_constraint_1 },
-		0, 0, /* No default value */
-		"transmissionModes"
-		},
-	{ ATF_POINTER, 1, offsetof(struct DynamicNAICSInformation, pB_information),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_pB_information_constr_3,  memb_pB_information_constraint_1 },
-		0, 0, /* No default value */
-		"pB-information"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct DynamicNAICSInformation, pA_list),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		0,
-		&asn_DEF_pA_list_4,
-		0,
-		{ 0, &asn_PER_memb_pA_list_constr_4,  memb_pA_list_constraint_1 },
-		0, 0, /* No default value */
-		"pA-list"
-		},
-	{ ATF_POINTER, 1, offsetof(struct DynamicNAICSInformation, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P38,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_DynamicNAICSInformation_oms_1[] = { 0, 1, 3 };
-static const ber_tlv_tag_t asn_DEF_DynamicNAICSInformation_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_DynamicNAICSInformation_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* transmissionModes */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* pB-information */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* pA-list */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_DynamicNAICSInformation_specs_1 = {
-	sizeof(struct DynamicNAICSInformation),
-	offsetof(struct DynamicNAICSInformation, _asn_ctx),
-	asn_MAP_DynamicNAICSInformation_tag2el_1,
-	4,	/* Count of tags in the map */
-	asn_MAP_DynamicNAICSInformation_oms_1,	/* Optional members */
-	3, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_DynamicNAICSInformation = {
-	"DynamicNAICSInformation",
-	"DynamicNAICSInformation",
-	&asn_OP_SEQUENCE,
-	asn_DEF_DynamicNAICSInformation_tags_1,
-	sizeof(asn_DEF_DynamicNAICSInformation_tags_1)
-		/sizeof(asn_DEF_DynamicNAICSInformation_tags_1[0]), /* 1 */
-	asn_DEF_DynamicNAICSInformation_tags_1,	/* Same as above */
-	sizeof(asn_DEF_DynamicNAICSInformation_tags_1)
-		/sizeof(asn_DEF_DynamicNAICSInformation_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_DynamicNAICSInformation_1,
-	4,	/* Elements count */
-	&asn_SPC_DynamicNAICSInformation_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/DynamicNAICSInformation.h b/3rdparty/libe2ap/DynamicNAICSInformation.h
deleted file mode 100644
index 91561cc..0000000
--- a/3rdparty/libe2ap/DynamicNAICSInformation.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_DynamicNAICSInformation_H_
-#define	_DynamicNAICSInformation_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-#include "NativeInteger.h"
-#include "PA-Values.h"
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* DynamicNAICSInformation */
-typedef struct DynamicNAICSInformation {
-	BIT_STRING_t	*transmissionModes;	/* OPTIONAL */
-	long	*pB_information;	/* OPTIONAL */
-	struct DynamicNAICSInformation__pA_list {
-		A_SEQUENCE_OF(PA_Values_t) list;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} pA_list;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} DynamicNAICSInformation_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_DynamicNAICSInformation;
-extern asn_SEQUENCE_specifics_t asn_SPC_DynamicNAICSInformation_specs_1;
-extern asn_TYPE_member_t asn_MBR_DynamicNAICSInformation_1[4];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _DynamicNAICSInformation_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/E2AP-PDU.c b/3rdparty/libe2ap/E2AP-PDU.c
deleted file mode 100644
index e89808b..0000000
--- a/3rdparty/libe2ap/E2AP-PDU.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Descriptions"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "E2AP-PDU.h"
-
-static asn_per_constraints_t asn_PER_type_E2AP_PDU_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_E2AP_PDU_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct E2AP_PDU, choice.initiatingMessage),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RICInitiatingMessage,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"initiatingMessage"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct E2AP_PDU, choice.successfulOutcome),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RICSuccessfulOutcome,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"successfulOutcome"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct E2AP_PDU, choice.unsuccessfulOutcome),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RICUnsuccessfulOutcome,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"unsuccessfulOutcome"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_E2AP_PDU_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* initiatingMessage */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* successfulOutcome */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* unsuccessfulOutcome */
-};
-static asn_CHOICE_specifics_t asn_SPC_E2AP_PDU_specs_1 = {
-	sizeof(struct E2AP_PDU),
-	offsetof(struct E2AP_PDU, _asn_ctx),
-	offsetof(struct E2AP_PDU, present),
-	sizeof(((struct E2AP_PDU *)0)->present),
-	asn_MAP_E2AP_PDU_tag2el_1,
-	3,	/* Count of tags in the map */
-	0, 0,
-	3	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_E2AP_PDU = {
-	"E2AP-PDU",
-	"E2AP-PDU",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_E2AP_PDU_constr_1, CHOICE_constraint },
-	asn_MBR_E2AP_PDU_1,
-	3,	/* Elements count */
-	&asn_SPC_E2AP_PDU_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/E2AP-PDU.h b/3rdparty/libe2ap/E2AP-PDU.h
deleted file mode 100644
index 7592b16..0000000
--- a/3rdparty/libe2ap/E2AP-PDU.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Descriptions"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_E2AP_PDU_H_
-#define	_E2AP_PDU_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "RICInitiatingMessage.h"
-#include "RICSuccessfulOutcome.h"
-#include "RICUnsuccessfulOutcome.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum E2AP_PDU_PR {
-	E2AP_PDU_PR_NOTHING,	/* No components present */
-	E2AP_PDU_PR_initiatingMessage,
-	E2AP_PDU_PR_successfulOutcome,
-	E2AP_PDU_PR_unsuccessfulOutcome
-	/* Extensions may appear below */
-	
-} E2AP_PDU_PR;
-
-/* E2AP-PDU */
-typedef struct E2AP_PDU {
-	E2AP_PDU_PR present;
-	union E2AP_PDU_u {
-		RICInitiatingMessage_t	 initiatingMessage;
-		RICSuccessfulOutcome_t	 successfulOutcome;
-		RICUnsuccessfulOutcome_t	 unsuccessfulOutcome;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} E2AP_PDU_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_E2AP_PDU;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _E2AP_PDU_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/E2SM-gNB-X2-actionDefinition.c b/3rdparty/libe2ap/E2SM-gNB-X2-actionDefinition.c
deleted file mode 100644
index cd2d3ee..0000000
--- a/3rdparty/libe2ap/E2SM-gNB-X2-actionDefinition.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "E2SM-gNB-X2-actionDefinition.h"
-
-#include "ActionParameter-Item.h"
-static int
-memb_actionParameter_List_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	/* Determine the number of elements */
-	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
-	
-	if((size >= 1 && size <= 255)) {
-		/* Perform validation of the inner elements */
-		return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_type_actionParameter_List_constr_3 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  255 }	/* (SIZE(1..255)) */,
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_actionParameter_List_constr_3 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  255 }	/* (SIZE(1..255)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_actionParameter_List_3[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ActionParameter_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_actionParameter_List_tags_3[] = {
-	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_actionParameter_List_specs_3 = {
-	sizeof(struct E2SM_gNB_X2_actionDefinition__actionParameter_List),
-	offsetof(struct E2SM_gNB_X2_actionDefinition__actionParameter_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_actionParameter_List_3 = {
-	"actionParameter-List",
-	"actionParameter-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_actionParameter_List_tags_3,
-	sizeof(asn_DEF_actionParameter_List_tags_3)
-		/sizeof(asn_DEF_actionParameter_List_tags_3[0]) - 1, /* 1 */
-	asn_DEF_actionParameter_List_tags_3,	/* Same as above */
-	sizeof(asn_DEF_actionParameter_List_tags_3)
-		/sizeof(asn_DEF_actionParameter_List_tags_3[0]), /* 2 */
-	{ 0, &asn_PER_type_actionParameter_List_constr_3, SEQUENCE_OF_constraint },
-	asn_MBR_actionParameter_List_3,
-	1,	/* Single element */
-	&asn_SPC_actionParameter_List_specs_3	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_E2SM_gNB_X2_actionDefinition_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct E2SM_gNB_X2_actionDefinition, style_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Style_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"style-ID"
-		},
-	{ ATF_POINTER, 1, offsetof(struct E2SM_gNB_X2_actionDefinition, actionParameter_List),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		0,
-		&asn_DEF_actionParameter_List_3,
-		0,
-		{ 0, &asn_PER_memb_actionParameter_List_constr_3,  memb_actionParameter_List_constraint_1 },
-		0, 0, /* No default value */
-		"actionParameter-List"
-		},
-};
-static const int asn_MAP_E2SM_gNB_X2_actionDefinition_oms_1[] = { 1 };
-static const ber_tlv_tag_t asn_DEF_E2SM_gNB_X2_actionDefinition_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_E2SM_gNB_X2_actionDefinition_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* style-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* actionParameter-List */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_E2SM_gNB_X2_actionDefinition_specs_1 = {
-	sizeof(struct E2SM_gNB_X2_actionDefinition),
-	offsetof(struct E2SM_gNB_X2_actionDefinition, _asn_ctx),
-	asn_MAP_E2SM_gNB_X2_actionDefinition_tag2el_1,
-	2,	/* Count of tags in the map */
-	asn_MAP_E2SM_gNB_X2_actionDefinition_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_E2SM_gNB_X2_actionDefinition = {
-	"E2SM-gNB-X2-actionDefinition",
-	"E2SM-gNB-X2-actionDefinition",
-	&asn_OP_SEQUENCE,
-	asn_DEF_E2SM_gNB_X2_actionDefinition_tags_1,
-	sizeof(asn_DEF_E2SM_gNB_X2_actionDefinition_tags_1)
-		/sizeof(asn_DEF_E2SM_gNB_X2_actionDefinition_tags_1[0]), /* 1 */
-	asn_DEF_E2SM_gNB_X2_actionDefinition_tags_1,	/* Same as above */
-	sizeof(asn_DEF_E2SM_gNB_X2_actionDefinition_tags_1)
-		/sizeof(asn_DEF_E2SM_gNB_X2_actionDefinition_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_E2SM_gNB_X2_actionDefinition_1,
-	2,	/* Elements count */
-	&asn_SPC_E2SM_gNB_X2_actionDefinition_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/E2SM-gNB-X2-actionDefinition.h b/3rdparty/libe2ap/E2SM-gNB-X2-actionDefinition.h
deleted file mode 100644
index ecef709..0000000
--- a/3rdparty/libe2ap/E2SM-gNB-X2-actionDefinition.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_E2SM_gNB_X2_actionDefinition_H_
-#define	_E2SM_gNB_X2_actionDefinition_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "Style-ID.h"
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ActionParameter_Item;
-
-/* E2SM-gNB-X2-actionDefinition */
-typedef struct E2SM_gNB_X2_actionDefinition {
-	Style_ID_t	 style_ID;
-	struct E2SM_gNB_X2_actionDefinition__actionParameter_List {
-		A_SEQUENCE_OF(struct ActionParameter_Item) list;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} *actionParameter_List;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} E2SM_gNB_X2_actionDefinition_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_E2SM_gNB_X2_actionDefinition;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _E2SM_gNB_X2_actionDefinition_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/E2SM-gNB-X2-callProcessID.c b/3rdparty/libe2ap/E2SM-gNB-X2-callProcessID.c
deleted file mode 100644
index eb8e041..0000000
--- a/3rdparty/libe2ap/E2SM-gNB-X2-callProcessID.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "E2SM-gNB-X2-callProcessID.h"
-
-static asn_TYPE_member_t asn_MBR_E2SM_gNB_X2_callProcessID_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct E2SM_gNB_X2_callProcessID, callProcess_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CallProcess_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"callProcess-ID"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_E2SM_gNB_X2_callProcessID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_E2SM_gNB_X2_callProcessID_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* callProcess-ID */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_E2SM_gNB_X2_callProcessID_specs_1 = {
-	sizeof(struct E2SM_gNB_X2_callProcessID),
-	offsetof(struct E2SM_gNB_X2_callProcessID, _asn_ctx),
-	asn_MAP_E2SM_gNB_X2_callProcessID_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_E2SM_gNB_X2_callProcessID = {
-	"E2SM-gNB-X2-callProcessID",
-	"E2SM-gNB-X2-callProcessID",
-	&asn_OP_SEQUENCE,
-	asn_DEF_E2SM_gNB_X2_callProcessID_tags_1,
-	sizeof(asn_DEF_E2SM_gNB_X2_callProcessID_tags_1)
-		/sizeof(asn_DEF_E2SM_gNB_X2_callProcessID_tags_1[0]), /* 1 */
-	asn_DEF_E2SM_gNB_X2_callProcessID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_E2SM_gNB_X2_callProcessID_tags_1)
-		/sizeof(asn_DEF_E2SM_gNB_X2_callProcessID_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_E2SM_gNB_X2_callProcessID_1,
-	1,	/* Elements count */
-	&asn_SPC_E2SM_gNB_X2_callProcessID_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/E2SM-gNB-X2-callProcessID.h b/3rdparty/libe2ap/E2SM-gNB-X2-callProcessID.h
deleted file mode 100644
index 2cf88dd..0000000
--- a/3rdparty/libe2ap/E2SM-gNB-X2-callProcessID.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_E2SM_gNB_X2_callProcessID_H_
-#define	_E2SM_gNB_X2_callProcessID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "CallProcess-ID.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* E2SM-gNB-X2-callProcessID */
-typedef struct E2SM_gNB_X2_callProcessID {
-	CallProcess_ID_t	 callProcess_ID;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} E2SM_gNB_X2_callProcessID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_E2SM_gNB_X2_callProcessID;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _E2SM_gNB_X2_callProcessID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/E2SM-gNB-X2-controlHeader.c b/3rdparty/libe2ap/E2SM-gNB-X2-controlHeader.c
deleted file mode 100644
index df73bee..0000000
--- a/3rdparty/libe2ap/E2SM-gNB-X2-controlHeader.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "E2SM-gNB-X2-controlHeader.h"
-
-static asn_TYPE_member_t asn_MBR_E2SM_gNB_X2_controlHeader_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct E2SM_gNB_X2_controlHeader, interface_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_Interface_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"interface-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct E2SM_gNB_X2_controlHeader, interfaceDirection),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_InterfaceDirection,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"interfaceDirection"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_E2SM_gNB_X2_controlHeader_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_E2SM_gNB_X2_controlHeader_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* interface-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* interfaceDirection */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_E2SM_gNB_X2_controlHeader_specs_1 = {
-	sizeof(struct E2SM_gNB_X2_controlHeader),
-	offsetof(struct E2SM_gNB_X2_controlHeader, _asn_ctx),
-	asn_MAP_E2SM_gNB_X2_controlHeader_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_E2SM_gNB_X2_controlHeader = {
-	"E2SM-gNB-X2-controlHeader",
-	"E2SM-gNB-X2-controlHeader",
-	&asn_OP_SEQUENCE,
-	asn_DEF_E2SM_gNB_X2_controlHeader_tags_1,
-	sizeof(asn_DEF_E2SM_gNB_X2_controlHeader_tags_1)
-		/sizeof(asn_DEF_E2SM_gNB_X2_controlHeader_tags_1[0]), /* 1 */
-	asn_DEF_E2SM_gNB_X2_controlHeader_tags_1,	/* Same as above */
-	sizeof(asn_DEF_E2SM_gNB_X2_controlHeader_tags_1)
-		/sizeof(asn_DEF_E2SM_gNB_X2_controlHeader_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_E2SM_gNB_X2_controlHeader_1,
-	2,	/* Elements count */
-	&asn_SPC_E2SM_gNB_X2_controlHeader_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/E2SM-gNB-X2-controlHeader.h b/3rdparty/libe2ap/E2SM-gNB-X2-controlHeader.h
deleted file mode 100644
index cc36f35..0000000
--- a/3rdparty/libe2ap/E2SM-gNB-X2-controlHeader.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_E2SM_gNB_X2_controlHeader_H_
-#define	_E2SM_gNB_X2_controlHeader_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "Interface-ID.h"
-#include "InterfaceDirection.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* E2SM-gNB-X2-controlHeader */
-typedef struct E2SM_gNB_X2_controlHeader {
-	Interface_ID_t	 interface_ID;
-	InterfaceDirection_t	 interfaceDirection;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} E2SM_gNB_X2_controlHeader_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_E2SM_gNB_X2_controlHeader;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _E2SM_gNB_X2_controlHeader_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/E2SM-gNB-X2-controlMessage.c b/3rdparty/libe2ap/E2SM-gNB-X2-controlMessage.c
deleted file mode 100644
index e1fc97e..0000000
--- a/3rdparty/libe2ap/E2SM-gNB-X2-controlMessage.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "E2SM-gNB-X2-controlMessage.h"
-
-static asn_TYPE_member_t asn_MBR_E2SM_gNB_X2_controlMessage_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct E2SM_gNB_X2_controlMessage, interfaceMessage),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_InterfaceMessage,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"interfaceMessage"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_E2SM_gNB_X2_controlMessage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_E2SM_gNB_X2_controlMessage_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* interfaceMessage */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_E2SM_gNB_X2_controlMessage_specs_1 = {
-	sizeof(struct E2SM_gNB_X2_controlMessage),
-	offsetof(struct E2SM_gNB_X2_controlMessage, _asn_ctx),
-	asn_MAP_E2SM_gNB_X2_controlMessage_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_E2SM_gNB_X2_controlMessage = {
-	"E2SM-gNB-X2-controlMessage",
-	"E2SM-gNB-X2-controlMessage",
-	&asn_OP_SEQUENCE,
-	asn_DEF_E2SM_gNB_X2_controlMessage_tags_1,
-	sizeof(asn_DEF_E2SM_gNB_X2_controlMessage_tags_1)
-		/sizeof(asn_DEF_E2SM_gNB_X2_controlMessage_tags_1[0]), /* 1 */
-	asn_DEF_E2SM_gNB_X2_controlMessage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_E2SM_gNB_X2_controlMessage_tags_1)
-		/sizeof(asn_DEF_E2SM_gNB_X2_controlMessage_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_E2SM_gNB_X2_controlMessage_1,
-	1,	/* Elements count */
-	&asn_SPC_E2SM_gNB_X2_controlMessage_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/E2SM-gNB-X2-controlMessage.h b/3rdparty/libe2ap/E2SM-gNB-X2-controlMessage.h
deleted file mode 100644
index 6dce9e2..0000000
--- a/3rdparty/libe2ap/E2SM-gNB-X2-controlMessage.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_E2SM_gNB_X2_controlMessage_H_
-#define	_E2SM_gNB_X2_controlMessage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "InterfaceMessage.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* E2SM-gNB-X2-controlMessage */
-typedef struct E2SM_gNB_X2_controlMessage {
-	InterfaceMessage_t	 interfaceMessage;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} E2SM_gNB_X2_controlMessage_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_E2SM_gNB_X2_controlMessage;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _E2SM_gNB_X2_controlMessage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/E2SM-gNB-X2-eventTriggerDefinition.c b/3rdparty/libe2ap/E2SM-gNB-X2-eventTriggerDefinition.c
deleted file mode 100644
index 2a0ea72..0000000
--- a/3rdparty/libe2ap/E2SM-gNB-X2-eventTriggerDefinition.c
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "E2SM-gNB-X2-eventTriggerDefinition.h"
-
-#include "InterfaceProtocolIE-Item.h"
-static int
-memb_interfaceProtocolIE_List_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	/* Determine the number of elements */
-	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
-	
-	if((size >= 1 && size <= 15)) {
-		/* Perform validation of the inner elements */
-		return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_type_interfaceProtocolIE_List_constr_5 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 4,  4,  1,  15 }	/* (SIZE(1..15)) */,
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_interfaceProtocolIE_List_constr_5 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 4,  4,  1,  15 }	/* (SIZE(1..15)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_interfaceProtocolIE_List_5[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_InterfaceProtocolIE_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_interfaceProtocolIE_List_tags_5[] = {
-	(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_interfaceProtocolIE_List_specs_5 = {
-	sizeof(struct E2SM_gNB_X2_eventTriggerDefinition__interfaceProtocolIE_List),
-	offsetof(struct E2SM_gNB_X2_eventTriggerDefinition__interfaceProtocolIE_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_interfaceProtocolIE_List_5 = {
-	"interfaceProtocolIE-List",
-	"interfaceProtocolIE-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_interfaceProtocolIE_List_tags_5,
-	sizeof(asn_DEF_interfaceProtocolIE_List_tags_5)
-		/sizeof(asn_DEF_interfaceProtocolIE_List_tags_5[0]) - 1, /* 1 */
-	asn_DEF_interfaceProtocolIE_List_tags_5,	/* Same as above */
-	sizeof(asn_DEF_interfaceProtocolIE_List_tags_5)
-		/sizeof(asn_DEF_interfaceProtocolIE_List_tags_5[0]), /* 2 */
-	{ 0, &asn_PER_type_interfaceProtocolIE_List_constr_5, SEQUENCE_OF_constraint },
-	asn_MBR_interfaceProtocolIE_List_5,
-	1,	/* Single element */
-	&asn_SPC_interfaceProtocolIE_List_specs_5	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_E2SM_gNB_X2_eventTriggerDefinition_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct E2SM_gNB_X2_eventTriggerDefinition, interface_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_Interface_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"interface-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct E2SM_gNB_X2_eventTriggerDefinition, interfaceDirection),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_InterfaceDirection,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"interfaceDirection"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct E2SM_gNB_X2_eventTriggerDefinition, interfaceMessageType),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_InterfaceMessageType,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"interfaceMessageType"
-		},
-	{ ATF_POINTER, 1, offsetof(struct E2SM_gNB_X2_eventTriggerDefinition, interfaceProtocolIE_List),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		0,
-		&asn_DEF_interfaceProtocolIE_List_5,
-		0,
-		{ 0, &asn_PER_memb_interfaceProtocolIE_List_constr_5,  memb_interfaceProtocolIE_List_constraint_1 },
-		0, 0, /* No default value */
-		"interfaceProtocolIE-List"
-		},
-};
-static const int asn_MAP_E2SM_gNB_X2_eventTriggerDefinition_oms_1[] = { 3 };
-static const ber_tlv_tag_t asn_DEF_E2SM_gNB_X2_eventTriggerDefinition_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_E2SM_gNB_X2_eventTriggerDefinition_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* interface-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* interfaceDirection */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* interfaceMessageType */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* interfaceProtocolIE-List */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_E2SM_gNB_X2_eventTriggerDefinition_specs_1 = {
-	sizeof(struct E2SM_gNB_X2_eventTriggerDefinition),
-	offsetof(struct E2SM_gNB_X2_eventTriggerDefinition, _asn_ctx),
-	asn_MAP_E2SM_gNB_X2_eventTriggerDefinition_tag2el_1,
-	4,	/* Count of tags in the map */
-	asn_MAP_E2SM_gNB_X2_eventTriggerDefinition_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_E2SM_gNB_X2_eventTriggerDefinition = {
-	"E2SM-gNB-X2-eventTriggerDefinition",
-	"E2SM-gNB-X2-eventTriggerDefinition",
-	&asn_OP_SEQUENCE,
-	asn_DEF_E2SM_gNB_X2_eventTriggerDefinition_tags_1,
-	sizeof(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition_tags_1)
-		/sizeof(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition_tags_1[0]), /* 1 */
-	asn_DEF_E2SM_gNB_X2_eventTriggerDefinition_tags_1,	/* Same as above */
-	sizeof(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition_tags_1)
-		/sizeof(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_E2SM_gNB_X2_eventTriggerDefinition_1,
-	4,	/* Elements count */
-	&asn_SPC_E2SM_gNB_X2_eventTriggerDefinition_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/E2SM-gNB-X2-eventTriggerDefinition.h b/3rdparty/libe2ap/E2SM-gNB-X2-eventTriggerDefinition.h
deleted file mode 100644
index 7f4a285..0000000
--- a/3rdparty/libe2ap/E2SM-gNB-X2-eventTriggerDefinition.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_E2SM_gNB_X2_eventTriggerDefinition_H_
-#define	_E2SM_gNB_X2_eventTriggerDefinition_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "Interface-ID.h"
-#include "InterfaceDirection.h"
-#include "InterfaceMessageType.h"
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct InterfaceProtocolIE_Item;
-
-/* E2SM-gNB-X2-eventTriggerDefinition */
-typedef struct E2SM_gNB_X2_eventTriggerDefinition {
-	Interface_ID_t	 interface_ID;
-	InterfaceDirection_t	 interfaceDirection;
-	InterfaceMessageType_t	 interfaceMessageType;
-	struct E2SM_gNB_X2_eventTriggerDefinition__interfaceProtocolIE_List {
-		A_SEQUENCE_OF(struct InterfaceProtocolIE_Item) list;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} *interfaceProtocolIE_List;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} E2SM_gNB_X2_eventTriggerDefinition_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_E2SM_gNB_X2_eventTriggerDefinition;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _E2SM_gNB_X2_eventTriggerDefinition_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/E2SM-gNB-X2-indicationHeader.c b/3rdparty/libe2ap/E2SM-gNB-X2-indicationHeader.c
deleted file mode 100644
index 04fa16f..0000000
--- a/3rdparty/libe2ap/E2SM-gNB-X2-indicationHeader.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "E2SM-gNB-X2-indicationHeader.h"
-
-static asn_TYPE_member_t asn_MBR_E2SM_gNB_X2_indicationHeader_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct E2SM_gNB_X2_indicationHeader, interface_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_Interface_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"interface-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct E2SM_gNB_X2_indicationHeader, interfaceDirection),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_InterfaceDirection,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"interfaceDirection"
-		},
-	{ ATF_POINTER, 1, offsetof(struct E2SM_gNB_X2_indicationHeader, timestamp),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_TimeStamp,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"timestamp"
-		},
-};
-static const int asn_MAP_E2SM_gNB_X2_indicationHeader_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_E2SM_gNB_X2_indicationHeader_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_E2SM_gNB_X2_indicationHeader_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* interface-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* interfaceDirection */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* timestamp */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_E2SM_gNB_X2_indicationHeader_specs_1 = {
-	sizeof(struct E2SM_gNB_X2_indicationHeader),
-	offsetof(struct E2SM_gNB_X2_indicationHeader, _asn_ctx),
-	asn_MAP_E2SM_gNB_X2_indicationHeader_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_E2SM_gNB_X2_indicationHeader_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_E2SM_gNB_X2_indicationHeader = {
-	"E2SM-gNB-X2-indicationHeader",
-	"E2SM-gNB-X2-indicationHeader",
-	&asn_OP_SEQUENCE,
-	asn_DEF_E2SM_gNB_X2_indicationHeader_tags_1,
-	sizeof(asn_DEF_E2SM_gNB_X2_indicationHeader_tags_1)
-		/sizeof(asn_DEF_E2SM_gNB_X2_indicationHeader_tags_1[0]), /* 1 */
-	asn_DEF_E2SM_gNB_X2_indicationHeader_tags_1,	/* Same as above */
-	sizeof(asn_DEF_E2SM_gNB_X2_indicationHeader_tags_1)
-		/sizeof(asn_DEF_E2SM_gNB_X2_indicationHeader_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_E2SM_gNB_X2_indicationHeader_1,
-	3,	/* Elements count */
-	&asn_SPC_E2SM_gNB_X2_indicationHeader_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/E2SM-gNB-X2-indicationHeader.h b/3rdparty/libe2ap/E2SM-gNB-X2-indicationHeader.h
deleted file mode 100644
index de28c4a..0000000
--- a/3rdparty/libe2ap/E2SM-gNB-X2-indicationHeader.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_E2SM_gNB_X2_indicationHeader_H_
-#define	_E2SM_gNB_X2_indicationHeader_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "Interface-ID.h"
-#include "InterfaceDirection.h"
-#include "TimeStamp.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* E2SM-gNB-X2-indicationHeader */
-typedef struct E2SM_gNB_X2_indicationHeader {
-	Interface_ID_t	 interface_ID;
-	InterfaceDirection_t	 interfaceDirection;
-	TimeStamp_t	*timestamp;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} E2SM_gNB_X2_indicationHeader_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_E2SM_gNB_X2_indicationHeader;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _E2SM_gNB_X2_indicationHeader_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/E2SM-gNB-X2-indicationMessage.c b/3rdparty/libe2ap/E2SM-gNB-X2-indicationMessage.c
deleted file mode 100644
index eca9640..0000000
--- a/3rdparty/libe2ap/E2SM-gNB-X2-indicationMessage.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "E2SM-gNB-X2-indicationMessage.h"
-
-static asn_TYPE_member_t asn_MBR_E2SM_gNB_X2_indicationMessage_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct E2SM_gNB_X2_indicationMessage, interfaceMessage),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_InterfaceMessage,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"interfaceMessage"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_E2SM_gNB_X2_indicationMessage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_E2SM_gNB_X2_indicationMessage_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* interfaceMessage */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_E2SM_gNB_X2_indicationMessage_specs_1 = {
-	sizeof(struct E2SM_gNB_X2_indicationMessage),
-	offsetof(struct E2SM_gNB_X2_indicationMessage, _asn_ctx),
-	asn_MAP_E2SM_gNB_X2_indicationMessage_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_E2SM_gNB_X2_indicationMessage = {
-	"E2SM-gNB-X2-indicationMessage",
-	"E2SM-gNB-X2-indicationMessage",
-	&asn_OP_SEQUENCE,
-	asn_DEF_E2SM_gNB_X2_indicationMessage_tags_1,
-	sizeof(asn_DEF_E2SM_gNB_X2_indicationMessage_tags_1)
-		/sizeof(asn_DEF_E2SM_gNB_X2_indicationMessage_tags_1[0]), /* 1 */
-	asn_DEF_E2SM_gNB_X2_indicationMessage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_E2SM_gNB_X2_indicationMessage_tags_1)
-		/sizeof(asn_DEF_E2SM_gNB_X2_indicationMessage_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_E2SM_gNB_X2_indicationMessage_1,
-	1,	/* Elements count */
-	&asn_SPC_E2SM_gNB_X2_indicationMessage_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/E2SM-gNB-X2-indicationMessage.h b/3rdparty/libe2ap/E2SM-gNB-X2-indicationMessage.h
deleted file mode 100644
index 0b3713c..0000000
--- a/3rdparty/libe2ap/E2SM-gNB-X2-indicationMessage.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_E2SM_gNB_X2_indicationMessage_H_
-#define	_E2SM_gNB_X2_indicationMessage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "InterfaceMessage.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* E2SM-gNB-X2-indicationMessage */
-typedef struct E2SM_gNB_X2_indicationMessage {
-	InterfaceMessage_t	 interfaceMessage;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} E2SM_gNB_X2_indicationMessage_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_E2SM_gNB_X2_indicationMessage;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _E2SM_gNB_X2_indicationMessage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/EARFCN.c b/3rdparty/libe2ap/EARFCN.c
deleted file mode 100644
index e512bc3..0000000
--- a/3rdparty/libe2ap/EARFCN.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "EARFCN.h"
-
-int
-EARFCN_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_EARFCN_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_EARFCN_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_EARFCN = {
-	"EARFCN",
-	"EARFCN",
-	&asn_OP_NativeInteger,
-	asn_DEF_EARFCN_tags_1,
-	sizeof(asn_DEF_EARFCN_tags_1)
-		/sizeof(asn_DEF_EARFCN_tags_1[0]), /* 1 */
-	asn_DEF_EARFCN_tags_1,	/* Same as above */
-	sizeof(asn_DEF_EARFCN_tags_1)
-		/sizeof(asn_DEF_EARFCN_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_EARFCN_constr_1, EARFCN_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/EARFCN.h b/3rdparty/libe2ap/EARFCN.h
deleted file mode 100644
index f9d5076..0000000
--- a/3rdparty/libe2ap/EARFCN.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_EARFCN_H_
-#define	_EARFCN_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* EARFCN */
-typedef long	 EARFCN_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_EARFCN_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_EARFCN;
-asn_struct_free_f EARFCN_free;
-asn_struct_print_f EARFCN_print;
-asn_constr_check_f EARFCN_constraint;
-ber_type_decoder_f EARFCN_decode_ber;
-der_type_encoder_f EARFCN_encode_der;
-xer_type_decoder_f EARFCN_decode_xer;
-xer_type_encoder_f EARFCN_encode_xer;
-per_type_decoder_f EARFCN_decode_uper;
-per_type_encoder_f EARFCN_encode_uper;
-per_type_decoder_f EARFCN_decode_aper;
-per_type_encoder_f EARFCN_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _EARFCN_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/EARFCNExtension.c b/3rdparty/libe2ap/EARFCNExtension.c
deleted file mode 100644
index 879b78f..0000000
--- a/3rdparty/libe2ap/EARFCNExtension.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "EARFCNExtension.h"
-
-int
-EARFCNExtension_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 65536 && value <= 262143)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_EARFCNExtension_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  18, -1,  65536,  262143 }	/* (65536..262143,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_EARFCNExtension_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_EARFCNExtension = {
-	"EARFCNExtension",
-	"EARFCNExtension",
-	&asn_OP_NativeInteger,
-	asn_DEF_EARFCNExtension_tags_1,
-	sizeof(asn_DEF_EARFCNExtension_tags_1)
-		/sizeof(asn_DEF_EARFCNExtension_tags_1[0]), /* 1 */
-	asn_DEF_EARFCNExtension_tags_1,	/* Same as above */
-	sizeof(asn_DEF_EARFCNExtension_tags_1)
-		/sizeof(asn_DEF_EARFCNExtension_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_EARFCNExtension_constr_1, EARFCNExtension_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/EARFCNExtension.h b/3rdparty/libe2ap/EARFCNExtension.h
deleted file mode 100644
index dc97656..0000000
--- a/3rdparty/libe2ap/EARFCNExtension.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_EARFCNExtension_H_
-#define	_EARFCNExtension_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* EARFCNExtension */
-typedef long	 EARFCNExtension_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_EARFCNExtension;
-asn_struct_free_f EARFCNExtension_free;
-asn_struct_print_f EARFCNExtension_print;
-asn_constr_check_f EARFCNExtension_constraint;
-ber_type_decoder_f EARFCNExtension_decode_ber;
-der_type_encoder_f EARFCNExtension_encode_der;
-xer_type_decoder_f EARFCNExtension_decode_xer;
-xer_type_encoder_f EARFCNExtension_encode_xer;
-per_type_decoder_f EARFCNExtension_decode_uper;
-per_type_encoder_f EARFCNExtension_encode_uper;
-per_type_decoder_f EARFCNExtension_decode_aper;
-per_type_encoder_f EARFCNExtension_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _EARFCNExtension_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ECGI.c b/3rdparty/libe2ap/ECGI.c
deleted file mode 100644
index a816239..0000000
--- a/3rdparty/libe2ap/ECGI.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ECGI.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_ECGI_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ECGI, pLMN_Identity),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_PLMN_Identity,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"pLMN-Identity"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ECGI, eUTRANcellIdentifier),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_EUTRANCellIdentifier,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"eUTRANcellIdentifier"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ECGI, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P39,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_ECGI_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_ECGI_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ECGI_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* eUTRANcellIdentifier */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ECGI_specs_1 = {
-	sizeof(struct ECGI),
-	offsetof(struct ECGI, _asn_ctx),
-	asn_MAP_ECGI_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_ECGI_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ECGI = {
-	"ECGI",
-	"ECGI",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ECGI_tags_1,
-	sizeof(asn_DEF_ECGI_tags_1)
-		/sizeof(asn_DEF_ECGI_tags_1[0]), /* 1 */
-	asn_DEF_ECGI_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ECGI_tags_1)
-		/sizeof(asn_DEF_ECGI_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ECGI_1,
-	3,	/* Elements count */
-	&asn_SPC_ECGI_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ECGI.h b/3rdparty/libe2ap/ECGI.h
deleted file mode 100644
index 5658bbc..0000000
--- a/3rdparty/libe2ap/ECGI.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ECGI_H_
-#define	_ECGI_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "PLMN-Identity.h"
-#include "EUTRANCellIdentifier.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* ECGI */
-typedef struct ECGI {
-	PLMN_Identity_t	 pLMN_Identity;
-	EUTRANCellIdentifier_t	 eUTRANcellIdentifier;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ECGI_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ECGI;
-extern asn_SEQUENCE_specifics_t asn_SPC_ECGI_specs_1;
-extern asn_TYPE_member_t asn_MBR_ECGI_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ECGI_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ENB-ID.c b/3rdparty/libe2ap/ENB-ID.c
deleted file mode 100644
index 89f5f5c..0000000
--- a/3rdparty/libe2ap/ENB-ID.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ENB-ID.h"
-
-static int
-memb_macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 20)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_home_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 28)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_short_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 18)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_long_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 21)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_macro_eNB_ID_constr_2 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  20,  20 }	/* (SIZE(20..20)) */,
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_home_eNB_ID_constr_3 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  28,  28 }	/* (SIZE(28..28)) */,
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_short_Macro_eNB_ID_constr_5 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  18,  18 }	/* (SIZE(18..18)) */,
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_long_Macro_eNB_ID_constr_6 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  21,  21 }	/* (SIZE(21..21)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ENB_ID_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_ENB_ID_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.macro_eNB_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_macro_eNB_ID_constr_2,  memb_macro_eNB_ID_constraint_1 },
-		0, 0, /* No default value */
-		"macro-eNB-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.home_eNB_ID),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_home_eNB_ID_constr_3,  memb_home_eNB_ID_constraint_1 },
-		0, 0, /* No default value */
-		"home-eNB-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.short_Macro_eNB_ID),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_short_Macro_eNB_ID_constr_5,  memb_short_Macro_eNB_ID_constraint_1 },
-		0, 0, /* No default value */
-		"short-Macro-eNB-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.long_Macro_eNB_ID),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_long_Macro_eNB_ID_constr_6,  memb_long_Macro_eNB_ID_constraint_1 },
-		0, 0, /* No default value */
-		"long-Macro-eNB-ID"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENB_ID_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* macro-eNB-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* home-eNB-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* short-Macro-eNB-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* long-Macro-eNB-ID */
-};
-asn_CHOICE_specifics_t asn_SPC_ENB_ID_specs_1 = {
-	sizeof(struct ENB_ID),
-	offsetof(struct ENB_ID, _asn_ctx),
-	offsetof(struct ENB_ID, present),
-	sizeof(((struct ENB_ID *)0)->present),
-	asn_MAP_ENB_ID_tag2el_1,
-	4,	/* Count of tags in the map */
-	0, 0,
-	2	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_ENB_ID = {
-	"ENB-ID",
-	"ENB-ID",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_ENB_ID_constr_1, CHOICE_constraint },
-	asn_MBR_ENB_ID_1,
-	4,	/* Elements count */
-	&asn_SPC_ENB_ID_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ENB-ID.h b/3rdparty/libe2ap/ENB-ID.h
deleted file mode 100644
index 7a8bf87..0000000
--- a/3rdparty/libe2ap/ENB-ID.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ENB_ID_H_
-#define	_ENB_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum ENB_ID_PR {
-	ENB_ID_PR_NOTHING,	/* No components present */
-	ENB_ID_PR_macro_eNB_ID,
-	ENB_ID_PR_home_eNB_ID,
-	/* Extensions may appear below */
-	ENB_ID_PR_short_Macro_eNB_ID,
-	ENB_ID_PR_long_Macro_eNB_ID
-} ENB_ID_PR;
-
-/* ENB-ID */
-typedef struct ENB_ID {
-	ENB_ID_PR present;
-	union ENB_ID_u {
-		BIT_STRING_t	 macro_eNB_ID;
-		BIT_STRING_t	 home_eNB_ID;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-		BIT_STRING_t	 short_Macro_eNB_ID;
-		BIT_STRING_t	 long_Macro_eNB_ID;
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENB_ID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ENB_ID;
-extern asn_CHOICE_specifics_t asn_SPC_ENB_ID_specs_1;
-extern asn_TYPE_member_t asn_MBR_ENB_ID_1[4];
-extern asn_per_constraints_t asn_PER_type_ENB_ID_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ENB_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ENBConfigurationUpdate.c b/3rdparty/libe2ap/ENBConfigurationUpdate.c
deleted file mode 100644
index d02b269..0000000
--- a/3rdparty/libe2ap/ENBConfigurationUpdate.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ENBConfigurationUpdate.h"
-
-asn_TYPE_member_t asn_MBR_ENBConfigurationUpdate_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdate, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P21,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENBConfigurationUpdate_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENBConfigurationUpdate_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationUpdate_specs_1 = {
-	sizeof(struct ENBConfigurationUpdate),
-	offsetof(struct ENBConfigurationUpdate, _asn_ctx),
-	asn_MAP_ENBConfigurationUpdate_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdate = {
-	"ENBConfigurationUpdate",
-	"ENBConfigurationUpdate",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENBConfigurationUpdate_tags_1,
-	sizeof(asn_DEF_ENBConfigurationUpdate_tags_1)
-		/sizeof(asn_DEF_ENBConfigurationUpdate_tags_1[0]), /* 1 */
-	asn_DEF_ENBConfigurationUpdate_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ENBConfigurationUpdate_tags_1)
-		/sizeof(asn_DEF_ENBConfigurationUpdate_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENBConfigurationUpdate_1,
-	1,	/* Elements count */
-	&asn_SPC_ENBConfigurationUpdate_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ENBConfigurationUpdate.h b/3rdparty/libe2ap/ENBConfigurationUpdate.h
deleted file mode 100644
index 50ca146..0000000
--- a/3rdparty/libe2ap/ENBConfigurationUpdate.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ENBConfigurationUpdate_H_
-#define	_ENBConfigurationUpdate_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ENBConfigurationUpdate */
-typedef struct ENBConfigurationUpdate {
-	ProtocolIE_Container_8807P21_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENBConfigurationUpdate_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdate;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationUpdate_specs_1;
-extern asn_TYPE_member_t asn_MBR_ENBConfigurationUpdate_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ENBConfigurationUpdate_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ENBConfigurationUpdateAcknowledge.c b/3rdparty/libe2ap/ENBConfigurationUpdateAcknowledge.c
deleted file mode 100644
index 23944a6..0000000
--- a/3rdparty/libe2ap/ENBConfigurationUpdateAcknowledge.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ENBConfigurationUpdateAcknowledge.h"
-
-asn_TYPE_member_t asn_MBR_ENBConfigurationUpdateAcknowledge_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdateAcknowledge, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P22,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENBConfigurationUpdateAcknowledge_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENBConfigurationUpdateAcknowledge_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationUpdateAcknowledge_specs_1 = {
-	sizeof(struct ENBConfigurationUpdateAcknowledge),
-	offsetof(struct ENBConfigurationUpdateAcknowledge, _asn_ctx),
-	asn_MAP_ENBConfigurationUpdateAcknowledge_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdateAcknowledge = {
-	"ENBConfigurationUpdateAcknowledge",
-	"ENBConfigurationUpdateAcknowledge",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENBConfigurationUpdateAcknowledge_tags_1,
-	sizeof(asn_DEF_ENBConfigurationUpdateAcknowledge_tags_1)
-		/sizeof(asn_DEF_ENBConfigurationUpdateAcknowledge_tags_1[0]), /* 1 */
-	asn_DEF_ENBConfigurationUpdateAcknowledge_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ENBConfigurationUpdateAcknowledge_tags_1)
-		/sizeof(asn_DEF_ENBConfigurationUpdateAcknowledge_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENBConfigurationUpdateAcknowledge_1,
-	1,	/* Elements count */
-	&asn_SPC_ENBConfigurationUpdateAcknowledge_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ENBConfigurationUpdateAcknowledge.h b/3rdparty/libe2ap/ENBConfigurationUpdateAcknowledge.h
deleted file mode 100644
index 23d0d6a..0000000
--- a/3rdparty/libe2ap/ENBConfigurationUpdateAcknowledge.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ENBConfigurationUpdateAcknowledge_H_
-#define	_ENBConfigurationUpdateAcknowledge_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ENBConfigurationUpdateAcknowledge */
-typedef struct ENBConfigurationUpdateAcknowledge {
-	ProtocolIE_Container_8807P22_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENBConfigurationUpdateAcknowledge_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdateAcknowledge;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationUpdateAcknowledge_specs_1;
-extern asn_TYPE_member_t asn_MBR_ENBConfigurationUpdateAcknowledge_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ENBConfigurationUpdateAcknowledge_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ENBConfigurationUpdateFailure.c b/3rdparty/libe2ap/ENBConfigurationUpdateFailure.c
deleted file mode 100644
index 980c329..0000000
--- a/3rdparty/libe2ap/ENBConfigurationUpdateFailure.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ENBConfigurationUpdateFailure.h"
-
-asn_TYPE_member_t asn_MBR_ENBConfigurationUpdateFailure_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdateFailure, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P23,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENBConfigurationUpdateFailure_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENBConfigurationUpdateFailure_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationUpdateFailure_specs_1 = {
-	sizeof(struct ENBConfigurationUpdateFailure),
-	offsetof(struct ENBConfigurationUpdateFailure, _asn_ctx),
-	asn_MAP_ENBConfigurationUpdateFailure_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdateFailure = {
-	"ENBConfigurationUpdateFailure",
-	"ENBConfigurationUpdateFailure",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENBConfigurationUpdateFailure_tags_1,
-	sizeof(asn_DEF_ENBConfigurationUpdateFailure_tags_1)
-		/sizeof(asn_DEF_ENBConfigurationUpdateFailure_tags_1[0]), /* 1 */
-	asn_DEF_ENBConfigurationUpdateFailure_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ENBConfigurationUpdateFailure_tags_1)
-		/sizeof(asn_DEF_ENBConfigurationUpdateFailure_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENBConfigurationUpdateFailure_1,
-	1,	/* Elements count */
-	&asn_SPC_ENBConfigurationUpdateFailure_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ENBConfigurationUpdateFailure.h b/3rdparty/libe2ap/ENBConfigurationUpdateFailure.h
deleted file mode 100644
index 8e62ca7..0000000
--- a/3rdparty/libe2ap/ENBConfigurationUpdateFailure.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ENBConfigurationUpdateFailure_H_
-#define	_ENBConfigurationUpdateFailure_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ENBConfigurationUpdateFailure */
-typedef struct ENBConfigurationUpdateFailure {
-	ProtocolIE_Container_8807P23_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENBConfigurationUpdateFailure_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdateFailure;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationUpdateFailure_specs_1;
-extern asn_TYPE_member_t asn_MBR_ENBConfigurationUpdateFailure_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ENBConfigurationUpdateFailure_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ENDCConfigurationUpdate.c b/3rdparty/libe2ap/ENDCConfigurationUpdate.c
deleted file mode 100644
index e329686..0000000
--- a/3rdparty/libe2ap/ENDCConfigurationUpdate.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ENDCConfigurationUpdate.h"
-
-asn_TYPE_member_t asn_MBR_ENDCConfigurationUpdate_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdate, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P36,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENDCConfigurationUpdate_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENDCConfigurationUpdate_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENDCConfigurationUpdate_specs_1 = {
-	sizeof(struct ENDCConfigurationUpdate),
-	offsetof(struct ENDCConfigurationUpdate, _asn_ctx),
-	asn_MAP_ENDCConfigurationUpdate_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENDCConfigurationUpdate = {
-	"ENDCConfigurationUpdate",
-	"ENDCConfigurationUpdate",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENDCConfigurationUpdate_tags_1,
-	sizeof(asn_DEF_ENDCConfigurationUpdate_tags_1)
-		/sizeof(asn_DEF_ENDCConfigurationUpdate_tags_1[0]), /* 1 */
-	asn_DEF_ENDCConfigurationUpdate_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ENDCConfigurationUpdate_tags_1)
-		/sizeof(asn_DEF_ENDCConfigurationUpdate_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENDCConfigurationUpdate_1,
-	1,	/* Elements count */
-	&asn_SPC_ENDCConfigurationUpdate_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ENDCConfigurationUpdate.h b/3rdparty/libe2ap/ENDCConfigurationUpdate.h
deleted file mode 100644
index 459c807..0000000
--- a/3rdparty/libe2ap/ENDCConfigurationUpdate.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ENDCConfigurationUpdate_H_
-#define	_ENDCConfigurationUpdate_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ENDCConfigurationUpdate */
-typedef struct ENDCConfigurationUpdate {
-	ProtocolIE_Container_8807P36_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENDCConfigurationUpdate_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ENDCConfigurationUpdate;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENDCConfigurationUpdate_specs_1;
-extern asn_TYPE_member_t asn_MBR_ENDCConfigurationUpdate_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ENDCConfigurationUpdate_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ENDCConfigurationUpdateAcknowledge.c b/3rdparty/libe2ap/ENDCConfigurationUpdateAcknowledge.c
deleted file mode 100644
index 106306f..0000000
--- a/3rdparty/libe2ap/ENDCConfigurationUpdateAcknowledge.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ENDCConfigurationUpdateAcknowledge.h"
-
-asn_TYPE_member_t asn_MBR_ENDCConfigurationUpdateAcknowledge_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdateAcknowledge, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P39,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENDCConfigurationUpdateAcknowledge_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENDCConfigurationUpdateAcknowledge_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENDCConfigurationUpdateAcknowledge_specs_1 = {
-	sizeof(struct ENDCConfigurationUpdateAcknowledge),
-	offsetof(struct ENDCConfigurationUpdateAcknowledge, _asn_ctx),
-	asn_MAP_ENDCConfigurationUpdateAcknowledge_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENDCConfigurationUpdateAcknowledge = {
-	"ENDCConfigurationUpdateAcknowledge",
-	"ENDCConfigurationUpdateAcknowledge",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENDCConfigurationUpdateAcknowledge_tags_1,
-	sizeof(asn_DEF_ENDCConfigurationUpdateAcknowledge_tags_1)
-		/sizeof(asn_DEF_ENDCConfigurationUpdateAcknowledge_tags_1[0]), /* 1 */
-	asn_DEF_ENDCConfigurationUpdateAcknowledge_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ENDCConfigurationUpdateAcknowledge_tags_1)
-		/sizeof(asn_DEF_ENDCConfigurationUpdateAcknowledge_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENDCConfigurationUpdateAcknowledge_1,
-	1,	/* Elements count */
-	&asn_SPC_ENDCConfigurationUpdateAcknowledge_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ENDCConfigurationUpdateAcknowledge.h b/3rdparty/libe2ap/ENDCConfigurationUpdateAcknowledge.h
deleted file mode 100644
index 5cd9dc8..0000000
--- a/3rdparty/libe2ap/ENDCConfigurationUpdateAcknowledge.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ENDCConfigurationUpdateAcknowledge_H_
-#define	_ENDCConfigurationUpdateAcknowledge_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ENDCConfigurationUpdateAcknowledge */
-typedef struct ENDCConfigurationUpdateAcknowledge {
-	ProtocolIE_Container_8807P39_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENDCConfigurationUpdateAcknowledge_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ENDCConfigurationUpdateAcknowledge;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENDCConfigurationUpdateAcknowledge_specs_1;
-extern asn_TYPE_member_t asn_MBR_ENDCConfigurationUpdateAcknowledge_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ENDCConfigurationUpdateAcknowledge_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ENDCConfigurationUpdateFailure.c b/3rdparty/libe2ap/ENDCConfigurationUpdateFailure.c
deleted file mode 100644
index aaf073b..0000000
--- a/3rdparty/libe2ap/ENDCConfigurationUpdateFailure.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ENDCConfigurationUpdateFailure.h"
-
-asn_TYPE_member_t asn_MBR_ENDCConfigurationUpdateFailure_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdateFailure, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P42,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENDCConfigurationUpdateFailure_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENDCConfigurationUpdateFailure_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENDCConfigurationUpdateFailure_specs_1 = {
-	sizeof(struct ENDCConfigurationUpdateFailure),
-	offsetof(struct ENDCConfigurationUpdateFailure, _asn_ctx),
-	asn_MAP_ENDCConfigurationUpdateFailure_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENDCConfigurationUpdateFailure = {
-	"ENDCConfigurationUpdateFailure",
-	"ENDCConfigurationUpdateFailure",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENDCConfigurationUpdateFailure_tags_1,
-	sizeof(asn_DEF_ENDCConfigurationUpdateFailure_tags_1)
-		/sizeof(asn_DEF_ENDCConfigurationUpdateFailure_tags_1[0]), /* 1 */
-	asn_DEF_ENDCConfigurationUpdateFailure_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ENDCConfigurationUpdateFailure_tags_1)
-		/sizeof(asn_DEF_ENDCConfigurationUpdateFailure_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENDCConfigurationUpdateFailure_1,
-	1,	/* Elements count */
-	&asn_SPC_ENDCConfigurationUpdateFailure_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ENDCConfigurationUpdateFailure.h b/3rdparty/libe2ap/ENDCConfigurationUpdateFailure.h
deleted file mode 100644
index 3bca301..0000000
--- a/3rdparty/libe2ap/ENDCConfigurationUpdateFailure.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ENDCConfigurationUpdateFailure_H_
-#define	_ENDCConfigurationUpdateFailure_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ENDCConfigurationUpdateFailure */
-typedef struct ENDCConfigurationUpdateFailure {
-	ProtocolIE_Container_8807P42_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENDCConfigurationUpdateFailure_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ENDCConfigurationUpdateFailure;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENDCConfigurationUpdateFailure_specs_1;
-extern asn_TYPE_member_t asn_MBR_ENDCConfigurationUpdateFailure_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ENDCConfigurationUpdateFailure_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ENDCX2SetupFailure.c b/3rdparty/libe2ap/ENDCX2SetupFailure.c
deleted file mode 100644
index 19e26ef..0000000
--- a/3rdparty/libe2ap/ENDCX2SetupFailure.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ENDCX2SetupFailure.h"
-
-asn_TYPE_member_t asn_MBR_ENDCX2SetupFailure_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupFailure, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P35,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENDCX2SetupFailure_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENDCX2SetupFailure_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENDCX2SetupFailure_specs_1 = {
-	sizeof(struct ENDCX2SetupFailure),
-	offsetof(struct ENDCX2SetupFailure, _asn_ctx),
-	asn_MAP_ENDCX2SetupFailure_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENDCX2SetupFailure = {
-	"ENDCX2SetupFailure",
-	"ENDCX2SetupFailure",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENDCX2SetupFailure_tags_1,
-	sizeof(asn_DEF_ENDCX2SetupFailure_tags_1)
-		/sizeof(asn_DEF_ENDCX2SetupFailure_tags_1[0]), /* 1 */
-	asn_DEF_ENDCX2SetupFailure_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ENDCX2SetupFailure_tags_1)
-		/sizeof(asn_DEF_ENDCX2SetupFailure_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENDCX2SetupFailure_1,
-	1,	/* Elements count */
-	&asn_SPC_ENDCX2SetupFailure_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ENDCX2SetupFailure.h b/3rdparty/libe2ap/ENDCX2SetupFailure.h
deleted file mode 100644
index 7dc5516..0000000
--- a/3rdparty/libe2ap/ENDCX2SetupFailure.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ENDCX2SetupFailure_H_
-#define	_ENDCX2SetupFailure_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ENDCX2SetupFailure */
-typedef struct ENDCX2SetupFailure {
-	ProtocolIE_Container_8807P35_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENDCX2SetupFailure_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ENDCX2SetupFailure;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENDCX2SetupFailure_specs_1;
-extern asn_TYPE_member_t asn_MBR_ENDCX2SetupFailure_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ENDCX2SetupFailure_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ENDCX2SetupRequest.c b/3rdparty/libe2ap/ENDCX2SetupRequest.c
deleted file mode 100644
index 4ca79b6..0000000
--- a/3rdparty/libe2ap/ENDCX2SetupRequest.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ENDCX2SetupRequest.h"
-
-asn_TYPE_member_t asn_MBR_ENDCX2SetupRequest_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupRequest, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P29,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENDCX2SetupRequest_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENDCX2SetupRequest_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENDCX2SetupRequest_specs_1 = {
-	sizeof(struct ENDCX2SetupRequest),
-	offsetof(struct ENDCX2SetupRequest, _asn_ctx),
-	asn_MAP_ENDCX2SetupRequest_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENDCX2SetupRequest = {
-	"ENDCX2SetupRequest",
-	"ENDCX2SetupRequest",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENDCX2SetupRequest_tags_1,
-	sizeof(asn_DEF_ENDCX2SetupRequest_tags_1)
-		/sizeof(asn_DEF_ENDCX2SetupRequest_tags_1[0]), /* 1 */
-	asn_DEF_ENDCX2SetupRequest_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ENDCX2SetupRequest_tags_1)
-		/sizeof(asn_DEF_ENDCX2SetupRequest_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENDCX2SetupRequest_1,
-	1,	/* Elements count */
-	&asn_SPC_ENDCX2SetupRequest_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ENDCX2SetupRequest.h b/3rdparty/libe2ap/ENDCX2SetupRequest.h
deleted file mode 100644
index c7f75ed..0000000
--- a/3rdparty/libe2ap/ENDCX2SetupRequest.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ENDCX2SetupRequest_H_
-#define	_ENDCX2SetupRequest_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ENDCX2SetupRequest */
-typedef struct ENDCX2SetupRequest {
-	ProtocolIE_Container_8807P29_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENDCX2SetupRequest_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ENDCX2SetupRequest;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENDCX2SetupRequest_specs_1;
-extern asn_TYPE_member_t asn_MBR_ENDCX2SetupRequest_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ENDCX2SetupRequest_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ENDCX2SetupResponse.c b/3rdparty/libe2ap/ENDCX2SetupResponse.c
deleted file mode 100644
index 9e6d1a3..0000000
--- a/3rdparty/libe2ap/ENDCX2SetupResponse.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ENDCX2SetupResponse.h"
-
-asn_TYPE_member_t asn_MBR_ENDCX2SetupResponse_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupResponse, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P32,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENDCX2SetupResponse_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENDCX2SetupResponse_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENDCX2SetupResponse_specs_1 = {
-	sizeof(struct ENDCX2SetupResponse),
-	offsetof(struct ENDCX2SetupResponse, _asn_ctx),
-	asn_MAP_ENDCX2SetupResponse_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENDCX2SetupResponse = {
-	"ENDCX2SetupResponse",
-	"ENDCX2SetupResponse",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENDCX2SetupResponse_tags_1,
-	sizeof(asn_DEF_ENDCX2SetupResponse_tags_1)
-		/sizeof(asn_DEF_ENDCX2SetupResponse_tags_1[0]), /* 1 */
-	asn_DEF_ENDCX2SetupResponse_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ENDCX2SetupResponse_tags_1)
-		/sizeof(asn_DEF_ENDCX2SetupResponse_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENDCX2SetupResponse_1,
-	1,	/* Elements count */
-	&asn_SPC_ENDCX2SetupResponse_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ENDCX2SetupResponse.h b/3rdparty/libe2ap/ENDCX2SetupResponse.h
deleted file mode 100644
index 6891cb1..0000000
--- a/3rdparty/libe2ap/ENDCX2SetupResponse.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ENDCX2SetupResponse_H_
-#define	_ENDCX2SetupResponse_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ENDCX2SetupResponse */
-typedef struct ENDCX2SetupResponse {
-	ProtocolIE_Container_8807P32_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENDCX2SetupResponse_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ENDCX2SetupResponse;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENDCX2SetupResponse_specs_1;
-extern asn_TYPE_member_t asn_MBR_ENDCX2SetupResponse_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ENDCX2SetupResponse_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/EUTRA-Mode-Info.c b/3rdparty/libe2ap/EUTRA-Mode-Info.c
deleted file mode 100644
index 472d102..0000000
--- a/3rdparty/libe2ap/EUTRA-Mode-Info.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "EUTRA-Mode-Info.h"
-
-asn_per_constraints_t asn_PER_type_EUTRA_Mode_Info_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_EUTRA_Mode_Info_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct EUTRA_Mode_Info, choice.fDD),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_FDD_Info,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"fDD"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct EUTRA_Mode_Info, choice.tDD),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_TDD_Info,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"tDD"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_EUTRA_Mode_Info_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* fDD */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* tDD */
-};
-asn_CHOICE_specifics_t asn_SPC_EUTRA_Mode_Info_specs_1 = {
-	sizeof(struct EUTRA_Mode_Info),
-	offsetof(struct EUTRA_Mode_Info, _asn_ctx),
-	offsetof(struct EUTRA_Mode_Info, present),
-	sizeof(((struct EUTRA_Mode_Info *)0)->present),
-	asn_MAP_EUTRA_Mode_Info_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0,
-	2	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_EUTRA_Mode_Info = {
-	"EUTRA-Mode-Info",
-	"EUTRA-Mode-Info",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_EUTRA_Mode_Info_constr_1, CHOICE_constraint },
-	asn_MBR_EUTRA_Mode_Info_1,
-	2,	/* Elements count */
-	&asn_SPC_EUTRA_Mode_Info_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/EUTRA-Mode-Info.h b/3rdparty/libe2ap/EUTRA-Mode-Info.h
deleted file mode 100644
index 628e79e..0000000
--- a/3rdparty/libe2ap/EUTRA-Mode-Info.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_EUTRA_Mode_Info_H_
-#define	_EUTRA_Mode_Info_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "FDD-Info.h"
-#include "TDD-Info.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum EUTRA_Mode_Info_PR {
-	EUTRA_Mode_Info_PR_NOTHING,	/* No components present */
-	EUTRA_Mode_Info_PR_fDD,
-	EUTRA_Mode_Info_PR_tDD
-	/* Extensions may appear below */
-	
-} EUTRA_Mode_Info_PR;
-
-/* EUTRA-Mode-Info */
-typedef struct EUTRA_Mode_Info {
-	EUTRA_Mode_Info_PR present;
-	union EUTRA_Mode_Info_u {
-		FDD_Info_t	 fDD;
-		TDD_Info_t	 tDD;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} EUTRA_Mode_Info_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_EUTRA_Mode_Info;
-extern asn_CHOICE_specifics_t asn_SPC_EUTRA_Mode_Info_specs_1;
-extern asn_TYPE_member_t asn_MBR_EUTRA_Mode_Info_1[2];
-extern asn_per_constraints_t asn_PER_type_EUTRA_Mode_Info_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _EUTRA_Mode_Info_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/EUTRANCellIdentifier.c b/3rdparty/libe2ap/EUTRANCellIdentifier.c
deleted file mode 100644
index f2c54a4..0000000
--- a/3rdparty/libe2ap/EUTRANCellIdentifier.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "EUTRANCellIdentifier.h"
-
-int
-EUTRANCellIdentifier_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 28)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using BIT_STRING,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_EUTRANCellIdentifier_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  28,  28 }	/* (SIZE(28..28)) */,
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_EUTRANCellIdentifier_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_EUTRANCellIdentifier = {
-	"EUTRANCellIdentifier",
-	"EUTRANCellIdentifier",
-	&asn_OP_BIT_STRING,
-	asn_DEF_EUTRANCellIdentifier_tags_1,
-	sizeof(asn_DEF_EUTRANCellIdentifier_tags_1)
-		/sizeof(asn_DEF_EUTRANCellIdentifier_tags_1[0]), /* 1 */
-	asn_DEF_EUTRANCellIdentifier_tags_1,	/* Same as above */
-	sizeof(asn_DEF_EUTRANCellIdentifier_tags_1)
-		/sizeof(asn_DEF_EUTRANCellIdentifier_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_EUTRANCellIdentifier_constr_1, EUTRANCellIdentifier_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_BIT_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/EUTRANCellIdentifier.h b/3rdparty/libe2ap/EUTRANCellIdentifier.h
deleted file mode 100644
index 2bb0e77..0000000
--- a/3rdparty/libe2ap/EUTRANCellIdentifier.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_EUTRANCellIdentifier_H_
-#define	_EUTRANCellIdentifier_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* EUTRANCellIdentifier */
-typedef BIT_STRING_t	 EUTRANCellIdentifier_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_EUTRANCellIdentifier_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_EUTRANCellIdentifier;
-asn_struct_free_f EUTRANCellIdentifier_free;
-asn_struct_print_f EUTRANCellIdentifier_print;
-asn_constr_check_f EUTRANCellIdentifier_constraint;
-ber_type_decoder_f EUTRANCellIdentifier_decode_ber;
-der_type_encoder_f EUTRANCellIdentifier_encode_der;
-xer_type_decoder_f EUTRANCellIdentifier_decode_xer;
-xer_type_encoder_f EUTRANCellIdentifier_encode_xer;
-per_type_decoder_f EUTRANCellIdentifier_decode_uper;
-per_type_encoder_f EUTRANCellIdentifier_encode_uper;
-per_type_decoder_f EUTRANCellIdentifier_decode_aper;
-per_type_encoder_f EUTRANCellIdentifier_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _EUTRANCellIdentifier_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/EnhancedRNTP.c b/3rdparty/libe2ap/EnhancedRNTP.c
deleted file mode 100644
index e61ec24..0000000
--- a/3rdparty/libe2ap/EnhancedRNTP.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "EnhancedRNTP.h"
-
-#include "EnhancedRNTPStartTime.h"
-#include "ProtocolExtensionContainer.h"
-static int
-memb_enhancedRNTPBitmap_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size >= 12 && size <= 8800)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_enhancedRNTPBitmap_constr_2 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  14,  14,  12,  8800 }	/* (SIZE(12..8800,...)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_EnhancedRNTP_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTP, enhancedRNTPBitmap),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_enhancedRNTPBitmap_constr_2,  memb_enhancedRNTPBitmap_constraint_1 },
-		0, 0, /* No default value */
-		"enhancedRNTPBitmap"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTP, rNTP_High_Power_Threshold),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RNTP_Threshold,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"rNTP-High-Power-Threshold"
-		},
-	{ ATF_POINTER, 2, offsetof(struct EnhancedRNTP, enhancedRNTPStartTime),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_EnhancedRNTPStartTime,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"enhancedRNTPStartTime"
-		},
-	{ ATF_POINTER, 1, offsetof(struct EnhancedRNTP, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P40,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_EnhancedRNTP_oms_1[] = { 2, 3 };
-static const ber_tlv_tag_t asn_DEF_EnhancedRNTP_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_EnhancedRNTP_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* enhancedRNTPBitmap */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* rNTP-High-Power-Threshold */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* enhancedRNTPStartTime */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_EnhancedRNTP_specs_1 = {
-	sizeof(struct EnhancedRNTP),
-	offsetof(struct EnhancedRNTP, _asn_ctx),
-	asn_MAP_EnhancedRNTP_tag2el_1,
-	4,	/* Count of tags in the map */
-	asn_MAP_EnhancedRNTP_oms_1,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_EnhancedRNTP = {
-	"EnhancedRNTP",
-	"EnhancedRNTP",
-	&asn_OP_SEQUENCE,
-	asn_DEF_EnhancedRNTP_tags_1,
-	sizeof(asn_DEF_EnhancedRNTP_tags_1)
-		/sizeof(asn_DEF_EnhancedRNTP_tags_1[0]), /* 1 */
-	asn_DEF_EnhancedRNTP_tags_1,	/* Same as above */
-	sizeof(asn_DEF_EnhancedRNTP_tags_1)
-		/sizeof(asn_DEF_EnhancedRNTP_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_EnhancedRNTP_1,
-	4,	/* Elements count */
-	&asn_SPC_EnhancedRNTP_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/EnhancedRNTP.h b/3rdparty/libe2ap/EnhancedRNTP.h
deleted file mode 100644
index 6cfd997..0000000
--- a/3rdparty/libe2ap/EnhancedRNTP.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_EnhancedRNTP_H_
-#define	_EnhancedRNTP_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-#include "RNTP-Threshold.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct EnhancedRNTPStartTime;
-struct ProtocolExtensionContainer;
-
-/* EnhancedRNTP */
-typedef struct EnhancedRNTP {
-	BIT_STRING_t	 enhancedRNTPBitmap;
-	RNTP_Threshold_t	 rNTP_High_Power_Threshold;
-	struct EnhancedRNTPStartTime	*enhancedRNTPStartTime;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} EnhancedRNTP_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_EnhancedRNTP;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _EnhancedRNTP_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/EnhancedRNTPStartTime.c b/3rdparty/libe2ap/EnhancedRNTPStartTime.c
deleted file mode 100644
index 658ae76..0000000
--- a/3rdparty/libe2ap/EnhancedRNTPStartTime.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "EnhancedRNTPStartTime.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_startSFN_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 1023)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_startSubframeNumber_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 9)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_startSFN_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  10,  10,  0,  1023 }	/* (0..1023,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_startSubframeNumber_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  4,  4,  0,  9 }	/* (0..9,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_EnhancedRNTPStartTime_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTPStartTime, startSFN),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_startSFN_constr_2,  memb_startSFN_constraint_1 },
-		0, 0, /* No default value */
-		"startSFN"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTPStartTime, startSubframeNumber),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_startSubframeNumber_constr_3,  memb_startSubframeNumber_constraint_1 },
-		0, 0, /* No default value */
-		"startSubframeNumber"
-		},
-	{ ATF_POINTER, 1, offsetof(struct EnhancedRNTPStartTime, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P41,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_EnhancedRNTPStartTime_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_EnhancedRNTPStartTime_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_EnhancedRNTPStartTime_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* startSFN */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* startSubframeNumber */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_EnhancedRNTPStartTime_specs_1 = {
-	sizeof(struct EnhancedRNTPStartTime),
-	offsetof(struct EnhancedRNTPStartTime, _asn_ctx),
-	asn_MAP_EnhancedRNTPStartTime_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_EnhancedRNTPStartTime_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_EnhancedRNTPStartTime = {
-	"EnhancedRNTPStartTime",
-	"EnhancedRNTPStartTime",
-	&asn_OP_SEQUENCE,
-	asn_DEF_EnhancedRNTPStartTime_tags_1,
-	sizeof(asn_DEF_EnhancedRNTPStartTime_tags_1)
-		/sizeof(asn_DEF_EnhancedRNTPStartTime_tags_1[0]), /* 1 */
-	asn_DEF_EnhancedRNTPStartTime_tags_1,	/* Same as above */
-	sizeof(asn_DEF_EnhancedRNTPStartTime_tags_1)
-		/sizeof(asn_DEF_EnhancedRNTPStartTime_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_EnhancedRNTPStartTime_1,
-	3,	/* Elements count */
-	&asn_SPC_EnhancedRNTPStartTime_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/EnhancedRNTPStartTime.h b/3rdparty/libe2ap/EnhancedRNTPStartTime.h
deleted file mode 100644
index 8e9c3c6..0000000
--- a/3rdparty/libe2ap/EnhancedRNTPStartTime.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_EnhancedRNTPStartTime_H_
-#define	_EnhancedRNTPStartTime_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* EnhancedRNTPStartTime */
-typedef struct EnhancedRNTPStartTime {
-	long	 startSFN;
-	long	 startSubframeNumber;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} EnhancedRNTPStartTime_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_EnhancedRNTPStartTime;
-extern asn_SEQUENCE_specifics_t asn_SPC_EnhancedRNTPStartTime_specs_1;
-extern asn_TYPE_member_t asn_MBR_EnhancedRNTPStartTime_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _EnhancedRNTPStartTime_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ErrorIndication.c b/3rdparty/libe2ap/ErrorIndication.c
deleted file mode 100644
index a8014d1..0000000
--- a/3rdparty/libe2ap/ErrorIndication.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ErrorIndication.h"
-
-asn_TYPE_member_t asn_MBR_ErrorIndication_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ErrorIndication, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P14,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ErrorIndication_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ErrorIndication_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ErrorIndication_specs_1 = {
-	sizeof(struct ErrorIndication),
-	offsetof(struct ErrorIndication, _asn_ctx),
-	asn_MAP_ErrorIndication_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ErrorIndication = {
-	"ErrorIndication",
-	"ErrorIndication",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ErrorIndication_tags_1,
-	sizeof(asn_DEF_ErrorIndication_tags_1)
-		/sizeof(asn_DEF_ErrorIndication_tags_1[0]), /* 1 */
-	asn_DEF_ErrorIndication_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ErrorIndication_tags_1)
-		/sizeof(asn_DEF_ErrorIndication_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ErrorIndication_1,
-	1,	/* Elements count */
-	&asn_SPC_ErrorIndication_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ErrorIndication.h b/3rdparty/libe2ap/ErrorIndication.h
deleted file mode 100644
index 6da9163..0000000
--- a/3rdparty/libe2ap/ErrorIndication.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ErrorIndication_H_
-#define	_ErrorIndication_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ErrorIndication */
-typedef struct ErrorIndication {
-	ProtocolIE_Container_8807P14_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ErrorIndication_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ErrorIndication;
-extern asn_SEQUENCE_specifics_t asn_SPC_ErrorIndication_specs_1;
-extern asn_TYPE_member_t asn_MBR_ErrorIndication_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ErrorIndication_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ExtendedULInterferenceOverloadInfo.c b/3rdparty/libe2ap/ExtendedULInterferenceOverloadInfo.c
deleted file mode 100644
index ec0f212..0000000
--- a/3rdparty/libe2ap/ExtendedULInterferenceOverloadInfo.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ExtendedULInterferenceOverloadInfo.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_associatedSubframes_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 5)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_associatedSubframes_constr_2 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  5,  5 }	/* (SIZE(5..5)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_ExtendedULInterferenceOverloadInfo_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ExtendedULInterferenceOverloadInfo, associatedSubframes),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_associatedSubframes_constr_2,  memb_associatedSubframes_constraint_1 },
-		0, 0, /* No default value */
-		"associatedSubframes"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ExtendedULInterferenceOverloadInfo, extended_ul_InterferenceOverloadIndication),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_UL_InterferenceOverloadIndication,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"extended-ul-InterferenceOverloadIndication"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ExtendedULInterferenceOverloadInfo, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P42,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_ExtendedULInterferenceOverloadInfo_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_ExtendedULInterferenceOverloadInfo_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ExtendedULInterferenceOverloadInfo_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* associatedSubframes */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* extended-ul-InterferenceOverloadIndication */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_ExtendedULInterferenceOverloadInfo_specs_1 = {
-	sizeof(struct ExtendedULInterferenceOverloadInfo),
-	offsetof(struct ExtendedULInterferenceOverloadInfo, _asn_ctx),
-	asn_MAP_ExtendedULInterferenceOverloadInfo_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_ExtendedULInterferenceOverloadInfo_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ExtendedULInterferenceOverloadInfo = {
-	"ExtendedULInterferenceOverloadInfo",
-	"ExtendedULInterferenceOverloadInfo",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ExtendedULInterferenceOverloadInfo_tags_1,
-	sizeof(asn_DEF_ExtendedULInterferenceOverloadInfo_tags_1)
-		/sizeof(asn_DEF_ExtendedULInterferenceOverloadInfo_tags_1[0]), /* 1 */
-	asn_DEF_ExtendedULInterferenceOverloadInfo_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ExtendedULInterferenceOverloadInfo_tags_1)
-		/sizeof(asn_DEF_ExtendedULInterferenceOverloadInfo_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ExtendedULInterferenceOverloadInfo_1,
-	3,	/* Elements count */
-	&asn_SPC_ExtendedULInterferenceOverloadInfo_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ExtendedULInterferenceOverloadInfo.h b/3rdparty/libe2ap/ExtendedULInterferenceOverloadInfo.h
deleted file mode 100644
index 806e0b4..0000000
--- a/3rdparty/libe2ap/ExtendedULInterferenceOverloadInfo.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ExtendedULInterferenceOverloadInfo_H_
-#define	_ExtendedULInterferenceOverloadInfo_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-#include "UL-InterferenceOverloadIndication.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* ExtendedULInterferenceOverloadInfo */
-typedef struct ExtendedULInterferenceOverloadInfo {
-	BIT_STRING_t	 associatedSubframes;
-	UL_InterferenceOverloadIndication_t	 extended_ul_InterferenceOverloadIndication;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ExtendedULInterferenceOverloadInfo_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ExtendedULInterferenceOverloadInfo;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ExtendedULInterferenceOverloadInfo_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/FDD-Info.c b/3rdparty/libe2ap/FDD-Info.c
deleted file mode 100644
index 2df600e..0000000
--- a/3rdparty/libe2ap/FDD-Info.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "FDD-Info.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_FDD_Info_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info, uL_EARFCN),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_EARFCN,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"uL-EARFCN"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info, dL_EARFCN),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_EARFCN,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"dL-EARFCN"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info, uL_Transmission_Bandwidth),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Transmission_Bandwidth,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"uL-Transmission-Bandwidth"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info, dL_Transmission_Bandwidth),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Transmission_Bandwidth,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"dL-Transmission-Bandwidth"
-		},
-	{ ATF_POINTER, 1, offsetof(struct FDD_Info, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P43,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_FDD_Info_oms_1[] = { 4 };
-static const ber_tlv_tag_t asn_DEF_FDD_Info_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_FDD_Info_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* uL-EARFCN */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* dL-EARFCN */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* uL-Transmission-Bandwidth */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* dL-Transmission-Bandwidth */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_FDD_Info_specs_1 = {
-	sizeof(struct FDD_Info),
-	offsetof(struct FDD_Info, _asn_ctx),
-	asn_MAP_FDD_Info_tag2el_1,
-	5,	/* Count of tags in the map */
-	asn_MAP_FDD_Info_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	5,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_FDD_Info = {
-	"FDD-Info",
-	"FDD-Info",
-	&asn_OP_SEQUENCE,
-	asn_DEF_FDD_Info_tags_1,
-	sizeof(asn_DEF_FDD_Info_tags_1)
-		/sizeof(asn_DEF_FDD_Info_tags_1[0]), /* 1 */
-	asn_DEF_FDD_Info_tags_1,	/* Same as above */
-	sizeof(asn_DEF_FDD_Info_tags_1)
-		/sizeof(asn_DEF_FDD_Info_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_FDD_Info_1,
-	5,	/* Elements count */
-	&asn_SPC_FDD_Info_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/FDD-Info.h b/3rdparty/libe2ap/FDD-Info.h
deleted file mode 100644
index 6ed9235..0000000
--- a/3rdparty/libe2ap/FDD-Info.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_FDD_Info_H_
-#define	_FDD_Info_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "EARFCN.h"
-#include "Transmission-Bandwidth.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* FDD-Info */
-typedef struct FDD_Info {
-	EARFCN_t	 uL_EARFCN;
-	EARFCN_t	 dL_EARFCN;
-	Transmission_Bandwidth_t	 uL_Transmission_Bandwidth;
-	Transmission_Bandwidth_t	 dL_Transmission_Bandwidth;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} FDD_Info_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_FDD_Info;
-extern asn_SEQUENCE_specifics_t asn_SPC_FDD_Info_specs_1;
-extern asn_TYPE_member_t asn_MBR_FDD_Info_1[5];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _FDD_Info_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/FDD-InfoNeighbourServedNRCell-Information.c b/3rdparty/libe2ap/FDD-InfoNeighbourServedNRCell-Information.c
deleted file mode 100644
index d98789f..0000000
--- a/3rdparty/libe2ap/FDD-InfoNeighbourServedNRCell-Information.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "FDD-InfoNeighbourServedNRCell-Information.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_FDD_InfoNeighbourServedNRCell_Information_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_InfoNeighbourServedNRCell_Information, ul_NRFreqInfo),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRFreqInfo,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ul-NRFreqInfo"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_InfoNeighbourServedNRCell_Information, dl_NRFreqInfo),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRFreqInfo,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"dl-NRFreqInfo"
-		},
-	{ ATF_POINTER, 1, offsetof(struct FDD_InfoNeighbourServedNRCell_Information, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P13,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_FDD_InfoNeighbourServedNRCell_Information_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_FDD_InfoNeighbourServedNRCell_Information_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_FDD_InfoNeighbourServedNRCell_Information_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ul-NRFreqInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* dl-NRFreqInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_FDD_InfoNeighbourServedNRCell_Information_specs_1 = {
-	sizeof(struct FDD_InfoNeighbourServedNRCell_Information),
-	offsetof(struct FDD_InfoNeighbourServedNRCell_Information, _asn_ctx),
-	asn_MAP_FDD_InfoNeighbourServedNRCell_Information_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_FDD_InfoNeighbourServedNRCell_Information_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_FDD_InfoNeighbourServedNRCell_Information = {
-	"FDD-InfoNeighbourServedNRCell-Information",
-	"FDD-InfoNeighbourServedNRCell-Information",
-	&asn_OP_SEQUENCE,
-	asn_DEF_FDD_InfoNeighbourServedNRCell_Information_tags_1,
-	sizeof(asn_DEF_FDD_InfoNeighbourServedNRCell_Information_tags_1)
-		/sizeof(asn_DEF_FDD_InfoNeighbourServedNRCell_Information_tags_1[0]), /* 1 */
-	asn_DEF_FDD_InfoNeighbourServedNRCell_Information_tags_1,	/* Same as above */
-	sizeof(asn_DEF_FDD_InfoNeighbourServedNRCell_Information_tags_1)
-		/sizeof(asn_DEF_FDD_InfoNeighbourServedNRCell_Information_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_FDD_InfoNeighbourServedNRCell_Information_1,
-	3,	/* Elements count */
-	&asn_SPC_FDD_InfoNeighbourServedNRCell_Information_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/FDD-InfoNeighbourServedNRCell-Information.h b/3rdparty/libe2ap/FDD-InfoNeighbourServedNRCell-Information.h
deleted file mode 100644
index 839feab..0000000
--- a/3rdparty/libe2ap/FDD-InfoNeighbourServedNRCell-Information.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_FDD_InfoNeighbourServedNRCell_Information_H_
-#define	_FDD_InfoNeighbourServedNRCell_Information_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NRFreqInfo.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* FDD-InfoNeighbourServedNRCell-Information */
-typedef struct FDD_InfoNeighbourServedNRCell_Information {
-	NRFreqInfo_t	 ul_NRFreqInfo;
-	NRFreqInfo_t	 dl_NRFreqInfo;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} FDD_InfoNeighbourServedNRCell_Information_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_FDD_InfoNeighbourServedNRCell_Information;
-extern asn_SEQUENCE_specifics_t asn_SPC_FDD_InfoNeighbourServedNRCell_Information_specs_1;
-extern asn_TYPE_member_t asn_MBR_FDD_InfoNeighbourServedNRCell_Information_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _FDD_InfoNeighbourServedNRCell_Information_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/FDD-InfoServedNRCell-Information.c b/3rdparty/libe2ap/FDD-InfoServedNRCell-Information.c
deleted file mode 100644
index 5204c80..0000000
--- a/3rdparty/libe2ap/FDD-InfoServedNRCell-Information.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "FDD-InfoServedNRCell-Information.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_FDD_InfoServedNRCell_Information_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_InfoServedNRCell_Information, ul_NRFreqInfo),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRFreqInfo,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ul-NRFreqInfo"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_InfoServedNRCell_Information, dl_NRFreqInfo),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRFreqInfo,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"dl-NRFreqInfo"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_InfoServedNRCell_Information, ul_NR_TxBW),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NR_TxBW,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ul-NR-TxBW"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_InfoServedNRCell_Information, dl_NR_TxBW),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NR_TxBW,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"dl-NR-TxBW"
-		},
-	{ ATF_POINTER, 1, offsetof(struct FDD_InfoServedNRCell_Information, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P12,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_FDD_InfoServedNRCell_Information_oms_1[] = { 4 };
-static const ber_tlv_tag_t asn_DEF_FDD_InfoServedNRCell_Information_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_FDD_InfoServedNRCell_Information_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ul-NRFreqInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* dl-NRFreqInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ul-NR-TxBW */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* dl-NR-TxBW */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_FDD_InfoServedNRCell_Information_specs_1 = {
-	sizeof(struct FDD_InfoServedNRCell_Information),
-	offsetof(struct FDD_InfoServedNRCell_Information, _asn_ctx),
-	asn_MAP_FDD_InfoServedNRCell_Information_tag2el_1,
-	5,	/* Count of tags in the map */
-	asn_MAP_FDD_InfoServedNRCell_Information_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	5,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_FDD_InfoServedNRCell_Information = {
-	"FDD-InfoServedNRCell-Information",
-	"FDD-InfoServedNRCell-Information",
-	&asn_OP_SEQUENCE,
-	asn_DEF_FDD_InfoServedNRCell_Information_tags_1,
-	sizeof(asn_DEF_FDD_InfoServedNRCell_Information_tags_1)
-		/sizeof(asn_DEF_FDD_InfoServedNRCell_Information_tags_1[0]), /* 1 */
-	asn_DEF_FDD_InfoServedNRCell_Information_tags_1,	/* Same as above */
-	sizeof(asn_DEF_FDD_InfoServedNRCell_Information_tags_1)
-		/sizeof(asn_DEF_FDD_InfoServedNRCell_Information_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_FDD_InfoServedNRCell_Information_1,
-	5,	/* Elements count */
-	&asn_SPC_FDD_InfoServedNRCell_Information_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/FDD-InfoServedNRCell-Information.h b/3rdparty/libe2ap/FDD-InfoServedNRCell-Information.h
deleted file mode 100644
index 7e9e513..0000000
--- a/3rdparty/libe2ap/FDD-InfoServedNRCell-Information.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_FDD_InfoServedNRCell_Information_H_
-#define	_FDD_InfoServedNRCell_Information_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NRFreqInfo.h"
-#include "NR-TxBW.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* FDD-InfoServedNRCell-Information */
-typedef struct FDD_InfoServedNRCell_Information {
-	NRFreqInfo_t	 ul_NRFreqInfo;
-	NRFreqInfo_t	 dl_NRFreqInfo;
-	NR_TxBW_t	 ul_NR_TxBW;
-	NR_TxBW_t	 dl_NR_TxBW;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} FDD_InfoServedNRCell_Information_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_FDD_InfoServedNRCell_Information;
-extern asn_SEQUENCE_specifics_t asn_SPC_FDD_InfoServedNRCell_Information_specs_1;
-extern asn_TYPE_member_t asn_MBR_FDD_InfoServedNRCell_Information_1[5];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _FDD_InfoServedNRCell_Information_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/FiveGS-TAC.c b/3rdparty/libe2ap/FiveGS-TAC.c
deleted file mode 100644
index 1997a46..0000000
--- a/3rdparty/libe2ap/FiveGS-TAC.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "FiveGS-TAC.h"
-
-int
-FiveGS_TAC_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	size = st->size;
-	
-	if((size == 3)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_FiveGS_TAC_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  3,  3 }	/* (SIZE(3..3)) */,
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_FiveGS_TAC_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_FiveGS_TAC = {
-	"FiveGS-TAC",
-	"FiveGS-TAC",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_FiveGS_TAC_tags_1,
-	sizeof(asn_DEF_FiveGS_TAC_tags_1)
-		/sizeof(asn_DEF_FiveGS_TAC_tags_1[0]), /* 1 */
-	asn_DEF_FiveGS_TAC_tags_1,	/* Same as above */
-	sizeof(asn_DEF_FiveGS_TAC_tags_1)
-		/sizeof(asn_DEF_FiveGS_TAC_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_FiveGS_TAC_constr_1, FiveGS_TAC_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/FiveGS-TAC.h b/3rdparty/libe2ap/FiveGS-TAC.h
deleted file mode 100644
index b8616fa..0000000
--- a/3rdparty/libe2ap/FiveGS-TAC.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_FiveGS_TAC_H_
-#define	_FiveGS_TAC_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* FiveGS-TAC */
-typedef OCTET_STRING_t	 FiveGS_TAC_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_FiveGS_TAC_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_FiveGS_TAC;
-asn_struct_free_f FiveGS_TAC_free;
-asn_struct_print_f FiveGS_TAC_print;
-asn_constr_check_f FiveGS_TAC_constraint;
-ber_type_decoder_f FiveGS_TAC_decode_ber;
-der_type_encoder_f FiveGS_TAC_encode_der;
-xer_type_decoder_f FiveGS_TAC_decode_xer;
-xer_type_encoder_f FiveGS_TAC_encode_xer;
-per_type_decoder_f FiveGS_TAC_decode_uper;
-per_type_encoder_f FiveGS_TAC_encode_uper;
-per_type_decoder_f FiveGS_TAC_decode_aper;
-per_type_encoder_f FiveGS_TAC_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _FiveGS_TAC_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/Fourframes.c b/3rdparty/libe2ap/Fourframes.c
deleted file mode 100644
index 183e2a6..0000000
--- a/3rdparty/libe2ap/Fourframes.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "Fourframes.h"
-
-int
-Fourframes_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 24)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using BIT_STRING,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_Fourframes_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  24,  24 }	/* (SIZE(24..24)) */,
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_Fourframes_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_Fourframes = {
-	"Fourframes",
-	"Fourframes",
-	&asn_OP_BIT_STRING,
-	asn_DEF_Fourframes_tags_1,
-	sizeof(asn_DEF_Fourframes_tags_1)
-		/sizeof(asn_DEF_Fourframes_tags_1[0]), /* 1 */
-	asn_DEF_Fourframes_tags_1,	/* Same as above */
-	sizeof(asn_DEF_Fourframes_tags_1)
-		/sizeof(asn_DEF_Fourframes_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_Fourframes_constr_1, Fourframes_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_BIT_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/Fourframes.h b/3rdparty/libe2ap/Fourframes.h
deleted file mode 100644
index 3ebc049..0000000
--- a/3rdparty/libe2ap/Fourframes.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_Fourframes_H_
-#define	_Fourframes_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Fourframes */
-typedef BIT_STRING_t	 Fourframes_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_Fourframes_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_Fourframes;
-asn_struct_free_f Fourframes_free;
-asn_struct_print_f Fourframes_print;
-asn_constr_check_f Fourframes_constraint;
-ber_type_decoder_f Fourframes_decode_ber;
-der_type_encoder_f Fourframes_encode_der;
-xer_type_decoder_f Fourframes_decode_xer;
-xer_type_encoder_f Fourframes_encode_xer;
-per_type_decoder_f Fourframes_decode_uper;
-per_type_encoder_f Fourframes_encode_uper;
-per_type_decoder_f Fourframes_decode_aper;
-per_type_encoder_f Fourframes_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _Fourframes_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/FreqBandIndicator.c b/3rdparty/libe2ap/FreqBandIndicator.c
deleted file mode 100644
index 123acf4..0000000
--- a/3rdparty/libe2ap/FreqBandIndicator.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "FreqBandIndicator.h"
-
-int
-FreqBandIndicator_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 1 && value <= 256)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_FreqBandIndicator_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  8,  8,  1,  256 }	/* (1..256,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_FreqBandIndicator_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_FreqBandIndicator = {
-	"FreqBandIndicator",
-	"FreqBandIndicator",
-	&asn_OP_NativeInteger,
-	asn_DEF_FreqBandIndicator_tags_1,
-	sizeof(asn_DEF_FreqBandIndicator_tags_1)
-		/sizeof(asn_DEF_FreqBandIndicator_tags_1[0]), /* 1 */
-	asn_DEF_FreqBandIndicator_tags_1,	/* Same as above */
-	sizeof(asn_DEF_FreqBandIndicator_tags_1)
-		/sizeof(asn_DEF_FreqBandIndicator_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_FreqBandIndicator_constr_1, FreqBandIndicator_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/FreqBandIndicator.h b/3rdparty/libe2ap/FreqBandIndicator.h
deleted file mode 100644
index a5b30b6..0000000
--- a/3rdparty/libe2ap/FreqBandIndicator.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_FreqBandIndicator_H_
-#define	_FreqBandIndicator_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* FreqBandIndicator */
-typedef long	 FreqBandIndicator_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_FreqBandIndicator_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_FreqBandIndicator;
-asn_struct_free_f FreqBandIndicator_free;
-asn_struct_print_f FreqBandIndicator_print;
-asn_constr_check_f FreqBandIndicator_constraint;
-ber_type_decoder_f FreqBandIndicator_decode_ber;
-der_type_encoder_f FreqBandIndicator_encode_der;
-xer_type_decoder_f FreqBandIndicator_decode_xer;
-xer_type_encoder_f FreqBandIndicator_encode_xer;
-per_type_decoder_f FreqBandIndicator_decode_uper;
-per_type_encoder_f FreqBandIndicator_encode_uper;
-per_type_decoder_f FreqBandIndicator_decode_aper;
-per_type_encoder_f FreqBandIndicator_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _FreqBandIndicator_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/FreqBandIndicatorPriority.c b/3rdparty/libe2ap/FreqBandIndicatorPriority.c
deleted file mode 100644
index 2cca5a4..0000000
--- a/3rdparty/libe2ap/FreqBandIndicatorPriority.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "FreqBandIndicatorPriority.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_FreqBandIndicatorPriority_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_FreqBandIndicatorPriority_value2enum_1[] = {
-	{ 0,	15,	"not-broadcasted" },
-	{ 1,	11,	"broadcasted" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_FreqBandIndicatorPriority_enum2value_1[] = {
-	1,	/* broadcasted(1) */
-	0	/* not-broadcasted(0) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_FreqBandIndicatorPriority_specs_1 = {
-	asn_MAP_FreqBandIndicatorPriority_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_FreqBandIndicatorPriority_enum2value_1,	/* N => "tag"; sorted by N */
-	2,	/* Number of elements in the maps */
-	3,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_FreqBandIndicatorPriority_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_FreqBandIndicatorPriority = {
-	"FreqBandIndicatorPriority",
-	"FreqBandIndicatorPriority",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_FreqBandIndicatorPriority_tags_1,
-	sizeof(asn_DEF_FreqBandIndicatorPriority_tags_1)
-		/sizeof(asn_DEF_FreqBandIndicatorPriority_tags_1[0]), /* 1 */
-	asn_DEF_FreqBandIndicatorPriority_tags_1,	/* Same as above */
-	sizeof(asn_DEF_FreqBandIndicatorPriority_tags_1)
-		/sizeof(asn_DEF_FreqBandIndicatorPriority_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_FreqBandIndicatorPriority_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_FreqBandIndicatorPriority_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/FreqBandIndicatorPriority.h b/3rdparty/libe2ap/FreqBandIndicatorPriority.h
deleted file mode 100644
index d1b711d..0000000
--- a/3rdparty/libe2ap/FreqBandIndicatorPriority.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_FreqBandIndicatorPriority_H_
-#define	_FreqBandIndicatorPriority_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum FreqBandIndicatorPriority {
-	FreqBandIndicatorPriority_not_broadcasted	= 0,
-	FreqBandIndicatorPriority_broadcasted	= 1
-	/*
-	 * Enumeration is extensible
-	 */
-} e_FreqBandIndicatorPriority;
-
-/* FreqBandIndicatorPriority */
-typedef long	 FreqBandIndicatorPriority_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_FreqBandIndicatorPriority;
-asn_struct_free_f FreqBandIndicatorPriority_free;
-asn_struct_print_f FreqBandIndicatorPriority_print;
-asn_constr_check_f FreqBandIndicatorPriority_constraint;
-ber_type_decoder_f FreqBandIndicatorPriority_decode_ber;
-der_type_encoder_f FreqBandIndicatorPriority_encode_der;
-xer_type_decoder_f FreqBandIndicatorPriority_decode_xer;
-xer_type_encoder_f FreqBandIndicatorPriority_encode_xer;
-per_type_decoder_f FreqBandIndicatorPriority_decode_uper;
-per_type_encoder_f FreqBandIndicatorPriority_encode_uper;
-per_type_decoder_f FreqBandIndicatorPriority_decode_aper;
-per_type_encoder_f FreqBandIndicatorPriority_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _FreqBandIndicatorPriority_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/FreqBandNrItem.c b/3rdparty/libe2ap/FreqBandNrItem.c
deleted file mode 100644
index 676a22d..0000000
--- a/3rdparty/libe2ap/FreqBandNrItem.c
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "FreqBandNrItem.h"
-
-#include "ProtocolExtensionContainer.h"
-#include "SupportedSULFreqBandItem.h"
-static int
-memb_freqBandIndicatorNr_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 1 && value <= 1024)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_supportedSULBandList_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	/* Determine the number of elements */
-	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
-	
-	if((size <= 32)) {
-		/* Perform validation of the inner elements */
-		return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_type_supportedSULBandList_constr_3 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 6,  6,  0,  32 }	/* (SIZE(0..32)) */,
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_freqBandIndicatorNr_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  10,  10,  1,  1024 }	/* (1..1024,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_supportedSULBandList_constr_3 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 6,  6,  0,  32 }	/* (SIZE(0..32)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_supportedSULBandList_3[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_SupportedSULFreqBandItem,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_supportedSULBandList_tags_3[] = {
-	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_supportedSULBandList_specs_3 = {
-	sizeof(struct FreqBandNrItem__supportedSULBandList),
-	offsetof(struct FreqBandNrItem__supportedSULBandList, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_supportedSULBandList_3 = {
-	"supportedSULBandList",
-	"supportedSULBandList",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_supportedSULBandList_tags_3,
-	sizeof(asn_DEF_supportedSULBandList_tags_3)
-		/sizeof(asn_DEF_supportedSULBandList_tags_3[0]) - 1, /* 1 */
-	asn_DEF_supportedSULBandList_tags_3,	/* Same as above */
-	sizeof(asn_DEF_supportedSULBandList_tags_3)
-		/sizeof(asn_DEF_supportedSULBandList_tags_3[0]), /* 2 */
-	{ 0, &asn_PER_type_supportedSULBandList_constr_3, SEQUENCE_OF_constraint },
-	asn_MBR_supportedSULBandList_3,
-	1,	/* Single element */
-	&asn_SPC_supportedSULBandList_specs_3	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_FreqBandNrItem_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct FreqBandNrItem, freqBandIndicatorNr),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_freqBandIndicatorNr_constr_2,  memb_freqBandIndicatorNr_constraint_1 },
-		0, 0, /* No default value */
-		"freqBandIndicatorNr"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct FreqBandNrItem, supportedSULBandList),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		0,
-		&asn_DEF_supportedSULBandList_3,
-		0,
-		{ 0, &asn_PER_memb_supportedSULBandList_constr_3,  memb_supportedSULBandList_constraint_1 },
-		0, 0, /* No default value */
-		"supportedSULBandList"
-		},
-	{ ATF_POINTER, 1, offsetof(struct FreqBandNrItem, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P44,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_FreqBandNrItem_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_FreqBandNrItem_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_FreqBandNrItem_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* freqBandIndicatorNr */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* supportedSULBandList */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_FreqBandNrItem_specs_1 = {
-	sizeof(struct FreqBandNrItem),
-	offsetof(struct FreqBandNrItem, _asn_ctx),
-	asn_MAP_FreqBandNrItem_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_FreqBandNrItem_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_FreqBandNrItem = {
-	"FreqBandNrItem",
-	"FreqBandNrItem",
-	&asn_OP_SEQUENCE,
-	asn_DEF_FreqBandNrItem_tags_1,
-	sizeof(asn_DEF_FreqBandNrItem_tags_1)
-		/sizeof(asn_DEF_FreqBandNrItem_tags_1[0]), /* 1 */
-	asn_DEF_FreqBandNrItem_tags_1,	/* Same as above */
-	sizeof(asn_DEF_FreqBandNrItem_tags_1)
-		/sizeof(asn_DEF_FreqBandNrItem_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_FreqBandNrItem_1,
-	3,	/* Elements count */
-	&asn_SPC_FreqBandNrItem_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/FreqBandNrItem.h b/3rdparty/libe2ap/FreqBandNrItem.h
deleted file mode 100644
index 2037dfc..0000000
--- a/3rdparty/libe2ap/FreqBandNrItem.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_FreqBandNrItem_H_
-#define	_FreqBandNrItem_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-struct SupportedSULFreqBandItem;
-
-/* FreqBandNrItem */
-typedef struct FreqBandNrItem {
-	long	 freqBandIndicatorNr;
-	struct FreqBandNrItem__supportedSULBandList {
-		A_SEQUENCE_OF(struct SupportedSULFreqBandItem) list;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} supportedSULBandList;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} FreqBandNrItem_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_FreqBandNrItem;
-extern asn_SEQUENCE_specifics_t asn_SPC_FreqBandNrItem_specs_1;
-extern asn_TYPE_member_t asn_MBR_FreqBandNrItem_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _FreqBandNrItem_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/GNB-ID.c b/3rdparty/libe2ap/GNB-ID.c
deleted file mode 100644
index bdf76b3..0000000
--- a/3rdparty/libe2ap/GNB-ID.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "GNB-ID.h"
-
-static int
-memb_gNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size >= 22 && size <= 32)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_gNB_ID_constr_2 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 4,  4,  22,  32 }	/* (SIZE(22..32)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_GNB_ID_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_GNB_ID_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct GNB_ID, choice.gNB_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_gNB_ID_constr_2,  memb_gNB_ID_constraint_1 },
-		0, 0, /* No default value */
-		"gNB-ID"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_GNB_ID_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* gNB-ID */
-};
-asn_CHOICE_specifics_t asn_SPC_GNB_ID_specs_1 = {
-	sizeof(struct GNB_ID),
-	offsetof(struct GNB_ID, _asn_ctx),
-	offsetof(struct GNB_ID, present),
-	sizeof(((struct GNB_ID *)0)->present),
-	asn_MAP_GNB_ID_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0,
-	1	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_GNB_ID = {
-	"GNB-ID",
-	"GNB-ID",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_GNB_ID_constr_1, CHOICE_constraint },
-	asn_MBR_GNB_ID_1,
-	1,	/* Elements count */
-	&asn_SPC_GNB_ID_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/GNB-ID.h b/3rdparty/libe2ap/GNB-ID.h
deleted file mode 100644
index f00d016..0000000
--- a/3rdparty/libe2ap/GNB-ID.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_GNB_ID_H_
-#define	_GNB_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum GNB_ID_PR {
-	GNB_ID_PR_NOTHING,	/* No components present */
-	GNB_ID_PR_gNB_ID
-	/* Extensions may appear below */
-	
-} GNB_ID_PR;
-
-/* GNB-ID */
-typedef struct GNB_ID {
-	GNB_ID_PR present;
-	union GNB_ID_u {
-		BIT_STRING_t	 gNB_ID;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} GNB_ID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_GNB_ID;
-extern asn_CHOICE_specifics_t asn_SPC_GNB_ID_specs_1;
-extern asn_TYPE_member_t asn_MBR_GNB_ID_1[1];
-extern asn_per_constraints_t asn_PER_type_GNB_ID_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _GNB_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/GNBOverloadInformation.c b/3rdparty/libe2ap/GNBOverloadInformation.c
deleted file mode 100644
index cc128c5..0000000
--- a/3rdparty/libe2ap/GNBOverloadInformation.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "GNBOverloadInformation.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_GNBOverloadInformation_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_GNBOverloadInformation_value2enum_1[] = {
-	{ 0,	10,	"overloaded" },
-	{ 1,	14,	"not-overloaded" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_GNBOverloadInformation_enum2value_1[] = {
-	1,	/* not-overloaded(1) */
-	0	/* overloaded(0) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_GNBOverloadInformation_specs_1 = {
-	asn_MAP_GNBOverloadInformation_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_GNBOverloadInformation_enum2value_1,	/* N => "tag"; sorted by N */
-	2,	/* Number of elements in the maps */
-	3,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_GNBOverloadInformation_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_GNBOverloadInformation = {
-	"GNBOverloadInformation",
-	"GNBOverloadInformation",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_GNBOverloadInformation_tags_1,
-	sizeof(asn_DEF_GNBOverloadInformation_tags_1)
-		/sizeof(asn_DEF_GNBOverloadInformation_tags_1[0]), /* 1 */
-	asn_DEF_GNBOverloadInformation_tags_1,	/* Same as above */
-	sizeof(asn_DEF_GNBOverloadInformation_tags_1)
-		/sizeof(asn_DEF_GNBOverloadInformation_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_GNBOverloadInformation_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_GNBOverloadInformation_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/GNBOverloadInformation.h b/3rdparty/libe2ap/GNBOverloadInformation.h
deleted file mode 100644
index d25b959..0000000
--- a/3rdparty/libe2ap/GNBOverloadInformation.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_GNBOverloadInformation_H_
-#define	_GNBOverloadInformation_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum GNBOverloadInformation {
-	GNBOverloadInformation_overloaded	= 0,
-	GNBOverloadInformation_not_overloaded	= 1
-	/*
-	 * Enumeration is extensible
-	 */
-} e_GNBOverloadInformation;
-
-/* GNBOverloadInformation */
-typedef long	 GNBOverloadInformation_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_GNBOverloadInformation;
-asn_struct_free_f GNBOverloadInformation_free;
-asn_struct_print_f GNBOverloadInformation_print;
-asn_constr_check_f GNBOverloadInformation_constraint;
-ber_type_decoder_f GNBOverloadInformation_decode_ber;
-der_type_encoder_f GNBOverloadInformation_encode_der;
-xer_type_decoder_f GNBOverloadInformation_decode_xer;
-xer_type_encoder_f GNBOverloadInformation_encode_xer;
-per_type_decoder_f GNBOverloadInformation_decode_uper;
-per_type_encoder_f GNBOverloadInformation_encode_uper;
-per_type_decoder_f GNBOverloadInformation_decode_aper;
-per_type_encoder_f GNBOverloadInformation_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _GNBOverloadInformation_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/GNBStatusIndication.c b/3rdparty/libe2ap/GNBStatusIndication.c
deleted file mode 100644
index e02df00..0000000
--- a/3rdparty/libe2ap/GNBStatusIndication.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "GNBStatusIndication.h"
-
-asn_TYPE_member_t asn_MBR_GNBStatusIndication_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct GNBStatusIndication, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P43,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_GNBStatusIndication_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_GNBStatusIndication_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_GNBStatusIndication_specs_1 = {
-	sizeof(struct GNBStatusIndication),
-	offsetof(struct GNBStatusIndication, _asn_ctx),
-	asn_MAP_GNBStatusIndication_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_GNBStatusIndication = {
-	"GNBStatusIndication",
-	"GNBStatusIndication",
-	&asn_OP_SEQUENCE,
-	asn_DEF_GNBStatusIndication_tags_1,
-	sizeof(asn_DEF_GNBStatusIndication_tags_1)
-		/sizeof(asn_DEF_GNBStatusIndication_tags_1[0]), /* 1 */
-	asn_DEF_GNBStatusIndication_tags_1,	/* Same as above */
-	sizeof(asn_DEF_GNBStatusIndication_tags_1)
-		/sizeof(asn_DEF_GNBStatusIndication_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_GNBStatusIndication_1,
-	1,	/* Elements count */
-	&asn_SPC_GNBStatusIndication_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/GNBStatusIndication.h b/3rdparty/libe2ap/GNBStatusIndication.h
deleted file mode 100644
index c855158..0000000
--- a/3rdparty/libe2ap/GNBStatusIndication.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_GNBStatusIndication_H_
-#define	_GNBStatusIndication_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* GNBStatusIndication */
-typedef struct GNBStatusIndication {
-	ProtocolIE_Container_8807P43_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} GNBStatusIndication_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_GNBStatusIndication;
-extern asn_SEQUENCE_specifics_t asn_SPC_GNBStatusIndication_specs_1;
-extern asn_TYPE_member_t asn_MBR_GNBStatusIndication_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _GNBStatusIndication_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/GU-Group-ID.c b/3rdparty/libe2ap/GU-Group-ID.c
deleted file mode 100644
index cda7fe6..0000000
--- a/3rdparty/libe2ap/GU-Group-ID.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "GU-Group-ID.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_GU_Group_ID_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct GU_Group_ID, pLMN_Identity),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_PLMN_Identity,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"pLMN-Identity"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct GU_Group_ID, mME_Group_ID),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_MME_Group_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"mME-Group-ID"
-		},
-	{ ATF_POINTER, 1, offsetof(struct GU_Group_ID, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P47,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_GU_Group_ID_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_GU_Group_ID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_GU_Group_ID_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* mME-Group-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_GU_Group_ID_specs_1 = {
-	sizeof(struct GU_Group_ID),
-	offsetof(struct GU_Group_ID, _asn_ctx),
-	asn_MAP_GU_Group_ID_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_GU_Group_ID_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_GU_Group_ID = {
-	"GU-Group-ID",
-	"GU-Group-ID",
-	&asn_OP_SEQUENCE,
-	asn_DEF_GU_Group_ID_tags_1,
-	sizeof(asn_DEF_GU_Group_ID_tags_1)
-		/sizeof(asn_DEF_GU_Group_ID_tags_1[0]), /* 1 */
-	asn_DEF_GU_Group_ID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_GU_Group_ID_tags_1)
-		/sizeof(asn_DEF_GU_Group_ID_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_GU_Group_ID_1,
-	3,	/* Elements count */
-	&asn_SPC_GU_Group_ID_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/GU-Group-ID.h b/3rdparty/libe2ap/GU-Group-ID.h
deleted file mode 100644
index 33fba90..0000000
--- a/3rdparty/libe2ap/GU-Group-ID.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_GU_Group_ID_H_
-#define	_GU_Group_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "PLMN-Identity.h"
-#include "MME-Group-ID.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* GU-Group-ID */
-typedef struct GU_Group_ID {
-	PLMN_Identity_t	 pLMN_Identity;
-	MME_Group_ID_t	 mME_Group_ID;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} GU_Group_ID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_GU_Group_ID;
-extern asn_SEQUENCE_specifics_t asn_SPC_GU_Group_ID_specs_1;
-extern asn_TYPE_member_t asn_MBR_GU_Group_ID_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _GU_Group_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/GUGroupIDList.c b/3rdparty/libe2ap/GUGroupIDList.c
deleted file mode 100644
index 4e91c41..0000000
--- a/3rdparty/libe2ap/GUGroupIDList.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "GUGroupIDList.h"
-
-#include "GU-Group-ID.h"
-static asn_per_constraints_t asn_PER_type_GUGroupIDList_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 4,  4,  1,  16 }	/* (SIZE(1..16)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_GUGroupIDList_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_GU_Group_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_GUGroupIDList_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_GUGroupIDList_specs_1 = {
-	sizeof(struct GUGroupIDList),
-	offsetof(struct GUGroupIDList, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_GUGroupIDList = {
-	"GUGroupIDList",
-	"GUGroupIDList",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_GUGroupIDList_tags_1,
-	sizeof(asn_DEF_GUGroupIDList_tags_1)
-		/sizeof(asn_DEF_GUGroupIDList_tags_1[0]), /* 1 */
-	asn_DEF_GUGroupIDList_tags_1,	/* Same as above */
-	sizeof(asn_DEF_GUGroupIDList_tags_1)
-		/sizeof(asn_DEF_GUGroupIDList_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_GUGroupIDList_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_GUGroupIDList_1,
-	1,	/* Single element */
-	&asn_SPC_GUGroupIDList_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/GUGroupIDList.h b/3rdparty/libe2ap/GUGroupIDList.h
deleted file mode 100644
index 4751f60..0000000
--- a/3rdparty/libe2ap/GUGroupIDList.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_GUGroupIDList_H_
-#define	_GUGroupIDList_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct GU_Group_ID;
-
-/* GUGroupIDList */
-typedef struct GUGroupIDList {
-	A_SEQUENCE_OF(struct GU_Group_ID) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} GUGroupIDList_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_GUGroupIDList;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _GUGroupIDList_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/GlobalENB-ID.c b/3rdparty/libe2ap/GlobalENB-ID.c
deleted file mode 100644
index 7e93f14..0000000
--- a/3rdparty/libe2ap/GlobalENB-ID.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "GlobalENB-ID.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_GlobalENB_ID_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID, pLMN_Identity),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_PLMN_Identity,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"pLMN-Identity"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID, eNB_ID),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_ENB_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"eNB-ID"
-		},
-	{ ATF_POINTER, 1, offsetof(struct GlobalENB_ID, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P45,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_GlobalENB_ID_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_GlobalENB_ID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_GlobalENB_ID_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* eNB-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_GlobalENB_ID_specs_1 = {
-	sizeof(struct GlobalENB_ID),
-	offsetof(struct GlobalENB_ID, _asn_ctx),
-	asn_MAP_GlobalENB_ID_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_GlobalENB_ID_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID = {
-	"GlobalENB-ID",
-	"GlobalENB-ID",
-	&asn_OP_SEQUENCE,
-	asn_DEF_GlobalENB_ID_tags_1,
-	sizeof(asn_DEF_GlobalENB_ID_tags_1)
-		/sizeof(asn_DEF_GlobalENB_ID_tags_1[0]), /* 1 */
-	asn_DEF_GlobalENB_ID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_GlobalENB_ID_tags_1)
-		/sizeof(asn_DEF_GlobalENB_ID_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_GlobalENB_ID_1,
-	3,	/* Elements count */
-	&asn_SPC_GlobalENB_ID_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/GlobalENB-ID.h b/3rdparty/libe2ap/GlobalENB-ID.h
deleted file mode 100644
index 0663bf6..0000000
--- a/3rdparty/libe2ap/GlobalENB-ID.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_GlobalENB_ID_H_
-#define	_GlobalENB_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "PLMN-Identity.h"
-#include "ENB-ID.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* GlobalENB-ID */
-typedef struct GlobalENB_ID {
-	PLMN_Identity_t	 pLMN_Identity;
-	ENB_ID_t	 eNB_ID;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} GlobalENB_ID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID;
-extern asn_SEQUENCE_specifics_t asn_SPC_GlobalENB_ID_specs_1;
-extern asn_TYPE_member_t asn_MBR_GlobalENB_ID_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _GlobalENB_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/GlobalGNB-ID.c b/3rdparty/libe2ap/GlobalGNB-ID.c
deleted file mode 100644
index 7dfb171..0000000
--- a/3rdparty/libe2ap/GlobalGNB-ID.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "GlobalGNB-ID.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_GlobalGNB_ID_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct GlobalGNB_ID, pLMN_Identity),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_PLMN_Identity,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"pLMN-Identity"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct GlobalGNB_ID, gNB_ID),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_GNB_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"gNB-ID"
-		},
-	{ ATF_POINTER, 1, offsetof(struct GlobalGNB_ID, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P46,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_GlobalGNB_ID_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_GlobalGNB_ID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_GlobalGNB_ID_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* gNB-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_GlobalGNB_ID_specs_1 = {
-	sizeof(struct GlobalGNB_ID),
-	offsetof(struct GlobalGNB_ID, _asn_ctx),
-	asn_MAP_GlobalGNB_ID_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_GlobalGNB_ID_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_GlobalGNB_ID = {
-	"GlobalGNB-ID",
-	"GlobalGNB-ID",
-	&asn_OP_SEQUENCE,
-	asn_DEF_GlobalGNB_ID_tags_1,
-	sizeof(asn_DEF_GlobalGNB_ID_tags_1)
-		/sizeof(asn_DEF_GlobalGNB_ID_tags_1[0]), /* 1 */
-	asn_DEF_GlobalGNB_ID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_GlobalGNB_ID_tags_1)
-		/sizeof(asn_DEF_GlobalGNB_ID_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_GlobalGNB_ID_1,
-	3,	/* Elements count */
-	&asn_SPC_GlobalGNB_ID_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/GlobalGNB-ID.h b/3rdparty/libe2ap/GlobalGNB-ID.h
deleted file mode 100644
index 093d6e1..0000000
--- a/3rdparty/libe2ap/GlobalGNB-ID.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_GlobalGNB_ID_H_
-#define	_GlobalGNB_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "PLMN-Identity.h"
-#include "GNB-ID.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* GlobalGNB-ID */
-typedef struct GlobalGNB_ID {
-	PLMN_Identity_t	 pLMN_Identity;
-	GNB_ID_t	 gNB_ID;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} GlobalGNB_ID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_GlobalGNB_ID;
-extern asn_SEQUENCE_specifics_t asn_SPC_GlobalGNB_ID_specs_1;
-extern asn_TYPE_member_t asn_MBR_GlobalGNB_ID_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _GlobalGNB_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/HWLoadIndicator.c b/3rdparty/libe2ap/HWLoadIndicator.c
deleted file mode 100644
index eb79bf4..0000000
--- a/3rdparty/libe2ap/HWLoadIndicator.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "HWLoadIndicator.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_HWLoadIndicator_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct HWLoadIndicator, dLHWLoadIndicator),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_LoadIndicator,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"dLHWLoadIndicator"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct HWLoadIndicator, uLHWLoadIndicator),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_LoadIndicator,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"uLHWLoadIndicator"
-		},
-	{ ATF_POINTER, 1, offsetof(struct HWLoadIndicator, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P48,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_HWLoadIndicator_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_HWLoadIndicator_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_HWLoadIndicator_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* dLHWLoadIndicator */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* uLHWLoadIndicator */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_HWLoadIndicator_specs_1 = {
-	sizeof(struct HWLoadIndicator),
-	offsetof(struct HWLoadIndicator, _asn_ctx),
-	asn_MAP_HWLoadIndicator_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_HWLoadIndicator_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_HWLoadIndicator = {
-	"HWLoadIndicator",
-	"HWLoadIndicator",
-	&asn_OP_SEQUENCE,
-	asn_DEF_HWLoadIndicator_tags_1,
-	sizeof(asn_DEF_HWLoadIndicator_tags_1)
-		/sizeof(asn_DEF_HWLoadIndicator_tags_1[0]), /* 1 */
-	asn_DEF_HWLoadIndicator_tags_1,	/* Same as above */
-	sizeof(asn_DEF_HWLoadIndicator_tags_1)
-		/sizeof(asn_DEF_HWLoadIndicator_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_HWLoadIndicator_1,
-	3,	/* Elements count */
-	&asn_SPC_HWLoadIndicator_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/HWLoadIndicator.h b/3rdparty/libe2ap/HWLoadIndicator.h
deleted file mode 100644
index f60b0d0..0000000
--- a/3rdparty/libe2ap/HWLoadIndicator.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_HWLoadIndicator_H_
-#define	_HWLoadIndicator_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "LoadIndicator.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* HWLoadIndicator */
-typedef struct HWLoadIndicator {
-	LoadIndicator_t	 dLHWLoadIndicator;
-	LoadIndicator_t	 uLHWLoadIndicator;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} HWLoadIndicator_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_HWLoadIndicator;
-extern asn_SEQUENCE_specifics_t asn_SPC_HWLoadIndicator_specs_1;
-extern asn_TYPE_member_t asn_MBR_HWLoadIndicator_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _HWLoadIndicator_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/InitiatingNodeType-EndcConfigUpdate.c b/3rdparty/libe2ap/InitiatingNodeType-EndcConfigUpdate.c
deleted file mode 100644
index 38f40c0..0000000
--- a/3rdparty/libe2ap/InitiatingNodeType-EndcConfigUpdate.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "InitiatingNodeType-EndcConfigUpdate.h"
-
-static asn_per_constraints_t asn_PER_type_InitiatingNodeType_EndcConfigUpdate_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_InitiatingNodeType_EndcConfigUpdate_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct InitiatingNodeType_EndcConfigUpdate, choice.init_eNB),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P37,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"init-eNB"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct InitiatingNodeType_EndcConfigUpdate, choice.init_en_gNB),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P38,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"init-en-gNB"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_InitiatingNodeType_EndcConfigUpdate_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* init-eNB */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* init-en-gNB */
-};
-static asn_CHOICE_specifics_t asn_SPC_InitiatingNodeType_EndcConfigUpdate_specs_1 = {
-	sizeof(struct InitiatingNodeType_EndcConfigUpdate),
-	offsetof(struct InitiatingNodeType_EndcConfigUpdate, _asn_ctx),
-	offsetof(struct InitiatingNodeType_EndcConfigUpdate, present),
-	sizeof(((struct InitiatingNodeType_EndcConfigUpdate *)0)->present),
-	asn_MAP_InitiatingNodeType_EndcConfigUpdate_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0,
-	2	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_InitiatingNodeType_EndcConfigUpdate = {
-	"InitiatingNodeType-EndcConfigUpdate",
-	"InitiatingNodeType-EndcConfigUpdate",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_InitiatingNodeType_EndcConfigUpdate_constr_1, CHOICE_constraint },
-	asn_MBR_InitiatingNodeType_EndcConfigUpdate_1,
-	2,	/* Elements count */
-	&asn_SPC_InitiatingNodeType_EndcConfigUpdate_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/InitiatingNodeType-EndcConfigUpdate.h b/3rdparty/libe2ap/InitiatingNodeType-EndcConfigUpdate.h
deleted file mode 100644
index 00ef4ff..0000000
--- a/3rdparty/libe2ap/InitiatingNodeType-EndcConfigUpdate.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_InitiatingNodeType_EndcConfigUpdate_H_
-#define	_InitiatingNodeType_EndcConfigUpdate_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum InitiatingNodeType_EndcConfigUpdate_PR {
-	InitiatingNodeType_EndcConfigUpdate_PR_NOTHING,	/* No components present */
-	InitiatingNodeType_EndcConfigUpdate_PR_init_eNB,
-	InitiatingNodeType_EndcConfigUpdate_PR_init_en_gNB
-	/* Extensions may appear below */
-	
-} InitiatingNodeType_EndcConfigUpdate_PR;
-
-/* InitiatingNodeType-EndcConfigUpdate */
-typedef struct InitiatingNodeType_EndcConfigUpdate {
-	InitiatingNodeType_EndcConfigUpdate_PR present;
-	union InitiatingNodeType_EndcConfigUpdate_u {
-		ProtocolIE_Container_8807P37_t	 init_eNB;
-		ProtocolIE_Container_8807P38_t	 init_en_gNB;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} InitiatingNodeType_EndcConfigUpdate_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_InitiatingNodeType_EndcConfigUpdate;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _InitiatingNodeType_EndcConfigUpdate_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/InitiatingNodeType-EndcX2Setup.c b/3rdparty/libe2ap/InitiatingNodeType-EndcX2Setup.c
deleted file mode 100644
index 421481a..0000000
--- a/3rdparty/libe2ap/InitiatingNodeType-EndcX2Setup.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "InitiatingNodeType-EndcX2Setup.h"
-
-static asn_per_constraints_t asn_PER_type_InitiatingNodeType_EndcX2Setup_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_InitiatingNodeType_EndcX2Setup_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct InitiatingNodeType_EndcX2Setup, choice.init_eNB),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P30,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"init-eNB"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct InitiatingNodeType_EndcX2Setup, choice.init_en_gNB),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P31,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"init-en-gNB"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_InitiatingNodeType_EndcX2Setup_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* init-eNB */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* init-en-gNB */
-};
-static asn_CHOICE_specifics_t asn_SPC_InitiatingNodeType_EndcX2Setup_specs_1 = {
-	sizeof(struct InitiatingNodeType_EndcX2Setup),
-	offsetof(struct InitiatingNodeType_EndcX2Setup, _asn_ctx),
-	offsetof(struct InitiatingNodeType_EndcX2Setup, present),
-	sizeof(((struct InitiatingNodeType_EndcX2Setup *)0)->present),
-	asn_MAP_InitiatingNodeType_EndcX2Setup_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0,
-	2	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_InitiatingNodeType_EndcX2Setup = {
-	"InitiatingNodeType-EndcX2Setup",
-	"InitiatingNodeType-EndcX2Setup",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_InitiatingNodeType_EndcX2Setup_constr_1, CHOICE_constraint },
-	asn_MBR_InitiatingNodeType_EndcX2Setup_1,
-	2,	/* Elements count */
-	&asn_SPC_InitiatingNodeType_EndcX2Setup_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/InitiatingNodeType-EndcX2Setup.h b/3rdparty/libe2ap/InitiatingNodeType-EndcX2Setup.h
deleted file mode 100644
index 86bc1b5..0000000
--- a/3rdparty/libe2ap/InitiatingNodeType-EndcX2Setup.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_InitiatingNodeType_EndcX2Setup_H_
-#define	_InitiatingNodeType_EndcX2Setup_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum InitiatingNodeType_EndcX2Setup_PR {
-	InitiatingNodeType_EndcX2Setup_PR_NOTHING,	/* No components present */
-	InitiatingNodeType_EndcX2Setup_PR_init_eNB,
-	InitiatingNodeType_EndcX2Setup_PR_init_en_gNB
-	/* Extensions may appear below */
-	
-} InitiatingNodeType_EndcX2Setup_PR;
-
-/* InitiatingNodeType-EndcX2Setup */
-typedef struct InitiatingNodeType_EndcX2Setup {
-	InitiatingNodeType_EndcX2Setup_PR present;
-	union InitiatingNodeType_EndcX2Setup_u {
-		ProtocolIE_Container_8807P30_t	 init_eNB;
-		ProtocolIE_Container_8807P31_t	 init_en_gNB;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} InitiatingNodeType_EndcX2Setup_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_InitiatingNodeType_EndcX2Setup;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _InitiatingNodeType_EndcX2Setup_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/Interface-ID.c b/3rdparty/libe2ap/Interface-ID.c
deleted file mode 100644
index 854fead..0000000
--- a/3rdparty/libe2ap/Interface-ID.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "Interface-ID.h"
-
-asn_per_constraints_t asn_PER_type_Interface_ID_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_Interface_ID_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct Interface_ID, choice.global_eNB_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_GlobalENB_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"global-eNB-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct Interface_ID, choice.global_gNB_ID),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_GlobalGNB_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"global-gNB-ID"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_Interface_ID_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* global-eNB-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* global-gNB-ID */
-};
-asn_CHOICE_specifics_t asn_SPC_Interface_ID_specs_1 = {
-	sizeof(struct Interface_ID),
-	offsetof(struct Interface_ID, _asn_ctx),
-	offsetof(struct Interface_ID, present),
-	sizeof(((struct Interface_ID *)0)->present),
-	asn_MAP_Interface_ID_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0,
-	2	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_Interface_ID = {
-	"Interface-ID",
-	"Interface-ID",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_Interface_ID_constr_1, CHOICE_constraint },
-	asn_MBR_Interface_ID_1,
-	2,	/* Elements count */
-	&asn_SPC_Interface_ID_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/Interface-ID.h b/3rdparty/libe2ap/Interface-ID.h
deleted file mode 100644
index 211438b..0000000
--- a/3rdparty/libe2ap/Interface-ID.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_Interface_ID_H_
-#define	_Interface_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "GlobalENB-ID.h"
-#include "GlobalGNB-ID.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum Interface_ID_PR {
-	Interface_ID_PR_NOTHING,	/* No components present */
-	Interface_ID_PR_global_eNB_ID,
-	Interface_ID_PR_global_gNB_ID
-	/* Extensions may appear below */
-	
-} Interface_ID_PR;
-
-/* Interface-ID */
-typedef struct Interface_ID {
-	Interface_ID_PR present;
-	union Interface_ID_u {
-		GlobalENB_ID_t	 global_eNB_ID;
-		GlobalGNB_ID_t	 global_gNB_ID;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} Interface_ID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_Interface_ID;
-extern asn_CHOICE_specifics_t asn_SPC_Interface_ID_specs_1;
-extern asn_TYPE_member_t asn_MBR_Interface_ID_1[2];
-extern asn_per_constraints_t asn_PER_type_Interface_ID_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _Interface_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/InterfaceDirection.c b/3rdparty/libe2ap/InterfaceDirection.c
deleted file mode 100644
index af3bbfe..0000000
--- a/3rdparty/libe2ap/InterfaceDirection.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "InterfaceDirection.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_InterfaceDirection_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_InterfaceDirection_value2enum_1[] = {
-	{ 0,	8,	"incoming" },
-	{ 1,	8,	"outgoing" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_InterfaceDirection_enum2value_1[] = {
-	0,	/* incoming(0) */
-	1	/* outgoing(1) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_InterfaceDirection_specs_1 = {
-	asn_MAP_InterfaceDirection_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_InterfaceDirection_enum2value_1,	/* N => "tag"; sorted by N */
-	2,	/* Number of elements in the maps */
-	3,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_InterfaceDirection_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_InterfaceDirection = {
-	"InterfaceDirection",
-	"InterfaceDirection",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_InterfaceDirection_tags_1,
-	sizeof(asn_DEF_InterfaceDirection_tags_1)
-		/sizeof(asn_DEF_InterfaceDirection_tags_1[0]), /* 1 */
-	asn_DEF_InterfaceDirection_tags_1,	/* Same as above */
-	sizeof(asn_DEF_InterfaceDirection_tags_1)
-		/sizeof(asn_DEF_InterfaceDirection_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_InterfaceDirection_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_InterfaceDirection_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/InterfaceDirection.h b/3rdparty/libe2ap/InterfaceDirection.h
deleted file mode 100644
index ab26d6c..0000000
--- a/3rdparty/libe2ap/InterfaceDirection.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_InterfaceDirection_H_
-#define	_InterfaceDirection_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum InterfaceDirection {
-	InterfaceDirection_incoming	= 0,
-	InterfaceDirection_outgoing	= 1
-	/*
-	 * Enumeration is extensible
-	 */
-} e_InterfaceDirection;
-
-/* InterfaceDirection */
-typedef long	 InterfaceDirection_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_InterfaceDirection_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_InterfaceDirection;
-extern const asn_INTEGER_specifics_t asn_SPC_InterfaceDirection_specs_1;
-asn_struct_free_f InterfaceDirection_free;
-asn_struct_print_f InterfaceDirection_print;
-asn_constr_check_f InterfaceDirection_constraint;
-ber_type_decoder_f InterfaceDirection_decode_ber;
-der_type_encoder_f InterfaceDirection_encode_der;
-xer_type_decoder_f InterfaceDirection_decode_xer;
-xer_type_encoder_f InterfaceDirection_encode_xer;
-per_type_decoder_f InterfaceDirection_decode_uper;
-per_type_encoder_f InterfaceDirection_encode_uper;
-per_type_decoder_f InterfaceDirection_decode_aper;
-per_type_encoder_f InterfaceDirection_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _InterfaceDirection_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/InterfaceMessage.c b/3rdparty/libe2ap/InterfaceMessage.c
deleted file mode 100644
index 1f16f17..0000000
--- a/3rdparty/libe2ap/InterfaceMessage.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "InterfaceMessage.h"
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-static const ber_tlv_tag_t asn_DEF_InterfaceMessage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_InterfaceMessage = {
-	"InterfaceMessage",
-	"InterfaceMessage",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_InterfaceMessage_tags_1,
-	sizeof(asn_DEF_InterfaceMessage_tags_1)
-		/sizeof(asn_DEF_InterfaceMessage_tags_1[0]), /* 1 */
-	asn_DEF_InterfaceMessage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_InterfaceMessage_tags_1)
-		/sizeof(asn_DEF_InterfaceMessage_tags_1[0]), /* 1 */
-	{ 0, 0, OCTET_STRING_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/InterfaceMessage.h b/3rdparty/libe2ap/InterfaceMessage.h
deleted file mode 100644
index 87e3280..0000000
--- a/3rdparty/libe2ap/InterfaceMessage.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_InterfaceMessage_H_
-#define	_InterfaceMessage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* InterfaceMessage */
-typedef OCTET_STRING_t	 InterfaceMessage_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_InterfaceMessage;
-asn_struct_free_f InterfaceMessage_free;
-asn_struct_print_f InterfaceMessage_print;
-asn_constr_check_f InterfaceMessage_constraint;
-ber_type_decoder_f InterfaceMessage_decode_ber;
-der_type_encoder_f InterfaceMessage_encode_der;
-xer_type_decoder_f InterfaceMessage_decode_xer;
-xer_type_encoder_f InterfaceMessage_encode_xer;
-per_type_decoder_f InterfaceMessage_decode_uper;
-per_type_encoder_f InterfaceMessage_encode_uper;
-per_type_decoder_f InterfaceMessage_decode_aper;
-per_type_encoder_f InterfaceMessage_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _InterfaceMessage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/InterfaceMessageType.c b/3rdparty/libe2ap/InterfaceMessageType.c
deleted file mode 100644
index e7fc5ba..0000000
--- a/3rdparty/libe2ap/InterfaceMessageType.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "InterfaceMessageType.h"
-
-asn_TYPE_member_t asn_MBR_InterfaceMessageType_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct InterfaceMessageType, procedureCode),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProcedureCode,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"procedureCode"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct InterfaceMessageType, typeOfMessage),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_TypeOfMessage,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"typeOfMessage"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_InterfaceMessageType_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_InterfaceMessageType_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* typeOfMessage */
-};
-asn_SEQUENCE_specifics_t asn_SPC_InterfaceMessageType_specs_1 = {
-	sizeof(struct InterfaceMessageType),
-	offsetof(struct InterfaceMessageType, _asn_ctx),
-	asn_MAP_InterfaceMessageType_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_InterfaceMessageType = {
-	"InterfaceMessageType",
-	"InterfaceMessageType",
-	&asn_OP_SEQUENCE,
-	asn_DEF_InterfaceMessageType_tags_1,
-	sizeof(asn_DEF_InterfaceMessageType_tags_1)
-		/sizeof(asn_DEF_InterfaceMessageType_tags_1[0]), /* 1 */
-	asn_DEF_InterfaceMessageType_tags_1,	/* Same as above */
-	sizeof(asn_DEF_InterfaceMessageType_tags_1)
-		/sizeof(asn_DEF_InterfaceMessageType_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_InterfaceMessageType_1,
-	2,	/* Elements count */
-	&asn_SPC_InterfaceMessageType_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/InterfaceMessageType.h b/3rdparty/libe2ap/InterfaceMessageType.h
deleted file mode 100644
index 0559685..0000000
--- a/3rdparty/libe2ap/InterfaceMessageType.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_InterfaceMessageType_H_
-#define	_InterfaceMessageType_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProcedureCode.h"
-#include "TypeOfMessage.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* InterfaceMessageType */
-typedef struct InterfaceMessageType {
-	ProcedureCode_t	 procedureCode;
-	TypeOfMessage_t	 typeOfMessage;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} InterfaceMessageType_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_InterfaceMessageType;
-extern asn_SEQUENCE_specifics_t asn_SPC_InterfaceMessageType_specs_1;
-extern asn_TYPE_member_t asn_MBR_InterfaceMessageType_1[2];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _InterfaceMessageType_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/InterfaceProtocolIE-ID.c b/3rdparty/libe2ap/InterfaceProtocolIE-ID.c
deleted file mode 100644
index 86287ef..0000000
--- a/3rdparty/libe2ap/InterfaceProtocolIE-ID.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "InterfaceProtocolIE-ID.h"
-
-int
-InterfaceProtocolIE_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using ProtocolIE_ID,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_InterfaceProtocolIE_ID_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_InterfaceProtocolIE_ID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_InterfaceProtocolIE_ID = {
-	"InterfaceProtocolIE-ID",
-	"InterfaceProtocolIE-ID",
-	&asn_OP_NativeInteger,
-	asn_DEF_InterfaceProtocolIE_ID_tags_1,
-	sizeof(asn_DEF_InterfaceProtocolIE_ID_tags_1)
-		/sizeof(asn_DEF_InterfaceProtocolIE_ID_tags_1[0]), /* 1 */
-	asn_DEF_InterfaceProtocolIE_ID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_InterfaceProtocolIE_ID_tags_1)
-		/sizeof(asn_DEF_InterfaceProtocolIE_ID_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_InterfaceProtocolIE_ID_constr_1, InterfaceProtocolIE_ID_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/InterfaceProtocolIE-ID.h b/3rdparty/libe2ap/InterfaceProtocolIE-ID.h
deleted file mode 100644
index 45370d1..0000000
--- a/3rdparty/libe2ap/InterfaceProtocolIE-ID.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_InterfaceProtocolIE_ID_H_
-#define	_InterfaceProtocolIE_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-ID.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* InterfaceProtocolIE-ID */
-typedef ProtocolIE_ID_t	 InterfaceProtocolIE_ID_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_InterfaceProtocolIE_ID_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_InterfaceProtocolIE_ID;
-asn_struct_free_f InterfaceProtocolIE_ID_free;
-asn_struct_print_f InterfaceProtocolIE_ID_print;
-asn_constr_check_f InterfaceProtocolIE_ID_constraint;
-ber_type_decoder_f InterfaceProtocolIE_ID_decode_ber;
-der_type_encoder_f InterfaceProtocolIE_ID_encode_der;
-xer_type_decoder_f InterfaceProtocolIE_ID_decode_xer;
-xer_type_encoder_f InterfaceProtocolIE_ID_encode_xer;
-per_type_decoder_f InterfaceProtocolIE_ID_decode_uper;
-per_type_encoder_f InterfaceProtocolIE_ID_encode_uper;
-per_type_decoder_f InterfaceProtocolIE_ID_decode_aper;
-per_type_encoder_f InterfaceProtocolIE_ID_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _InterfaceProtocolIE_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/InterfaceProtocolIE-Item.c b/3rdparty/libe2ap/InterfaceProtocolIE-Item.c
deleted file mode 100644
index 8660263..0000000
--- a/3rdparty/libe2ap/InterfaceProtocolIE-Item.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "InterfaceProtocolIE-Item.h"
-
-asn_TYPE_member_t asn_MBR_InterfaceProtocolIE_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct InterfaceProtocolIE_Item, interfaceProtocolIE_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_InterfaceProtocolIE_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"interfaceProtocolIE-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct InterfaceProtocolIE_Item, interfaceProtocolIE_Test),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_InterfaceProtocolIE_Test,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"interfaceProtocolIE-Test"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct InterfaceProtocolIE_Item, interfaceProtocolIE_Value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_InterfaceProtocolIE_Value,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"interfaceProtocolIE-Value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_InterfaceProtocolIE_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_InterfaceProtocolIE_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* interfaceProtocolIE-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* interfaceProtocolIE-Test */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* interfaceProtocolIE-Value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_InterfaceProtocolIE_Item_specs_1 = {
-	sizeof(struct InterfaceProtocolIE_Item),
-	offsetof(struct InterfaceProtocolIE_Item, _asn_ctx),
-	asn_MAP_InterfaceProtocolIE_Item_tag2el_1,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_InterfaceProtocolIE_Item = {
-	"InterfaceProtocolIE-Item",
-	"InterfaceProtocolIE-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_InterfaceProtocolIE_Item_tags_1,
-	sizeof(asn_DEF_InterfaceProtocolIE_Item_tags_1)
-		/sizeof(asn_DEF_InterfaceProtocolIE_Item_tags_1[0]), /* 1 */
-	asn_DEF_InterfaceProtocolIE_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_InterfaceProtocolIE_Item_tags_1)
-		/sizeof(asn_DEF_InterfaceProtocolIE_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_InterfaceProtocolIE_Item_1,
-	3,	/* Elements count */
-	&asn_SPC_InterfaceProtocolIE_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/InterfaceProtocolIE-Item.h b/3rdparty/libe2ap/InterfaceProtocolIE-Item.h
deleted file mode 100644
index f796225..0000000
--- a/3rdparty/libe2ap/InterfaceProtocolIE-Item.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_InterfaceProtocolIE_Item_H_
-#define	_InterfaceProtocolIE_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "InterfaceProtocolIE-ID.h"
-#include "InterfaceProtocolIE-Test.h"
-#include "InterfaceProtocolIE-Value.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* InterfaceProtocolIE-Item */
-typedef struct InterfaceProtocolIE_Item {
-	InterfaceProtocolIE_ID_t	 interfaceProtocolIE_ID;
-	InterfaceProtocolIE_Test_t	 interfaceProtocolIE_Test;
-	InterfaceProtocolIE_Value_t	 interfaceProtocolIE_Value;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} InterfaceProtocolIE_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_InterfaceProtocolIE_Item;
-extern asn_SEQUENCE_specifics_t asn_SPC_InterfaceProtocolIE_Item_specs_1;
-extern asn_TYPE_member_t asn_MBR_InterfaceProtocolIE_Item_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _InterfaceProtocolIE_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/InterfaceProtocolIE-Test.c b/3rdparty/libe2ap/InterfaceProtocolIE-Test.c
deleted file mode 100644
index bf33cdf..0000000
--- a/3rdparty/libe2ap/InterfaceProtocolIE-Test.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "InterfaceProtocolIE-Test.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_InterfaceProtocolIE_Test_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  4 }	/* (0..4,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_InterfaceProtocolIE_Test_value2enum_1[] = {
-	{ 0,	5,	"equal" },
-	{ 1,	11,	"greaterthan" },
-	{ 2,	8,	"lessthan" },
-	{ 3,	8,	"contains" },
-	{ 4,	7,	"present" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_InterfaceProtocolIE_Test_enum2value_1[] = {
-	3,	/* contains(3) */
-	0,	/* equal(0) */
-	1,	/* greaterthan(1) */
-	2,	/* lessthan(2) */
-	4	/* present(4) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_InterfaceProtocolIE_Test_specs_1 = {
-	asn_MAP_InterfaceProtocolIE_Test_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_InterfaceProtocolIE_Test_enum2value_1,	/* N => "tag"; sorted by N */
-	5,	/* Number of elements in the maps */
-	6,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_InterfaceProtocolIE_Test_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_InterfaceProtocolIE_Test = {
-	"InterfaceProtocolIE-Test",
-	"InterfaceProtocolIE-Test",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_InterfaceProtocolIE_Test_tags_1,
-	sizeof(asn_DEF_InterfaceProtocolIE_Test_tags_1)
-		/sizeof(asn_DEF_InterfaceProtocolIE_Test_tags_1[0]), /* 1 */
-	asn_DEF_InterfaceProtocolIE_Test_tags_1,	/* Same as above */
-	sizeof(asn_DEF_InterfaceProtocolIE_Test_tags_1)
-		/sizeof(asn_DEF_InterfaceProtocolIE_Test_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_InterfaceProtocolIE_Test_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_InterfaceProtocolIE_Test_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/InterfaceProtocolIE-Test.h b/3rdparty/libe2ap/InterfaceProtocolIE-Test.h
deleted file mode 100644
index 84fc051..0000000
--- a/3rdparty/libe2ap/InterfaceProtocolIE-Test.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_InterfaceProtocolIE_Test_H_
-#define	_InterfaceProtocolIE_Test_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum InterfaceProtocolIE_Test {
-	InterfaceProtocolIE_Test_equal	= 0,
-	InterfaceProtocolIE_Test_greaterthan	= 1,
-	InterfaceProtocolIE_Test_lessthan	= 2,
-	InterfaceProtocolIE_Test_contains	= 3,
-	InterfaceProtocolIE_Test_present	= 4
-	/*
-	 * Enumeration is extensible
-	 */
-} e_InterfaceProtocolIE_Test;
-
-/* InterfaceProtocolIE-Test */
-typedef long	 InterfaceProtocolIE_Test_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_InterfaceProtocolIE_Test_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_InterfaceProtocolIE_Test;
-extern const asn_INTEGER_specifics_t asn_SPC_InterfaceProtocolIE_Test_specs_1;
-asn_struct_free_f InterfaceProtocolIE_Test_free;
-asn_struct_print_f InterfaceProtocolIE_Test_print;
-asn_constr_check_f InterfaceProtocolIE_Test_constraint;
-ber_type_decoder_f InterfaceProtocolIE_Test_decode_ber;
-der_type_encoder_f InterfaceProtocolIE_Test_encode_der;
-xer_type_decoder_f InterfaceProtocolIE_Test_decode_xer;
-xer_type_encoder_f InterfaceProtocolIE_Test_encode_xer;
-per_type_decoder_f InterfaceProtocolIE_Test_decode_uper;
-per_type_encoder_f InterfaceProtocolIE_Test_encode_uper;
-per_type_decoder_f InterfaceProtocolIE_Test_decode_aper;
-per_type_encoder_f InterfaceProtocolIE_Test_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _InterfaceProtocolIE_Test_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/InterfaceProtocolIE-Value.c b/3rdparty/libe2ap/InterfaceProtocolIE-Value.c
deleted file mode 100644
index fc9c4d3..0000000
--- a/3rdparty/libe2ap/InterfaceProtocolIE-Value.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "InterfaceProtocolIE-Value.h"
-
-asn_per_constraints_t asn_PER_type_InterfaceProtocolIE_Value_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  4 }	/* (0..4,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_InterfaceProtocolIE_Value_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct InterfaceProtocolIE_Value, choice.valueInt),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"valueInt"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct InterfaceProtocolIE_Value, choice.valueEnum),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"valueEnum"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct InterfaceProtocolIE_Value, choice.valueBool),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BOOLEAN,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"valueBool"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct InterfaceProtocolIE_Value, choice.valueBitS),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"valueBitS"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct InterfaceProtocolIE_Value, choice.valueOctS),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_OCTET_STRING,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"valueOctS"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_InterfaceProtocolIE_Value_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* valueInt */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* valueEnum */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* valueBool */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* valueBitS */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* valueOctS */
-};
-asn_CHOICE_specifics_t asn_SPC_InterfaceProtocolIE_Value_specs_1 = {
-	sizeof(struct InterfaceProtocolIE_Value),
-	offsetof(struct InterfaceProtocolIE_Value, _asn_ctx),
-	offsetof(struct InterfaceProtocolIE_Value, present),
-	sizeof(((struct InterfaceProtocolIE_Value *)0)->present),
-	asn_MAP_InterfaceProtocolIE_Value_tag2el_1,
-	5,	/* Count of tags in the map */
-	0, 0,
-	5	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_InterfaceProtocolIE_Value = {
-	"InterfaceProtocolIE-Value",
-	"InterfaceProtocolIE-Value",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_InterfaceProtocolIE_Value_constr_1, CHOICE_constraint },
-	asn_MBR_InterfaceProtocolIE_Value_1,
-	5,	/* Elements count */
-	&asn_SPC_InterfaceProtocolIE_Value_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/InterfaceProtocolIE-Value.h b/3rdparty/libe2ap/InterfaceProtocolIE-Value.h
deleted file mode 100644
index 98c5488..0000000
--- a/3rdparty/libe2ap/InterfaceProtocolIE-Value.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_InterfaceProtocolIE_Value_H_
-#define	_InterfaceProtocolIE_Value_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "BOOLEAN.h"
-#include "BIT_STRING.h"
-#include "OCTET_STRING.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum InterfaceProtocolIE_Value_PR {
-	InterfaceProtocolIE_Value_PR_NOTHING,	/* No components present */
-	InterfaceProtocolIE_Value_PR_valueInt,
-	InterfaceProtocolIE_Value_PR_valueEnum,
-	InterfaceProtocolIE_Value_PR_valueBool,
-	InterfaceProtocolIE_Value_PR_valueBitS,
-	InterfaceProtocolIE_Value_PR_valueOctS
-	/* Extensions may appear below */
-	
-} InterfaceProtocolIE_Value_PR;
-
-/* InterfaceProtocolIE-Value */
-typedef struct InterfaceProtocolIE_Value {
-	InterfaceProtocolIE_Value_PR present;
-	union InterfaceProtocolIE_Value_u {
-		long	 valueInt;
-		long	 valueEnum;
-		BOOLEAN_t	 valueBool;
-		BIT_STRING_t	 valueBitS;
-		OCTET_STRING_t	 valueOctS;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} InterfaceProtocolIE_Value_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_InterfaceProtocolIE_Value;
-extern asn_CHOICE_specifics_t asn_SPC_InterfaceProtocolIE_Value_specs_1;
-extern asn_TYPE_member_t asn_MBR_InterfaceProtocolIE_Value_1[5];
-extern asn_per_constraints_t asn_PER_type_InterfaceProtocolIE_Value_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _InterfaceProtocolIE_Value_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/InvokeIndication.c b/3rdparty/libe2ap/InvokeIndication.c
deleted file mode 100644
index 532de86..0000000
--- a/3rdparty/libe2ap/InvokeIndication.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "InvokeIndication.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_InvokeIndication_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_InvokeIndication_value2enum_1[] = {
-	{ 0,	15,	"abs-information" },
-	{ 1,	23,	"naics-information-start" },
-	{ 2,	22,	"naics-information-stop" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_InvokeIndication_enum2value_1[] = {
-	0,	/* abs-information(0) */
-	1,	/* naics-information-start(1) */
-	2	/* naics-information-stop(2) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_InvokeIndication_specs_1 = {
-	asn_MAP_InvokeIndication_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_InvokeIndication_enum2value_1,	/* N => "tag"; sorted by N */
-	3,	/* Number of elements in the maps */
-	2,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_InvokeIndication_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_InvokeIndication = {
-	"InvokeIndication",
-	"InvokeIndication",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_InvokeIndication_tags_1,
-	sizeof(asn_DEF_InvokeIndication_tags_1)
-		/sizeof(asn_DEF_InvokeIndication_tags_1[0]), /* 1 */
-	asn_DEF_InvokeIndication_tags_1,	/* Same as above */
-	sizeof(asn_DEF_InvokeIndication_tags_1)
-		/sizeof(asn_DEF_InvokeIndication_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_InvokeIndication_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_InvokeIndication_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/InvokeIndication.h b/3rdparty/libe2ap/InvokeIndication.h
deleted file mode 100644
index 26384a9..0000000
--- a/3rdparty/libe2ap/InvokeIndication.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_InvokeIndication_H_
-#define	_InvokeIndication_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum InvokeIndication {
-	InvokeIndication_abs_information	= 0,
-	/*
-	 * Enumeration is extensible
-	 */
-	InvokeIndication_naics_information_start	= 1,
-	InvokeIndication_naics_information_stop	= 2
-} e_InvokeIndication;
-
-/* InvokeIndication */
-typedef long	 InvokeIndication_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_InvokeIndication;
-asn_struct_free_f InvokeIndication_free;
-asn_struct_print_f InvokeIndication_print;
-asn_constr_check_f InvokeIndication_constraint;
-ber_type_decoder_f InvokeIndication_decode_ber;
-der_type_encoder_f InvokeIndication_encode_der;
-xer_type_decoder_f InvokeIndication_decode_xer;
-xer_type_encoder_f InvokeIndication_encode_xer;
-per_type_decoder_f InvokeIndication_decode_uper;
-per_type_encoder_f InvokeIndication_encode_uper;
-per_type_decoder_f InvokeIndication_decode_aper;
-per_type_encoder_f InvokeIndication_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _InvokeIndication_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/LHN-ID.c b/3rdparty/libe2ap/LHN-ID.c
deleted file mode 100644
index 9b65220..0000000
--- a/3rdparty/libe2ap/LHN-ID.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "LHN-ID.h"
-
-int
-LHN_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	size = st->size;
-	
-	if((size >= 32 && size <= 256)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_LHN_ID_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  32,  256 }	/* (SIZE(32..256)) */,
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_LHN_ID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_LHN_ID = {
-	"LHN-ID",
-	"LHN-ID",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_LHN_ID_tags_1,
-	sizeof(asn_DEF_LHN_ID_tags_1)
-		/sizeof(asn_DEF_LHN_ID_tags_1[0]), /* 1 */
-	asn_DEF_LHN_ID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_LHN_ID_tags_1)
-		/sizeof(asn_DEF_LHN_ID_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_LHN_ID_constr_1, LHN_ID_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/LHN-ID.h b/3rdparty/libe2ap/LHN-ID.h
deleted file mode 100644
index f9feb26..0000000
--- a/3rdparty/libe2ap/LHN-ID.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_LHN_ID_H_
-#define	_LHN_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* LHN-ID */
-typedef OCTET_STRING_t	 LHN_ID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_LHN_ID;
-asn_struct_free_f LHN_ID_free;
-asn_struct_print_f LHN_ID_print;
-asn_constr_check_f LHN_ID_constraint;
-ber_type_decoder_f LHN_ID_decode_ber;
-der_type_encoder_f LHN_ID_encode_der;
-xer_type_decoder_f LHN_ID_decode_xer;
-xer_type_encoder_f LHN_ID_encode_xer;
-per_type_decoder_f LHN_ID_decode_uper;
-per_type_encoder_f LHN_ID_encode_uper;
-per_type_decoder_f LHN_ID_decode_aper;
-per_type_encoder_f LHN_ID_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _LHN_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/Limited-list.c b/3rdparty/libe2ap/Limited-list.c
deleted file mode 100644
index cff14ce..0000000
--- a/3rdparty/libe2ap/Limited-list.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "Limited-list.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_per_constraints_t asn_PER_type_Limited_list_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 14,  14,  1,  16384 }	/* (SIZE(1..16384)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_Member_2[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct Limited_list__Member, nrCellID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRCGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nrCellID"
-		},
-	{ ATF_POINTER, 1, offsetof(struct Limited_list__Member, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P17,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_Member_oms_2[] = { 1 };
-static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nrCellID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
-	sizeof(struct Limited_list__Member),
-	offsetof(struct Limited_list__Member, _asn_ctx),
-	asn_MAP_Member_tag2el_2,
-	2,	/* Count of tags in the map */
-	asn_MAP_Member_oms_2,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	2,	/* First extension addition */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_Member_2 = {
-	"SEQUENCE",
-	"SEQUENCE",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Member_tags_2,
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	asn_DEF_Member_tags_2,	/* Same as above */
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Member_2,
-	2,	/* Elements count */
-	&asn_SPC_Member_specs_2	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_Limited_list_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Member_2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_Limited_list_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_Limited_list_specs_1 = {
-	sizeof(struct Limited_list),
-	offsetof(struct Limited_list, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_Limited_list = {
-	"Limited-list",
-	"Limited-list",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_Limited_list_tags_1,
-	sizeof(asn_DEF_Limited_list_tags_1)
-		/sizeof(asn_DEF_Limited_list_tags_1[0]), /* 1 */
-	asn_DEF_Limited_list_tags_1,	/* Same as above */
-	sizeof(asn_DEF_Limited_list_tags_1)
-		/sizeof(asn_DEF_Limited_list_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_Limited_list_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_Limited_list_1,
-	1,	/* Single element */
-	&asn_SPC_Limited_list_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/Limited-list.h b/3rdparty/libe2ap/Limited-list.h
deleted file mode 100644
index f740ff5..0000000
--- a/3rdparty/libe2ap/Limited-list.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_Limited_list_H_
-#define	_Limited_list_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "NRCGI.h"
-#include "constr_SEQUENCE.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* Forward definitions */
-typedef struct Limited_list__Member {
-	NRCGI_t	 nrCellID;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} Limited_list__Member;
-
-/* Limited-list */
-typedef struct Limited_list {
-	A_SEQUENCE_OF(Limited_list__Member) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} Limited_list_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_Limited_list;
-extern asn_SET_OF_specifics_t asn_SPC_Limited_list_specs_1;
-extern asn_TYPE_member_t asn_MBR_Limited_list_1[1];
-extern asn_per_constraints_t asn_PER_type_Limited_list_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _Limited_list_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/LoadIndicator.c b/3rdparty/libe2ap/LoadIndicator.c
deleted file mode 100644
index 540e5fa..0000000
--- a/3rdparty/libe2ap/LoadIndicator.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "LoadIndicator.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_LoadIndicator_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  3 }	/* (0..3,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_LoadIndicator_value2enum_1[] = {
-	{ 0,	7,	"lowLoad" },
-	{ 1,	10,	"mediumLoad" },
-	{ 2,	8,	"highLoad" },
-	{ 3,	8,	"overLoad" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_LoadIndicator_enum2value_1[] = {
-	2,	/* highLoad(2) */
-	0,	/* lowLoad(0) */
-	1,	/* mediumLoad(1) */
-	3	/* overLoad(3) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_LoadIndicator_specs_1 = {
-	asn_MAP_LoadIndicator_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_LoadIndicator_enum2value_1,	/* N => "tag"; sorted by N */
-	4,	/* Number of elements in the maps */
-	5,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_LoadIndicator_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_LoadIndicator = {
-	"LoadIndicator",
-	"LoadIndicator",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_LoadIndicator_tags_1,
-	sizeof(asn_DEF_LoadIndicator_tags_1)
-		/sizeof(asn_DEF_LoadIndicator_tags_1[0]), /* 1 */
-	asn_DEF_LoadIndicator_tags_1,	/* Same as above */
-	sizeof(asn_DEF_LoadIndicator_tags_1)
-		/sizeof(asn_DEF_LoadIndicator_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_LoadIndicator_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_LoadIndicator_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/LoadIndicator.h b/3rdparty/libe2ap/LoadIndicator.h
deleted file mode 100644
index b6881f5..0000000
--- a/3rdparty/libe2ap/LoadIndicator.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_LoadIndicator_H_
-#define	_LoadIndicator_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum LoadIndicator {
-	LoadIndicator_lowLoad	= 0,
-	LoadIndicator_mediumLoad	= 1,
-	LoadIndicator_highLoad	= 2,
-	LoadIndicator_overLoad	= 3
-	/*
-	 * Enumeration is extensible
-	 */
-} e_LoadIndicator;
-
-/* LoadIndicator */
-typedef long	 LoadIndicator_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_LoadIndicator_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_LoadIndicator;
-extern const asn_INTEGER_specifics_t asn_SPC_LoadIndicator_specs_1;
-asn_struct_free_f LoadIndicator_free;
-asn_struct_print_f LoadIndicator_print;
-asn_constr_check_f LoadIndicator_constraint;
-ber_type_decoder_f LoadIndicator_decode_ber;
-der_type_encoder_f LoadIndicator_encode_der;
-xer_type_decoder_f LoadIndicator_decode_xer;
-xer_type_encoder_f LoadIndicator_encode_xer;
-per_type_decoder_f LoadIndicator_decode_uper;
-per_type_encoder_f LoadIndicator_encode_uper;
-per_type_decoder_f LoadIndicator_decode_aper;
-per_type_encoder_f LoadIndicator_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _LoadIndicator_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/LoadInformation.c b/3rdparty/libe2ap/LoadInformation.c
deleted file mode 100644
index d8f9122..0000000
--- a/3rdparty/libe2ap/LoadInformation.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "LoadInformation.h"
-
-asn_TYPE_member_t asn_MBR_LoadInformation_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct LoadInformation, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P20,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_LoadInformation_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_LoadInformation_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_LoadInformation_specs_1 = {
-	sizeof(struct LoadInformation),
-	offsetof(struct LoadInformation, _asn_ctx),
-	asn_MAP_LoadInformation_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_LoadInformation = {
-	"LoadInformation",
-	"LoadInformation",
-	&asn_OP_SEQUENCE,
-	asn_DEF_LoadInformation_tags_1,
-	sizeof(asn_DEF_LoadInformation_tags_1)
-		/sizeof(asn_DEF_LoadInformation_tags_1[0]), /* 1 */
-	asn_DEF_LoadInformation_tags_1,	/* Same as above */
-	sizeof(asn_DEF_LoadInformation_tags_1)
-		/sizeof(asn_DEF_LoadInformation_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_LoadInformation_1,
-	1,	/* Elements count */
-	&asn_SPC_LoadInformation_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/LoadInformation.h b/3rdparty/libe2ap/LoadInformation.h
deleted file mode 100644
index 34ecf46..0000000
--- a/3rdparty/libe2ap/LoadInformation.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_LoadInformation_H_
-#define	_LoadInformation_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* LoadInformation */
-typedef struct LoadInformation {
-	ProtocolIE_Container_8807P20_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} LoadInformation_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_LoadInformation;
-extern asn_SEQUENCE_specifics_t asn_SPC_LoadInformation_specs_1;
-extern asn_TYPE_member_t asn_MBR_LoadInformation_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _LoadInformation_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/MBMS-Service-Area-Identity-List.c b/3rdparty/libe2ap/MBMS-Service-Area-Identity-List.c
deleted file mode 100644
index 2378998..0000000
--- a/3rdparty/libe2ap/MBMS-Service-Area-Identity-List.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "MBMS-Service-Area-Identity-List.h"
-
-static asn_per_constraints_t asn_PER_type_MBMS_Service_Area_Identity_List_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_MBMS_Service_Area_Identity_List_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
-		0,
-		&asn_DEF_MBMS_Service_Area_Identity,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_MBMS_Service_Area_Identity_List_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_MBMS_Service_Area_Identity_List_specs_1 = {
-	sizeof(struct MBMS_Service_Area_Identity_List),
-	offsetof(struct MBMS_Service_Area_Identity_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_MBMS_Service_Area_Identity_List = {
-	"MBMS-Service-Area-Identity-List",
-	"MBMS-Service-Area-Identity-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_MBMS_Service_Area_Identity_List_tags_1,
-	sizeof(asn_DEF_MBMS_Service_Area_Identity_List_tags_1)
-		/sizeof(asn_DEF_MBMS_Service_Area_Identity_List_tags_1[0]), /* 1 */
-	asn_DEF_MBMS_Service_Area_Identity_List_tags_1,	/* Same as above */
-	sizeof(asn_DEF_MBMS_Service_Area_Identity_List_tags_1)
-		/sizeof(asn_DEF_MBMS_Service_Area_Identity_List_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_MBMS_Service_Area_Identity_List_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_MBMS_Service_Area_Identity_List_1,
-	1,	/* Single element */
-	&asn_SPC_MBMS_Service_Area_Identity_List_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/MBMS-Service-Area-Identity-List.h b/3rdparty/libe2ap/MBMS-Service-Area-Identity-List.h
deleted file mode 100644
index d220eee..0000000
--- a/3rdparty/libe2ap/MBMS-Service-Area-Identity-List.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_MBMS_Service_Area_Identity_List_H_
-#define	_MBMS_Service_Area_Identity_List_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "MBMS-Service-Area-Identity.h"
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* MBMS-Service-Area-Identity-List */
-typedef struct MBMS_Service_Area_Identity_List {
-	A_SEQUENCE_OF(MBMS_Service_Area_Identity_t) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} MBMS_Service_Area_Identity_List_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_MBMS_Service_Area_Identity_List;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _MBMS_Service_Area_Identity_List_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/MBMS-Service-Area-Identity.c b/3rdparty/libe2ap/MBMS-Service-Area-Identity.c
deleted file mode 100644
index 2532c10..0000000
--- a/3rdparty/libe2ap/MBMS-Service-Area-Identity.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "MBMS-Service-Area-Identity.h"
-
-int
-MBMS_Service_Area_Identity_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	size = st->size;
-	
-	if((size == 2)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_MBMS_Service_Area_Identity_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  2,  2 }	/* (SIZE(2..2)) */,
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_MBMS_Service_Area_Identity_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_MBMS_Service_Area_Identity = {
-	"MBMS-Service-Area-Identity",
-	"MBMS-Service-Area-Identity",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_MBMS_Service_Area_Identity_tags_1,
-	sizeof(asn_DEF_MBMS_Service_Area_Identity_tags_1)
-		/sizeof(asn_DEF_MBMS_Service_Area_Identity_tags_1[0]), /* 1 */
-	asn_DEF_MBMS_Service_Area_Identity_tags_1,	/* Same as above */
-	sizeof(asn_DEF_MBMS_Service_Area_Identity_tags_1)
-		/sizeof(asn_DEF_MBMS_Service_Area_Identity_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_MBMS_Service_Area_Identity_constr_1, MBMS_Service_Area_Identity_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/MBMS-Service-Area-Identity.h b/3rdparty/libe2ap/MBMS-Service-Area-Identity.h
deleted file mode 100644
index c43f6ad..0000000
--- a/3rdparty/libe2ap/MBMS-Service-Area-Identity.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_MBMS_Service_Area_Identity_H_
-#define	_MBMS_Service_Area_Identity_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* MBMS-Service-Area-Identity */
-typedef OCTET_STRING_t	 MBMS_Service_Area_Identity_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_MBMS_Service_Area_Identity_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_MBMS_Service_Area_Identity;
-asn_struct_free_f MBMS_Service_Area_Identity_free;
-asn_struct_print_f MBMS_Service_Area_Identity_print;
-asn_constr_check_f MBMS_Service_Area_Identity_constraint;
-ber_type_decoder_f MBMS_Service_Area_Identity_decode_ber;
-der_type_encoder_f MBMS_Service_Area_Identity_encode_der;
-xer_type_decoder_f MBMS_Service_Area_Identity_decode_xer;
-xer_type_encoder_f MBMS_Service_Area_Identity_encode_xer;
-per_type_decoder_f MBMS_Service_Area_Identity_decode_uper;
-per_type_encoder_f MBMS_Service_Area_Identity_encode_uper;
-per_type_decoder_f MBMS_Service_Area_Identity_decode_aper;
-per_type_encoder_f MBMS_Service_Area_Identity_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _MBMS_Service_Area_Identity_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/MBSFN-Subframe-Info.c b/3rdparty/libe2ap/MBSFN-Subframe-Info.c
deleted file mode 100644
index d1f8c2e..0000000
--- a/3rdparty/libe2ap/MBSFN-Subframe-Info.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "MBSFN-Subframe-Info.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_MBSFN_Subframe_Info_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct MBSFN_Subframe_Info, radioframeAllocationPeriod),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RadioframeAllocationPeriod,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"radioframeAllocationPeriod"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct MBSFN_Subframe_Info, radioframeAllocationOffset),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RadioframeAllocationOffset,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"radioframeAllocationOffset"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct MBSFN_Subframe_Info, subframeAllocation),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_SubframeAllocation,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"subframeAllocation"
-		},
-	{ ATF_POINTER, 1, offsetof(struct MBSFN_Subframe_Info, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P49,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_MBSFN_Subframe_Info_oms_1[] = { 3 };
-static const ber_tlv_tag_t asn_DEF_MBSFN_Subframe_Info_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_MBSFN_Subframe_Info_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* radioframeAllocationPeriod */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* radioframeAllocationOffset */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* subframeAllocation */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_MBSFN_Subframe_Info_specs_1 = {
-	sizeof(struct MBSFN_Subframe_Info),
-	offsetof(struct MBSFN_Subframe_Info, _asn_ctx),
-	asn_MAP_MBSFN_Subframe_Info_tag2el_1,
-	4,	/* Count of tags in the map */
-	asn_MAP_MBSFN_Subframe_Info_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_MBSFN_Subframe_Info = {
-	"MBSFN-Subframe-Info",
-	"MBSFN-Subframe-Info",
-	&asn_OP_SEQUENCE,
-	asn_DEF_MBSFN_Subframe_Info_tags_1,
-	sizeof(asn_DEF_MBSFN_Subframe_Info_tags_1)
-		/sizeof(asn_DEF_MBSFN_Subframe_Info_tags_1[0]), /* 1 */
-	asn_DEF_MBSFN_Subframe_Info_tags_1,	/* Same as above */
-	sizeof(asn_DEF_MBSFN_Subframe_Info_tags_1)
-		/sizeof(asn_DEF_MBSFN_Subframe_Info_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_MBSFN_Subframe_Info_1,
-	4,	/* Elements count */
-	&asn_SPC_MBSFN_Subframe_Info_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/MBSFN-Subframe-Info.h b/3rdparty/libe2ap/MBSFN-Subframe-Info.h
deleted file mode 100644
index abf1e20..0000000
--- a/3rdparty/libe2ap/MBSFN-Subframe-Info.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_MBSFN_Subframe_Info_H_
-#define	_MBSFN_Subframe_Info_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "RadioframeAllocationPeriod.h"
-#include "RadioframeAllocationOffset.h"
-#include "SubframeAllocation.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* MBSFN-Subframe-Info */
-typedef struct MBSFN_Subframe_Info {
-	RadioframeAllocationPeriod_t	 radioframeAllocationPeriod;
-	RadioframeAllocationOffset_t	 radioframeAllocationOffset;
-	SubframeAllocation_t	 subframeAllocation;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} MBSFN_Subframe_Info_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_MBSFN_Subframe_Info;
-extern asn_SEQUENCE_specifics_t asn_SPC_MBSFN_Subframe_Info_specs_1;
-extern asn_TYPE_member_t asn_MBR_MBSFN_Subframe_Info_1[4];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _MBSFN_Subframe_Info_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/MBSFN-Subframe-Infolist.c b/3rdparty/libe2ap/MBSFN-Subframe-Infolist.c
deleted file mode 100644
index 196114c..0000000
--- a/3rdparty/libe2ap/MBSFN-Subframe-Infolist.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "MBSFN-Subframe-Infolist.h"
-
-#include "MBSFN-Subframe-Info.h"
-static asn_per_constraints_t asn_PER_type_MBSFN_Subframe_Infolist_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 3,  3,  1,  8 }	/* (SIZE(1..8)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_MBSFN_Subframe_Infolist_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_MBSFN_Subframe_Info,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_MBSFN_Subframe_Infolist_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_MBSFN_Subframe_Infolist_specs_1 = {
-	sizeof(struct MBSFN_Subframe_Infolist),
-	offsetof(struct MBSFN_Subframe_Infolist, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_MBSFN_Subframe_Infolist = {
-	"MBSFN-Subframe-Infolist",
-	"MBSFN-Subframe-Infolist",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_MBSFN_Subframe_Infolist_tags_1,
-	sizeof(asn_DEF_MBSFN_Subframe_Infolist_tags_1)
-		/sizeof(asn_DEF_MBSFN_Subframe_Infolist_tags_1[0]), /* 1 */
-	asn_DEF_MBSFN_Subframe_Infolist_tags_1,	/* Same as above */
-	sizeof(asn_DEF_MBSFN_Subframe_Infolist_tags_1)
-		/sizeof(asn_DEF_MBSFN_Subframe_Infolist_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_MBSFN_Subframe_Infolist_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_MBSFN_Subframe_Infolist_1,
-	1,	/* Single element */
-	&asn_SPC_MBSFN_Subframe_Infolist_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/MBSFN-Subframe-Infolist.h b/3rdparty/libe2ap/MBSFN-Subframe-Infolist.h
deleted file mode 100644
index 0fd1ee1..0000000
--- a/3rdparty/libe2ap/MBSFN-Subframe-Infolist.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_MBSFN_Subframe_Infolist_H_
-#define	_MBSFN_Subframe_Infolist_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct MBSFN_Subframe_Info;
-
-/* MBSFN-Subframe-Infolist */
-typedef struct MBSFN_Subframe_Infolist {
-	A_SEQUENCE_OF(struct MBSFN_Subframe_Info) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} MBSFN_Subframe_Infolist_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_MBSFN_Subframe_Infolist;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _MBSFN_Subframe_Infolist_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/MME-Group-ID.c b/3rdparty/libe2ap/MME-Group-ID.c
deleted file mode 100644
index 3a01c05..0000000
--- a/3rdparty/libe2ap/MME-Group-ID.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "MME-Group-ID.h"
-
-int
-MME_Group_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	size = st->size;
-	
-	if((size == 2)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_MME_Group_ID_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  2,  2 }	/* (SIZE(2..2)) */,
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_MME_Group_ID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_MME_Group_ID = {
-	"MME-Group-ID",
-	"MME-Group-ID",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_MME_Group_ID_tags_1,
-	sizeof(asn_DEF_MME_Group_ID_tags_1)
-		/sizeof(asn_DEF_MME_Group_ID_tags_1[0]), /* 1 */
-	asn_DEF_MME_Group_ID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_MME_Group_ID_tags_1)
-		/sizeof(asn_DEF_MME_Group_ID_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_MME_Group_ID_constr_1, MME_Group_ID_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/MME-Group-ID.h b/3rdparty/libe2ap/MME-Group-ID.h
deleted file mode 100644
index f487ded..0000000
--- a/3rdparty/libe2ap/MME-Group-ID.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_MME_Group_ID_H_
-#define	_MME_Group_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* MME-Group-ID */
-typedef OCTET_STRING_t	 MME_Group_ID_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_MME_Group_ID_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_MME_Group_ID;
-asn_struct_free_f MME_Group_ID_free;
-asn_struct_print_f MME_Group_ID_print;
-asn_constr_check_f MME_Group_ID_constraint;
-ber_type_decoder_f MME_Group_ID_decode_ber;
-der_type_encoder_f MME_Group_ID_encode_der;
-xer_type_decoder_f MME_Group_ID_decode_xer;
-xer_type_encoder_f MME_Group_ID_encode_xer;
-per_type_decoder_f MME_Group_ID_decode_uper;
-per_type_encoder_f MME_Group_ID_encode_uper;
-per_type_decoder_f MME_Group_ID_decode_aper;
-per_type_encoder_f MME_Group_ID_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _MME_Group_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/Makefile.am.libasncodec b/3rdparty/libe2ap/Makefile.am.libasncodec
deleted file mode 100644
index 1d43b41..0000000
--- a/3rdparty/libe2ap/Makefile.am.libasncodec
+++ /dev/null
@@ -1,691 +0,0 @@
-ASN_MODULE_SRCS=	\
-	E2AP-PDU.c	\
-	RICInitiatingMessage.c	\
-	RICSuccessfulOutcome.c	\
-	RICUnsuccessfulOutcome.c	\
-	RICsubscriptionRequest.c	\
-	RICsubscription.c	\
-	RICactions-ToBeSetup-List.c	\
-	RICaction-ToBeSetup-Item.c	\
-	RICsubscriptionResponse.c	\
-	RICaction-Admitted-List.c	\
-	RICaction-Admitted-Item.c	\
-	RICaction-NotAdmitted-List.c	\
-	RICaction-NotAdmitted-Item.c	\
-	RICsubscriptionFailure.c	\
-	RICsubscriptionDeleteRequest.c	\
-	RICsubscriptionDeleteResponse.c	\
-	RICsubscriptionDeleteFailure.c	\
-	RICindication.c	\
-	RICcontrolRequest.c	\
-	RICcontrolAcknowledge.c	\
-	RICcontrolFailure.c	\
-	RICserviceUpdate.c	\
-	RANfunctions-List.c	\
-	RANfunction-Item.c	\
-	RANfunctionsID-List.c	\
-	RANfunctionID-Item.c	\
-	RICserviceUpdateAcknowledge.c	\
-	RANfunctionsIDcause-List.c	\
-	RANfunctionIDcause-Item.c	\
-	RICserviceUpdateFailure.c	\
-	RICserviceQuery.c	\
-	CauseRIC.c	\
-	RANfunctionDefinition.c	\
-	RANfunctionID.c	\
-	RICactionDefinition.c	\
-	RICactionID.c	\
-	RICactionType.c	\
-	RICcallProcessID.c	\
-	RICcause.c	\
-	RICcontrolAckRequest.c	\
-	RICcontrolHeader.c	\
-	RICcontrolMessage.c	\
-	RICcontrolStatus.c	\
-	RICeventTriggerDefinition.c	\
-	RICindicationHeader.c	\
-	RICindicationMessage.c	\
-	RICindicationSN.c	\
-	RICindicationType.c	\
-	RICrequestID.c	\
-	RICsubsequentAction.c	\
-	RICsubsequentActionType.c	\
-	RICtimeToWait.c	\
-	E2SM-gNB-X2-eventTriggerDefinition.c	\
-	E2SM-gNB-X2-actionDefinition.c	\
-	E2SM-gNB-X2-indicationHeader.c	\
-	E2SM-gNB-X2-indicationMessage.c	\
-	E2SM-gNB-X2-callProcessID.c	\
-	E2SM-gNB-X2-controlHeader.c	\
-	E2SM-gNB-X2-controlMessage.c	\
-	ActionParameter-Item.c	\
-	ActionParameter-ID.c	\
-	ActionParameter-Value.c	\
-	CallProcess-ID.c	\
-	Interface-ID.c	\
-	InterfaceDirection.c	\
-	InterfaceMessage.c	\
-	InterfaceMessageType.c	\
-	TypeOfMessage.c	\
-	InterfaceProtocolIE-Item.c	\
-	InterfaceProtocolIE-ID.c	\
-	InterfaceProtocolIE-Test.c	\
-	InterfaceProtocolIE-Value.c	\
-	Style-ID.c	\
-	TimeStamp.c	\
-	ErrorIndication.c	\
-	ResetRequest.c	\
-	ResetResponse.c	\
-	X2SetupRequest.c	\
-	X2SetupResponse.c	\
-	X2SetupFailure.c	\
-	LoadInformation.c	\
-	CellInformation-List.c	\
-	CellInformation-Item.c	\
-	ENBConfigurationUpdate.c	\
-	ServedCellsToModify.c	\
-	ServedCellsToModify-Item.c	\
-	Old-ECGIs.c	\
-	ENBConfigurationUpdateAcknowledge.c	\
-	ENBConfigurationUpdateFailure.c	\
-	ResourceStatusRequest.c	\
-	CellToReport-List.c	\
-	CellToReport-Item.c	\
-	ReportingPeriodicity.c	\
-	PartialSuccessIndicator.c	\
-	ResourceStatusResponse.c	\
-	MeasurementInitiationResult-List.c	\
-	MeasurementInitiationResult-Item.c	\
-	MeasurementFailureCause-List.c	\
-	MeasurementFailureCause-Item.c	\
-	ResourceStatusFailure.c	\
-	CompleteFailureCauseInformation-List.c	\
-	CompleteFailureCauseInformation-Item.c	\
-	ResourceStatusUpdate.c	\
-	CellMeasurementResult-List.c	\
-	CellMeasurementResult-Item.c	\
-	SeNBReconfigurationComplete.c	\
-	ResponseInformationSeNBReconfComp.c	\
-	ResponseInformationSeNBReconfComp-SuccessItem.c	\
-	ResponseInformationSeNBReconfComp-RejectByMeNBItem.c	\
-	ENDCX2SetupRequest.c	\
-	InitiatingNodeType-EndcX2Setup.c	\
-	ServedEUTRAcellsENDCX2ManagementList.c	\
-	ServedNRcellsENDCX2ManagementList.c	\
-	ServedNRCell-Information.c	\
-	FDD-InfoServedNRCell-Information.c	\
-	FDD-InfoNeighbourServedNRCell-Information.c	\
-	TDD-InfoServedNRCell-Information.c	\
-	TDD-InfoNeighbourServedNRCell-Information.c	\
-	NRNeighbour-Information.c	\
-	CellAssistanceInformation.c	\
-	Limited-list.c	\
-	ENDCX2SetupResponse.c	\
-	RespondingNodeType-EndcX2Setup.c	\
-	ENDCX2SetupFailure.c	\
-	ENDCConfigurationUpdate.c	\
-	InitiatingNodeType-EndcConfigUpdate.c	\
-	ServedEUTRAcellsToModifyListENDCConfUpd.c	\
-	ServedEUTRAcellsToDeleteListENDCConfUpd.c	\
-	ServedNRcellsToModifyENDCConfUpdList.c	\
-	ServedNRCellsToModify-Item.c	\
-	ServedNRcellsToDeleteENDCConfUpdList.c	\
-	ENDCConfigurationUpdateAcknowledge.c	\
-	RespondingNodeType-EndcConfigUpdate.c	\
-	ENDCConfigurationUpdateFailure.c	\
-	GNBStatusIndication.c	\
-	ABSInformation.c	\
-	ABSInformationFDD.c	\
-	ABSInformationTDD.c	\
-	ABS-Status.c	\
-	AdditionalSpecialSubframe-Info.c	\
-	AdditionalSpecialSubframePatterns.c	\
-	AdditionalSpecialSubframeExtension-Info.c	\
-	AdditionalSpecialSubframePatternsExtension.c	\
-	BandwidthReducedSI.c	\
-	BenefitMetric.c	\
-	BroadcastPLMNs-Item.c	\
-	CapacityValue.c	\
-	Cause.c	\
-	CauseMisc.c	\
-	CauseProtocol.c	\
-	CauseRadioNetwork.c	\
-	CauseTransport.c	\
-	CellBasedQMC.c	\
-	CellCapacityClassValue.c	\
-	CellDeploymentStatusIndicator.c	\
-	CellIdListforQMC.c	\
-	CellReplacingInfo.c	\
-	CellReportingIndicator.c	\
-	CoMPHypothesisSet.c	\
-	CoMPHypothesisSetItem.c	\
-	CoMPInformation.c	\
-	CoMPInformationItem.c	\
-	CoMPInformationStartTime.c	\
-	CompositeAvailableCapacity.c	\
-	CompositeAvailableCapacityGroup.c	\
-	CoverageModificationList.c	\
-	CoverageModification-Item.c	\
-	CriticalityDiagnostics.c	\
-	CriticalityDiagnostics-IE-List.c	\
-	CSG-Id.c	\
-	CSIReportList.c	\
-	CSIReportPerCSIProcess.c	\
-	CSIReportPerCSIProcessItem.c	\
-	CyclicPrefixDL.c	\
-	CyclicPrefixUL.c	\
-	DeactivationIndication.c	\
-	DL-ABS-status.c	\
-	DL-GBR-PRB-usage.c	\
-	DL-non-GBR-PRB-usage.c	\
-	DL-scheduling-PDCCH-CCE-usage.c	\
-	DL-Total-PRB-usage.c	\
-	DynamicDLTransmissionInformation.c	\
-	DynamicNAICSInformation.c	\
-	EARFCN.c	\
-	EARFCNExtension.c	\
-	ECGI.c	\
-	EnhancedRNTP.c	\
-	EnhancedRNTPStartTime.c	\
-	ENB-ID.c	\
-	EUTRA-Mode-Info.c	\
-	EUTRANCellIdentifier.c	\
-	ExtendedULInterferenceOverloadInfo.c	\
-	FDD-Info.c	\
-	Fourframes.c	\
-	FreqBandIndicator.c	\
-	FreqBandIndicatorPriority.c	\
-	FreqBandNrItem.c	\
-	GlobalENB-ID.c	\
-	GlobalGNB-ID.c	\
-	GNBOverloadInformation.c	\
-	GUGroupIDList.c	\
-	GU-Group-ID.c	\
-	GNB-ID.c	\
-	HWLoadIndicator.c	\
-	InvokeIndication.c	\
-	LHN-ID.c	\
-	LoadIndicator.c	\
-	Measurement-ID.c	\
-	MeNBtoSeNBContainer.c	\
-	MME-Group-ID.c	\
-	MBMS-Service-Area-Identity-List.c	\
-	MBMS-Service-Area-Identity.c	\
-	MBSFN-Subframe-Infolist.c	\
-	MBSFN-Subframe-Info.c	\
-	MultibandInfoList.c	\
-	BandInfo.c	\
-	MeNBtoSgNBContainer.c	\
-	Neighbour-Information.c	\
-	Number-of-Antennaports.c	\
-	NRFreqInfo.c	\
-	NRCellIdentifier.c	\
-	NRCGI.c	\
-	NRPCI.c	\
-	NR-TxBW.c	\
-	NRNRB.c	\
-	NRSCS.c	\
-	NRS-NSSS-PowerOffset.c	\
-	FiveGS-TAC.c	\
-	NSSS-NumOccasionDifferentPrecoder.c	\
-	OffsetOfNbiotChannelNumberToEARFCN.c	\
-	Oneframe.c	\
-	PA-Values.c	\
-	PCI.c	\
-	PLMN-Identity.c	\
-	PRACH-Configuration.c	\
-	ProtectedEUTRAResourceIndication.c	\
-	ProtectedFootprintTimePattern.c	\
-	ProtectedResourceList.c	\
-	ProtectedResourceList-Item.c	\
-	RadioframeAllocationOffset.c	\
-	RadioframeAllocationPeriod.c	\
-	RadioResourceStatus.c	\
-	Registration-Request.c	\
-	RelativeNarrowbandTxPower.c	\
-	ReplacingCellsList.c	\
-	ReplacingCellsList-Item.c	\
-	ReportCharacteristics.c	\
-	ReportingPeriodicityCSIR.c	\
-	ReportingPeriodicityRSRPMR.c	\
-	ResourceType.c	\
-	RNTP-Threshold.c	\
-	RSRPMeasurementResult.c	\
-	RSRPMRList.c	\
-	S1TNLLoadIndicator.c	\
-	ServedCells.c	\
-	ServedCell-Information.c	\
-	SgNB-UE-X2AP-ID.c	\
-	SpecialSubframe-Info.c	\
-	SpecialSubframePatterns.c	\
-	SubbandCQI.c	\
-	SubbandCQICodeword0.c	\
-	SubbandCQICodeword1.c	\
-	SubbandCQIList.c	\
-	SubbandCQIItem.c	\
-	SubbandSize.c	\
-	SubframeAllocation.c	\
-	SubframeAssignment.c	\
-	SULInformation.c	\
-	SupportedSULFreqBandItem.c	\
-	TAC.c	\
-	TDD-Info.c	\
-	TimeToWait.c	\
-	Transmission-Bandwidth.c	\
-	TypeOfError.c	\
-	UEID.c	\
-	UE-X2AP-ID.c	\
-	UE-X2AP-ID-Extension.c	\
-	UL-GBR-PRB-usage.c	\
-	UL-HighInterferenceIndicationInfo.c	\
-	UL-HighInterferenceIndicationInfo-Item.c	\
-	UL-HighInterferenceIndication.c	\
-	UL-InterferenceOverloadIndication.c	\
-	UL-InterferenceOverloadIndication-Item.c	\
-	UL-non-GBR-PRB-usage.c	\
-	UL-scheduling-PDCCH-CCE-usage.c	\
-	UL-Total-PRB-usage.c	\
-	UsableABSInformation.c	\
-	UsableABSInformationFDD.c	\
-	UsableABSInformationTDD.c	\
-	WidebandCQI.c	\
-	WidebandCQICodeword1.c	\
-	Criticality.c	\
-	Presence.c	\
-	PrivateIE-ID.c	\
-	ProcedureCode.c	\
-	ProtocolIE-ID.c	\
-	TriggeringMessage.c	\
-	ProtocolIE-Container.c	\
-	ProtocolIE-Single-Container.c	\
-	ProtocolIE-Field.c	\
-	ProtocolIE-ContainerList.c	\
-	ProtocolExtensionContainer.c	\
-	ProtocolExtensionField.c
-
-ASN_MODULE_HDRS=	\
-	E2AP-PDU.h	\
-	RICInitiatingMessage.h	\
-	RICSuccessfulOutcome.h	\
-	RICUnsuccessfulOutcome.h	\
-	RICsubscriptionRequest.h	\
-	RICsubscription.h	\
-	RICactions-ToBeSetup-List.h	\
-	RICaction-ToBeSetup-Item.h	\
-	RICsubscriptionResponse.h	\
-	RICaction-Admitted-List.h	\
-	RICaction-Admitted-Item.h	\
-	RICaction-NotAdmitted-List.h	\
-	RICaction-NotAdmitted-Item.h	\
-	RICsubscriptionFailure.h	\
-	RICsubscriptionDeleteRequest.h	\
-	RICsubscriptionDeleteResponse.h	\
-	RICsubscriptionDeleteFailure.h	\
-	RICindication.h	\
-	RICcontrolRequest.h	\
-	RICcontrolAcknowledge.h	\
-	RICcontrolFailure.h	\
-	RICserviceUpdate.h	\
-	RANfunctions-List.h	\
-	RANfunction-Item.h	\
-	RANfunctionsID-List.h	\
-	RANfunctionID-Item.h	\
-	RICserviceUpdateAcknowledge.h	\
-	RANfunctionsIDcause-List.h	\
-	RANfunctionIDcause-Item.h	\
-	RICserviceUpdateFailure.h	\
-	RICserviceQuery.h	\
-	CauseRIC.h	\
-	RANfunctionDefinition.h	\
-	RANfunctionID.h	\
-	RICactionDefinition.h	\
-	RICactionID.h	\
-	RICactionType.h	\
-	RICcallProcessID.h	\
-	RICcause.h	\
-	RICcontrolAckRequest.h	\
-	RICcontrolHeader.h	\
-	RICcontrolMessage.h	\
-	RICcontrolStatus.h	\
-	RICeventTriggerDefinition.h	\
-	RICindicationHeader.h	\
-	RICindicationMessage.h	\
-	RICindicationSN.h	\
-	RICindicationType.h	\
-	RICrequestID.h	\
-	RICsubsequentAction.h	\
-	RICsubsequentActionType.h	\
-	RICtimeToWait.h	\
-	E2SM-gNB-X2-eventTriggerDefinition.h	\
-	E2SM-gNB-X2-actionDefinition.h	\
-	E2SM-gNB-X2-indicationHeader.h	\
-	E2SM-gNB-X2-indicationMessage.h	\
-	E2SM-gNB-X2-callProcessID.h	\
-	E2SM-gNB-X2-controlHeader.h	\
-	E2SM-gNB-X2-controlMessage.h	\
-	ActionParameter-Item.h	\
-	ActionParameter-ID.h	\
-	ActionParameter-Value.h	\
-	CallProcess-ID.h	\
-	Interface-ID.h	\
-	InterfaceDirection.h	\
-	InterfaceMessage.h	\
-	InterfaceMessageType.h	\
-	TypeOfMessage.h	\
-	InterfaceProtocolIE-Item.h	\
-	InterfaceProtocolIE-ID.h	\
-	InterfaceProtocolIE-Test.h	\
-	InterfaceProtocolIE-Value.h	\
-	Style-ID.h	\
-	TimeStamp.h	\
-	ErrorIndication.h	\
-	ResetRequest.h	\
-	ResetResponse.h	\
-	X2SetupRequest.h	\
-	X2SetupResponse.h	\
-	X2SetupFailure.h	\
-	LoadInformation.h	\
-	CellInformation-List.h	\
-	CellInformation-Item.h	\
-	ENBConfigurationUpdate.h	\
-	ServedCellsToModify.h	\
-	ServedCellsToModify-Item.h	\
-	Old-ECGIs.h	\
-	ENBConfigurationUpdateAcknowledge.h	\
-	ENBConfigurationUpdateFailure.h	\
-	ResourceStatusRequest.h	\
-	CellToReport-List.h	\
-	CellToReport-Item.h	\
-	ReportingPeriodicity.h	\
-	PartialSuccessIndicator.h	\
-	ResourceStatusResponse.h	\
-	MeasurementInitiationResult-List.h	\
-	MeasurementInitiationResult-Item.h	\
-	MeasurementFailureCause-List.h	\
-	MeasurementFailureCause-Item.h	\
-	ResourceStatusFailure.h	\
-	CompleteFailureCauseInformation-List.h	\
-	CompleteFailureCauseInformation-Item.h	\
-	ResourceStatusUpdate.h	\
-	CellMeasurementResult-List.h	\
-	CellMeasurementResult-Item.h	\
-	SeNBReconfigurationComplete.h	\
-	ResponseInformationSeNBReconfComp.h	\
-	ResponseInformationSeNBReconfComp-SuccessItem.h	\
-	ResponseInformationSeNBReconfComp-RejectByMeNBItem.h	\
-	ENDCX2SetupRequest.h	\
-	InitiatingNodeType-EndcX2Setup.h	\
-	ServedEUTRAcellsENDCX2ManagementList.h	\
-	ServedNRcellsENDCX2ManagementList.h	\
-	ServedNRCell-Information.h	\
-	FDD-InfoServedNRCell-Information.h	\
-	FDD-InfoNeighbourServedNRCell-Information.h	\
-	TDD-InfoServedNRCell-Information.h	\
-	TDD-InfoNeighbourServedNRCell-Information.h	\
-	NRNeighbour-Information.h	\
-	CellAssistanceInformation.h	\
-	Limited-list.h	\
-	ENDCX2SetupResponse.h	\
-	RespondingNodeType-EndcX2Setup.h	\
-	ENDCX2SetupFailure.h	\
-	ENDCConfigurationUpdate.h	\
-	InitiatingNodeType-EndcConfigUpdate.h	\
-	ServedEUTRAcellsToModifyListENDCConfUpd.h	\
-	ServedEUTRAcellsToDeleteListENDCConfUpd.h	\
-	ServedNRcellsToModifyENDCConfUpdList.h	\
-	ServedNRCellsToModify-Item.h	\
-	ServedNRcellsToDeleteENDCConfUpdList.h	\
-	ENDCConfigurationUpdateAcknowledge.h	\
-	RespondingNodeType-EndcConfigUpdate.h	\
-	ENDCConfigurationUpdateFailure.h	\
-	GNBStatusIndication.h	\
-	ABSInformation.h	\
-	ABSInformationFDD.h	\
-	ABSInformationTDD.h	\
-	ABS-Status.h	\
-	AdditionalSpecialSubframe-Info.h	\
-	AdditionalSpecialSubframePatterns.h	\
-	AdditionalSpecialSubframeExtension-Info.h	\
-	AdditionalSpecialSubframePatternsExtension.h	\
-	BandwidthReducedSI.h	\
-	BenefitMetric.h	\
-	BroadcastPLMNs-Item.h	\
-	CapacityValue.h	\
-	Cause.h	\
-	CauseMisc.h	\
-	CauseProtocol.h	\
-	CauseRadioNetwork.h	\
-	CauseTransport.h	\
-	CellBasedQMC.h	\
-	CellCapacityClassValue.h	\
-	CellDeploymentStatusIndicator.h	\
-	CellIdListforQMC.h	\
-	CellReplacingInfo.h	\
-	CellReportingIndicator.h	\
-	CoMPHypothesisSet.h	\
-	CoMPHypothesisSetItem.h	\
-	CoMPInformation.h	\
-	CoMPInformationItem.h	\
-	CoMPInformationStartTime.h	\
-	CompositeAvailableCapacity.h	\
-	CompositeAvailableCapacityGroup.h	\
-	CoverageModificationList.h	\
-	CoverageModification-Item.h	\
-	CriticalityDiagnostics.h	\
-	CriticalityDiagnostics-IE-List.h	\
-	CSG-Id.h	\
-	CSIReportList.h	\
-	CSIReportPerCSIProcess.h	\
-	CSIReportPerCSIProcessItem.h	\
-	CyclicPrefixDL.h	\
-	CyclicPrefixUL.h	\
-	DeactivationIndication.h	\
-	DL-ABS-status.h	\
-	DL-GBR-PRB-usage.h	\
-	DL-non-GBR-PRB-usage.h	\
-	DL-scheduling-PDCCH-CCE-usage.h	\
-	DL-Total-PRB-usage.h	\
-	DynamicDLTransmissionInformation.h	\
-	DynamicNAICSInformation.h	\
-	EARFCN.h	\
-	EARFCNExtension.h	\
-	ECGI.h	\
-	EnhancedRNTP.h	\
-	EnhancedRNTPStartTime.h	\
-	ENB-ID.h	\
-	EUTRA-Mode-Info.h	\
-	EUTRANCellIdentifier.h	\
-	ExtendedULInterferenceOverloadInfo.h	\
-	FDD-Info.h	\
-	Fourframes.h	\
-	FreqBandIndicator.h	\
-	FreqBandIndicatorPriority.h	\
-	FreqBandNrItem.h	\
-	GlobalENB-ID.h	\
-	GlobalGNB-ID.h	\
-	GNBOverloadInformation.h	\
-	GUGroupIDList.h	\
-	GU-Group-ID.h	\
-	GNB-ID.h	\
-	HWLoadIndicator.h	\
-	InvokeIndication.h	\
-	LHN-ID.h	\
-	LoadIndicator.h	\
-	Measurement-ID.h	\
-	MeNBtoSeNBContainer.h	\
-	MME-Group-ID.h	\
-	MBMS-Service-Area-Identity-List.h	\
-	MBMS-Service-Area-Identity.h	\
-	MBSFN-Subframe-Infolist.h	\
-	MBSFN-Subframe-Info.h	\
-	MultibandInfoList.h	\
-	BandInfo.h	\
-	MeNBtoSgNBContainer.h	\
-	Neighbour-Information.h	\
-	Number-of-Antennaports.h	\
-	NRFreqInfo.h	\
-	NRCellIdentifier.h	\
-	NRCGI.h	\
-	NRPCI.h	\
-	NR-TxBW.h	\
-	NRNRB.h	\
-	NRSCS.h	\
-	NRS-NSSS-PowerOffset.h	\
-	FiveGS-TAC.h	\
-	NSSS-NumOccasionDifferentPrecoder.h	\
-	OffsetOfNbiotChannelNumberToEARFCN.h	\
-	Oneframe.h	\
-	PA-Values.h	\
-	PCI.h	\
-	PLMN-Identity.h	\
-	PRACH-Configuration.h	\
-	ProtectedEUTRAResourceIndication.h	\
-	ProtectedFootprintTimePattern.h	\
-	ProtectedResourceList.h	\
-	ProtectedResourceList-Item.h	\
-	RadioframeAllocationOffset.h	\
-	RadioframeAllocationPeriod.h	\
-	RadioResourceStatus.h	\
-	Registration-Request.h	\
-	RelativeNarrowbandTxPower.h	\
-	ReplacingCellsList.h	\
-	ReplacingCellsList-Item.h	\
-	ReportCharacteristics.h	\
-	ReportingPeriodicityCSIR.h	\
-	ReportingPeriodicityRSRPMR.h	\
-	ResourceType.h	\
-	RNTP-Threshold.h	\
-	RSRPMeasurementResult.h	\
-	RSRPMRList.h	\
-	S1TNLLoadIndicator.h	\
-	ServedCells.h	\
-	ServedCell-Information.h	\
-	SgNB-UE-X2AP-ID.h	\
-	SpecialSubframe-Info.h	\
-	SpecialSubframePatterns.h	\
-	SubbandCQI.h	\
-	SubbandCQICodeword0.h	\
-	SubbandCQICodeword1.h	\
-	SubbandCQIList.h	\
-	SubbandCQIItem.h	\
-	SubbandSize.h	\
-	SubframeAllocation.h	\
-	SubframeAssignment.h	\
-	SULInformation.h	\
-	SupportedSULFreqBandItem.h	\
-	TAC.h	\
-	TDD-Info.h	\
-	TimeToWait.h	\
-	Transmission-Bandwidth.h	\
-	TypeOfError.h	\
-	UEID.h	\
-	UE-X2AP-ID.h	\
-	UE-X2AP-ID-Extension.h	\
-	UL-GBR-PRB-usage.h	\
-	UL-HighInterferenceIndicationInfo.h	\
-	UL-HighInterferenceIndicationInfo-Item.h	\
-	UL-HighInterferenceIndication.h	\
-	UL-InterferenceOverloadIndication.h	\
-	UL-InterferenceOverloadIndication-Item.h	\
-	UL-non-GBR-PRB-usage.h	\
-	UL-scheduling-PDCCH-CCE-usage.h	\
-	UL-Total-PRB-usage.h	\
-	UsableABSInformation.h	\
-	UsableABSInformationFDD.h	\
-	UsableABSInformationTDD.h	\
-	WidebandCQI.h	\
-	WidebandCQICodeword1.h	\
-	Criticality.h	\
-	Presence.h	\
-	PrivateIE-ID.h	\
-	ProcedureCode.h	\
-	ProtocolIE-ID.h	\
-	TriggeringMessage.h	\
-	ProtocolIE-Container.h	\
-	ProtocolIE-Single-Container.h	\
-	ProtocolIE-Field.h	\
-	ProtocolIE-ContainerList.h	\
-	ProtocolExtensionContainer.h	\
-	ProtocolExtensionField.h
-
-ASN_MODULE_HDRS+=ANY.h
-ASN_MODULE_SRCS+=ANY.c
-ASN_MODULE_HDRS+=OCTET_STRING.h
-ASN_MODULE_HDRS+=OPEN_TYPE.h
-ASN_MODULE_SRCS+=OPEN_TYPE.c
-ASN_MODULE_HDRS+=constr_CHOICE.h
-ASN_MODULE_HDRS+=BOOLEAN.h
-ASN_MODULE_SRCS+=BOOLEAN.c
-ASN_MODULE_HDRS+=INTEGER.h
-ASN_MODULE_SRCS+=INTEGER.c
-ASN_MODULE_HDRS+=NULL.h
-ASN_MODULE_SRCS+=NULL.c
-ASN_MODULE_HDRS+=NativeEnumerated.h
-ASN_MODULE_SRCS+=NativeEnumerated.c
-ASN_MODULE_HDRS+=NativeInteger.h
-ASN_MODULE_SRCS+=NativeInteger.c
-ASN_MODULE_HDRS+=OBJECT_IDENTIFIER.h
-ASN_MODULE_SRCS+=OBJECT_IDENTIFIER.c
-ASN_MODULE_HDRS+=PrintableString.h
-ASN_MODULE_SRCS+=PrintableString.c
-ASN_MODULE_HDRS+=asn_SEQUENCE_OF.h
-ASN_MODULE_SRCS+=asn_SEQUENCE_OF.c
-ASN_MODULE_HDRS+=asn_SET_OF.h
-ASN_MODULE_SRCS+=asn_SET_OF.c
-ASN_MODULE_SRCS+=constr_CHOICE.c
-ASN_MODULE_HDRS+=constr_SEQUENCE.h
-ASN_MODULE_SRCS+=constr_SEQUENCE.c
-ASN_MODULE_HDRS+=constr_SEQUENCE_OF.h
-ASN_MODULE_SRCS+=constr_SEQUENCE_OF.c
-ASN_MODULE_HDRS+=constr_SET_OF.h
-ASN_MODULE_SRCS+=constr_SET_OF.c
-ASN_MODULE_HDRS+=asn_application.h
-ASN_MODULE_SRCS+=asn_application.c
-ASN_MODULE_HDRS+=asn_ioc.h
-ASN_MODULE_HDRS+=asn_system.h
-ASN_MODULE_HDRS+=asn_codecs.h
-ASN_MODULE_HDRS+=asn_internal.h
-ASN_MODULE_SRCS+=asn_internal.c
-ASN_MODULE_HDRS+=asn_random_fill.h
-ASN_MODULE_SRCS+=asn_random_fill.c
-ASN_MODULE_HDRS+=asn_bit_data.h
-ASN_MODULE_SRCS+=asn_bit_data.c
-ASN_MODULE_SRCS+=OCTET_STRING.c
-ASN_MODULE_HDRS+=BIT_STRING.h
-ASN_MODULE_SRCS+=BIT_STRING.c
-ASN_MODULE_SRCS+=asn_codecs_prim.c
-ASN_MODULE_HDRS+=asn_codecs_prim.h
-ASN_MODULE_HDRS+=ber_tlv_length.h
-ASN_MODULE_SRCS+=ber_tlv_length.c
-ASN_MODULE_HDRS+=ber_tlv_tag.h
-ASN_MODULE_SRCS+=ber_tlv_tag.c
-ASN_MODULE_HDRS+=ber_decoder.h
-ASN_MODULE_SRCS+=ber_decoder.c
-ASN_MODULE_HDRS+=der_encoder.h
-ASN_MODULE_SRCS+=der_encoder.c
-ASN_MODULE_HDRS+=constr_TYPE.h
-ASN_MODULE_SRCS+=constr_TYPE.c
-ASN_MODULE_HDRS+=constraints.h
-ASN_MODULE_SRCS+=constraints.c
-ASN_MODULE_HDRS+=xer_support.h
-ASN_MODULE_SRCS+=xer_support.c
-ASN_MODULE_HDRS+=xer_decoder.h
-ASN_MODULE_SRCS+=xer_decoder.c
-ASN_MODULE_HDRS+=xer_encoder.h
-ASN_MODULE_SRCS+=xer_encoder.c
-ASN_MODULE_HDRS+=per_support.h
-ASN_MODULE_SRCS+=per_support.c
-ASN_MODULE_HDRS+=per_decoder.h
-ASN_MODULE_SRCS+=per_decoder.c
-ASN_MODULE_HDRS+=per_encoder.h
-ASN_MODULE_SRCS+=per_encoder.c
-ASN_MODULE_HDRS+=per_opentype.h
-ASN_MODULE_SRCS+=per_opentype.c
-
-ASN_MODULE_CFLAGS=-DASN_DISABLE_OER_SUPPORT 
-
-lib_LTLIBRARIES+=libasncodec.la
-libasncodec_la_SOURCES=$(ASN_MODULE_SRCS) $(ASN_MODULE_HDRS)
-libasncodec_la_CPPFLAGS=-I$(top_srcdir)/
-libasncodec_la_CFLAGS=$(ASN_MODULE_CFLAGS)
-libasncodec_la_LDFLAGS=-lm
diff --git a/3rdparty/libe2ap/MeNBtoSeNBContainer.c b/3rdparty/libe2ap/MeNBtoSeNBContainer.c
deleted file mode 100644
index c3c34ac..0000000
--- a/3rdparty/libe2ap/MeNBtoSeNBContainer.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "MeNBtoSeNBContainer.h"
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-static const ber_tlv_tag_t asn_DEF_MeNBtoSeNBContainer_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_MeNBtoSeNBContainer = {
-	"MeNBtoSeNBContainer",
-	"MeNBtoSeNBContainer",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_MeNBtoSeNBContainer_tags_1,
-	sizeof(asn_DEF_MeNBtoSeNBContainer_tags_1)
-		/sizeof(asn_DEF_MeNBtoSeNBContainer_tags_1[0]), /* 1 */
-	asn_DEF_MeNBtoSeNBContainer_tags_1,	/* Same as above */
-	sizeof(asn_DEF_MeNBtoSeNBContainer_tags_1)
-		/sizeof(asn_DEF_MeNBtoSeNBContainer_tags_1[0]), /* 1 */
-	{ 0, 0, OCTET_STRING_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/MeNBtoSeNBContainer.h b/3rdparty/libe2ap/MeNBtoSeNBContainer.h
deleted file mode 100644
index ce56299..0000000
--- a/3rdparty/libe2ap/MeNBtoSeNBContainer.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_MeNBtoSeNBContainer_H_
-#define	_MeNBtoSeNBContainer_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* MeNBtoSeNBContainer */
-typedef OCTET_STRING_t	 MeNBtoSeNBContainer_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_MeNBtoSeNBContainer;
-asn_struct_free_f MeNBtoSeNBContainer_free;
-asn_struct_print_f MeNBtoSeNBContainer_print;
-asn_constr_check_f MeNBtoSeNBContainer_constraint;
-ber_type_decoder_f MeNBtoSeNBContainer_decode_ber;
-der_type_encoder_f MeNBtoSeNBContainer_encode_der;
-xer_type_decoder_f MeNBtoSeNBContainer_decode_xer;
-xer_type_encoder_f MeNBtoSeNBContainer_encode_xer;
-per_type_decoder_f MeNBtoSeNBContainer_decode_uper;
-per_type_encoder_f MeNBtoSeNBContainer_encode_uper;
-per_type_decoder_f MeNBtoSeNBContainer_decode_aper;
-per_type_encoder_f MeNBtoSeNBContainer_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _MeNBtoSeNBContainer_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/MeNBtoSgNBContainer.c b/3rdparty/libe2ap/MeNBtoSgNBContainer.c
deleted file mode 100644
index df35e53..0000000
--- a/3rdparty/libe2ap/MeNBtoSgNBContainer.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "MeNBtoSgNBContainer.h"
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-static const ber_tlv_tag_t asn_DEF_MeNBtoSgNBContainer_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_MeNBtoSgNBContainer = {
-	"MeNBtoSgNBContainer",
-	"MeNBtoSgNBContainer",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_MeNBtoSgNBContainer_tags_1,
-	sizeof(asn_DEF_MeNBtoSgNBContainer_tags_1)
-		/sizeof(asn_DEF_MeNBtoSgNBContainer_tags_1[0]), /* 1 */
-	asn_DEF_MeNBtoSgNBContainer_tags_1,	/* Same as above */
-	sizeof(asn_DEF_MeNBtoSgNBContainer_tags_1)
-		/sizeof(asn_DEF_MeNBtoSgNBContainer_tags_1[0]), /* 1 */
-	{ 0, 0, OCTET_STRING_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/MeNBtoSgNBContainer.h b/3rdparty/libe2ap/MeNBtoSgNBContainer.h
deleted file mode 100644
index 7248b04..0000000
--- a/3rdparty/libe2ap/MeNBtoSgNBContainer.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_MeNBtoSgNBContainer_H_
-#define	_MeNBtoSgNBContainer_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* MeNBtoSgNBContainer */
-typedef OCTET_STRING_t	 MeNBtoSgNBContainer_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_MeNBtoSgNBContainer;
-asn_struct_free_f MeNBtoSgNBContainer_free;
-asn_struct_print_f MeNBtoSgNBContainer_print;
-asn_constr_check_f MeNBtoSgNBContainer_constraint;
-ber_type_decoder_f MeNBtoSgNBContainer_decode_ber;
-der_type_encoder_f MeNBtoSgNBContainer_encode_der;
-xer_type_decoder_f MeNBtoSgNBContainer_decode_xer;
-xer_type_encoder_f MeNBtoSgNBContainer_encode_xer;
-per_type_decoder_f MeNBtoSgNBContainer_decode_uper;
-per_type_encoder_f MeNBtoSgNBContainer_encode_uper;
-per_type_decoder_f MeNBtoSgNBContainer_decode_aper;
-per_type_encoder_f MeNBtoSgNBContainer_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _MeNBtoSgNBContainer_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/Measurement-ID.c b/3rdparty/libe2ap/Measurement-ID.c
deleted file mode 100644
index a24aa6d..0000000
--- a/3rdparty/libe2ap/Measurement-ID.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "Measurement-ID.h"
-
-int
-Measurement_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 1 && value <= 4095)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_Measurement_ID_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  12,  12,  1,  4095 }	/* (1..4095,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_Measurement_ID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_Measurement_ID = {
-	"Measurement-ID",
-	"Measurement-ID",
-	&asn_OP_NativeInteger,
-	asn_DEF_Measurement_ID_tags_1,
-	sizeof(asn_DEF_Measurement_ID_tags_1)
-		/sizeof(asn_DEF_Measurement_ID_tags_1[0]), /* 1 */
-	asn_DEF_Measurement_ID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_Measurement_ID_tags_1)
-		/sizeof(asn_DEF_Measurement_ID_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_Measurement_ID_constr_1, Measurement_ID_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/Measurement-ID.h b/3rdparty/libe2ap/Measurement-ID.h
deleted file mode 100644
index cf54900..0000000
--- a/3rdparty/libe2ap/Measurement-ID.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_Measurement_ID_H_
-#define	_Measurement_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Measurement-ID */
-typedef long	 Measurement_ID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_Measurement_ID;
-asn_struct_free_f Measurement_ID_free;
-asn_struct_print_f Measurement_ID_print;
-asn_constr_check_f Measurement_ID_constraint;
-ber_type_decoder_f Measurement_ID_decode_ber;
-der_type_encoder_f Measurement_ID_encode_der;
-xer_type_decoder_f Measurement_ID_decode_xer;
-xer_type_encoder_f Measurement_ID_encode_xer;
-per_type_decoder_f Measurement_ID_decode_uper;
-per_type_encoder_f Measurement_ID_encode_uper;
-per_type_decoder_f Measurement_ID_decode_aper;
-per_type_encoder_f Measurement_ID_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _Measurement_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/MeasurementFailureCause-Item.c b/3rdparty/libe2ap/MeasurementFailureCause-Item.c
deleted file mode 100644
index 739eb3b..0000000
--- a/3rdparty/libe2ap/MeasurementFailureCause-Item.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "MeasurementFailureCause-Item.h"
-
-#include "ProtocolExtensionContainer.h"
-static asn_TYPE_member_t asn_MBR_MeasurementFailureCause_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementFailureCause_Item, measurementFailedReportCharacteristics),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ReportCharacteristics,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"measurementFailedReportCharacteristics"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementFailureCause_Item, cause),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_Cause,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cause"
-		},
-	{ ATF_POINTER, 1, offsetof(struct MeasurementFailureCause_Item, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P4,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_MeasurementFailureCause_Item_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_MeasurementFailureCause_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_MeasurementFailureCause_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* measurementFailedReportCharacteristics */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cause */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_MeasurementFailureCause_Item_specs_1 = {
-	sizeof(struct MeasurementFailureCause_Item),
-	offsetof(struct MeasurementFailureCause_Item, _asn_ctx),
-	asn_MAP_MeasurementFailureCause_Item_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_MeasurementFailureCause_Item_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_MeasurementFailureCause_Item = {
-	"MeasurementFailureCause-Item",
-	"MeasurementFailureCause-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_MeasurementFailureCause_Item_tags_1,
-	sizeof(asn_DEF_MeasurementFailureCause_Item_tags_1)
-		/sizeof(asn_DEF_MeasurementFailureCause_Item_tags_1[0]), /* 1 */
-	asn_DEF_MeasurementFailureCause_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_MeasurementFailureCause_Item_tags_1)
-		/sizeof(asn_DEF_MeasurementFailureCause_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_MeasurementFailureCause_Item_1,
-	3,	/* Elements count */
-	&asn_SPC_MeasurementFailureCause_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/MeasurementFailureCause-Item.h b/3rdparty/libe2ap/MeasurementFailureCause-Item.h
deleted file mode 100644
index 47031d7..0000000
--- a/3rdparty/libe2ap/MeasurementFailureCause-Item.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_MeasurementFailureCause_Item_H_
-#define	_MeasurementFailureCause_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ReportCharacteristics.h"
-#include "Cause.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* MeasurementFailureCause-Item */
-typedef struct MeasurementFailureCause_Item {
-	ReportCharacteristics_t	 measurementFailedReportCharacteristics;
-	Cause_t	 cause;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} MeasurementFailureCause_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_MeasurementFailureCause_Item;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _MeasurementFailureCause_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/MeasurementFailureCause-List.c b/3rdparty/libe2ap/MeasurementFailureCause-List.c
deleted file mode 100644
index 771c685..0000000
--- a/3rdparty/libe2ap/MeasurementFailureCause-List.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "MeasurementFailureCause-List.h"
-
-#include "ProtocolIE-Single-Container.h"
-asn_per_constraints_t asn_PER_type_MeasurementFailureCause_List_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 5,  5,  1,  32 }	/* (SIZE(1..32)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_MeasurementFailureCause_List_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtocolIE_Single_Container_8810P9,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_MeasurementFailureCause_List_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_MeasurementFailureCause_List_specs_1 = {
-	sizeof(struct MeasurementFailureCause_List),
-	offsetof(struct MeasurementFailureCause_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_MeasurementFailureCause_List = {
-	"MeasurementFailureCause-List",
-	"MeasurementFailureCause-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_MeasurementFailureCause_List_tags_1,
-	sizeof(asn_DEF_MeasurementFailureCause_List_tags_1)
-		/sizeof(asn_DEF_MeasurementFailureCause_List_tags_1[0]), /* 1 */
-	asn_DEF_MeasurementFailureCause_List_tags_1,	/* Same as above */
-	sizeof(asn_DEF_MeasurementFailureCause_List_tags_1)
-		/sizeof(asn_DEF_MeasurementFailureCause_List_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_MeasurementFailureCause_List_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_MeasurementFailureCause_List_1,
-	1,	/* Single element */
-	&asn_SPC_MeasurementFailureCause_List_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/MeasurementFailureCause-List.h b/3rdparty/libe2ap/MeasurementFailureCause-List.h
deleted file mode 100644
index 519960d..0000000
--- a/3rdparty/libe2ap/MeasurementFailureCause-List.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_MeasurementFailureCause_List_H_
-#define	_MeasurementFailureCause_List_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolIE_Single_Container;
-
-/* MeasurementFailureCause-List */
-typedef struct MeasurementFailureCause_List {
-	A_SEQUENCE_OF(struct ProtocolIE_Single_Container) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} MeasurementFailureCause_List_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_MeasurementFailureCause_List;
-extern asn_SET_OF_specifics_t asn_SPC_MeasurementFailureCause_List_specs_1;
-extern asn_TYPE_member_t asn_MBR_MeasurementFailureCause_List_1[1];
-extern asn_per_constraints_t asn_PER_type_MeasurementFailureCause_List_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _MeasurementFailureCause_List_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/MeasurementInitiationResult-Item.c b/3rdparty/libe2ap/MeasurementInitiationResult-Item.c
deleted file mode 100644
index 384c170..0000000
--- a/3rdparty/libe2ap/MeasurementInitiationResult-Item.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "MeasurementInitiationResult-Item.h"
-
-#include "MeasurementFailureCause-List.h"
-#include "ProtocolExtensionContainer.h"
-static asn_TYPE_member_t asn_MBR_MeasurementInitiationResult_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementInitiationResult_Item, cell_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cell-ID"
-		},
-	{ ATF_POINTER, 2, offsetof(struct MeasurementInitiationResult_Item, measurementFailureCause_List),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_MeasurementFailureCause_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"measurementFailureCause-List"
-		},
-	{ ATF_POINTER, 1, offsetof(struct MeasurementInitiationResult_Item, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P3,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_MeasurementInitiationResult_Item_oms_1[] = { 1, 2 };
-static const ber_tlv_tag_t asn_DEF_MeasurementInitiationResult_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_MeasurementInitiationResult_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cell-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* measurementFailureCause-List */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_MeasurementInitiationResult_Item_specs_1 = {
-	sizeof(struct MeasurementInitiationResult_Item),
-	offsetof(struct MeasurementInitiationResult_Item, _asn_ctx),
-	asn_MAP_MeasurementInitiationResult_Item_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_MeasurementInitiationResult_Item_oms_1,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_MeasurementInitiationResult_Item = {
-	"MeasurementInitiationResult-Item",
-	"MeasurementInitiationResult-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_MeasurementInitiationResult_Item_tags_1,
-	sizeof(asn_DEF_MeasurementInitiationResult_Item_tags_1)
-		/sizeof(asn_DEF_MeasurementInitiationResult_Item_tags_1[0]), /* 1 */
-	asn_DEF_MeasurementInitiationResult_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_MeasurementInitiationResult_Item_tags_1)
-		/sizeof(asn_DEF_MeasurementInitiationResult_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_MeasurementInitiationResult_Item_1,
-	3,	/* Elements count */
-	&asn_SPC_MeasurementInitiationResult_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/MeasurementInitiationResult-Item.h b/3rdparty/libe2ap/MeasurementInitiationResult-Item.h
deleted file mode 100644
index 2126708..0000000
--- a/3rdparty/libe2ap/MeasurementInitiationResult-Item.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_MeasurementInitiationResult_Item_H_
-#define	_MeasurementInitiationResult_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ECGI.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct MeasurementFailureCause_List;
-struct ProtocolExtensionContainer;
-
-/* MeasurementInitiationResult-Item */
-typedef struct MeasurementInitiationResult_Item {
-	ECGI_t	 cell_ID;
-	struct MeasurementFailureCause_List	*measurementFailureCause_List;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} MeasurementInitiationResult_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_MeasurementInitiationResult_Item;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _MeasurementInitiationResult_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/MeasurementInitiationResult-List.c b/3rdparty/libe2ap/MeasurementInitiationResult-List.c
deleted file mode 100644
index cd37246..0000000
--- a/3rdparty/libe2ap/MeasurementInitiationResult-List.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "MeasurementInitiationResult-List.h"
-
-#include "ProtocolIE-Single-Container.h"
-static asn_per_constraints_t asn_PER_type_MeasurementInitiationResult_List_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_MeasurementInitiationResult_List_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtocolIE_Single_Container_8810P8,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_MeasurementInitiationResult_List_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_MeasurementInitiationResult_List_specs_1 = {
-	sizeof(struct MeasurementInitiationResult_List),
-	offsetof(struct MeasurementInitiationResult_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_MeasurementInitiationResult_List = {
-	"MeasurementInitiationResult-List",
-	"MeasurementInitiationResult-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_MeasurementInitiationResult_List_tags_1,
-	sizeof(asn_DEF_MeasurementInitiationResult_List_tags_1)
-		/sizeof(asn_DEF_MeasurementInitiationResult_List_tags_1[0]), /* 1 */
-	asn_DEF_MeasurementInitiationResult_List_tags_1,	/* Same as above */
-	sizeof(asn_DEF_MeasurementInitiationResult_List_tags_1)
-		/sizeof(asn_DEF_MeasurementInitiationResult_List_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_MeasurementInitiationResult_List_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_MeasurementInitiationResult_List_1,
-	1,	/* Single element */
-	&asn_SPC_MeasurementInitiationResult_List_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/MeasurementInitiationResult-List.h b/3rdparty/libe2ap/MeasurementInitiationResult-List.h
deleted file mode 100644
index e91f257..0000000
--- a/3rdparty/libe2ap/MeasurementInitiationResult-List.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_MeasurementInitiationResult_List_H_
-#define	_MeasurementInitiationResult_List_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolIE_Single_Container;
-
-/* MeasurementInitiationResult-List */
-typedef struct MeasurementInitiationResult_List {
-	A_SEQUENCE_OF(struct ProtocolIE_Single_Container) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} MeasurementInitiationResult_List_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_MeasurementInitiationResult_List;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _MeasurementInitiationResult_List_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/MultibandInfoList.c b/3rdparty/libe2ap/MultibandInfoList.c
deleted file mode 100644
index e882e30..0000000
--- a/3rdparty/libe2ap/MultibandInfoList.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "MultibandInfoList.h"
-
-#include "BandInfo.h"
-static asn_per_constraints_t asn_PER_type_MultibandInfoList_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 4,  4,  1,  16 }	/* (SIZE(1..16)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_MultibandInfoList_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_BandInfo,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_MultibandInfoList_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_MultibandInfoList_specs_1 = {
-	sizeof(struct MultibandInfoList),
-	offsetof(struct MultibandInfoList, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_MultibandInfoList = {
-	"MultibandInfoList",
-	"MultibandInfoList",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_MultibandInfoList_tags_1,
-	sizeof(asn_DEF_MultibandInfoList_tags_1)
-		/sizeof(asn_DEF_MultibandInfoList_tags_1[0]), /* 1 */
-	asn_DEF_MultibandInfoList_tags_1,	/* Same as above */
-	sizeof(asn_DEF_MultibandInfoList_tags_1)
-		/sizeof(asn_DEF_MultibandInfoList_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_MultibandInfoList_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_MultibandInfoList_1,
-	1,	/* Single element */
-	&asn_SPC_MultibandInfoList_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/MultibandInfoList.h b/3rdparty/libe2ap/MultibandInfoList.h
deleted file mode 100644
index 7c611f2..0000000
--- a/3rdparty/libe2ap/MultibandInfoList.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_MultibandInfoList_H_
-#define	_MultibandInfoList_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct BandInfo;
-
-/* MultibandInfoList */
-typedef struct MultibandInfoList {
-	A_SEQUENCE_OF(struct BandInfo) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} MultibandInfoList_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_MultibandInfoList;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _MultibandInfoList_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/NR-TxBW.c b/3rdparty/libe2ap/NR-TxBW.c
deleted file mode 100644
index 14df9f4..0000000
--- a/3rdparty/libe2ap/NR-TxBW.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "NR-TxBW.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_NR_TxBW_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct NR_TxBW, nRSCS),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRSCS,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nRSCS"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct NR_TxBW, nRNRB),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRNRB,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nRNRB"
-		},
-	{ ATF_POINTER, 1, offsetof(struct NR_TxBW, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P54,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_NR_TxBW_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_NR_TxBW_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_NR_TxBW_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nRSCS */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* nRNRB */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_NR_TxBW_specs_1 = {
-	sizeof(struct NR_TxBW),
-	offsetof(struct NR_TxBW, _asn_ctx),
-	asn_MAP_NR_TxBW_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_NR_TxBW_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_NR_TxBW = {
-	"NR-TxBW",
-	"NR-TxBW",
-	&asn_OP_SEQUENCE,
-	asn_DEF_NR_TxBW_tags_1,
-	sizeof(asn_DEF_NR_TxBW_tags_1)
-		/sizeof(asn_DEF_NR_TxBW_tags_1[0]), /* 1 */
-	asn_DEF_NR_TxBW_tags_1,	/* Same as above */
-	sizeof(asn_DEF_NR_TxBW_tags_1)
-		/sizeof(asn_DEF_NR_TxBW_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_NR_TxBW_1,
-	3,	/* Elements count */
-	&asn_SPC_NR_TxBW_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/NR-TxBW.h b/3rdparty/libe2ap/NR-TxBW.h
deleted file mode 100644
index b8d8d71..0000000
--- a/3rdparty/libe2ap/NR-TxBW.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_NR_TxBW_H_
-#define	_NR_TxBW_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NRSCS.h"
-#include "NRNRB.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* NR-TxBW */
-typedef struct NR_TxBW {
-	NRSCS_t	 nRSCS;
-	NRNRB_t	 nRNRB;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} NR_TxBW_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_NR_TxBW;
-extern asn_SEQUENCE_specifics_t asn_SPC_NR_TxBW_specs_1;
-extern asn_TYPE_member_t asn_MBR_NR_TxBW_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _NR_TxBW_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/NRCGI.c b/3rdparty/libe2ap/NRCGI.c
deleted file mode 100644
index f007399..0000000
--- a/3rdparty/libe2ap/NRCGI.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "NRCGI.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_NRCGI_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct NRCGI, pLMN_Identity),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_PLMN_Identity,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"pLMN-Identity"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct NRCGI, nRcellIdentifier),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRCellIdentifier,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nRcellIdentifier"
-		},
-	{ ATF_POINTER, 1, offsetof(struct NRCGI, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P53,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_NRCGI_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_NRCGI_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_NRCGI_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* nRcellIdentifier */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_NRCGI_specs_1 = {
-	sizeof(struct NRCGI),
-	offsetof(struct NRCGI, _asn_ctx),
-	asn_MAP_NRCGI_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_NRCGI_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_NRCGI = {
-	"NRCGI",
-	"NRCGI",
-	&asn_OP_SEQUENCE,
-	asn_DEF_NRCGI_tags_1,
-	sizeof(asn_DEF_NRCGI_tags_1)
-		/sizeof(asn_DEF_NRCGI_tags_1[0]), /* 1 */
-	asn_DEF_NRCGI_tags_1,	/* Same as above */
-	sizeof(asn_DEF_NRCGI_tags_1)
-		/sizeof(asn_DEF_NRCGI_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_NRCGI_1,
-	3,	/* Elements count */
-	&asn_SPC_NRCGI_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/NRCGI.h b/3rdparty/libe2ap/NRCGI.h
deleted file mode 100644
index 6274405..0000000
--- a/3rdparty/libe2ap/NRCGI.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_NRCGI_H_
-#define	_NRCGI_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "PLMN-Identity.h"
-#include "NRCellIdentifier.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* NRCGI */
-typedef struct NRCGI {
-	PLMN_Identity_t	 pLMN_Identity;
-	NRCellIdentifier_t	 nRcellIdentifier;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} NRCGI_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_NRCGI;
-extern asn_SEQUENCE_specifics_t asn_SPC_NRCGI_specs_1;
-extern asn_TYPE_member_t asn_MBR_NRCGI_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _NRCGI_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/NRCellIdentifier.c b/3rdparty/libe2ap/NRCellIdentifier.c
deleted file mode 100644
index 8a2cc9a..0000000
--- a/3rdparty/libe2ap/NRCellIdentifier.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "NRCellIdentifier.h"
-
-int
-NRCellIdentifier_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 36)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using BIT_STRING,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_NRCellIdentifier_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  36,  36 }	/* (SIZE(36..36)) */,
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_NRCellIdentifier_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_NRCellIdentifier = {
-	"NRCellIdentifier",
-	"NRCellIdentifier",
-	&asn_OP_BIT_STRING,
-	asn_DEF_NRCellIdentifier_tags_1,
-	sizeof(asn_DEF_NRCellIdentifier_tags_1)
-		/sizeof(asn_DEF_NRCellIdentifier_tags_1[0]), /* 1 */
-	asn_DEF_NRCellIdentifier_tags_1,	/* Same as above */
-	sizeof(asn_DEF_NRCellIdentifier_tags_1)
-		/sizeof(asn_DEF_NRCellIdentifier_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_NRCellIdentifier_constr_1, NRCellIdentifier_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_BIT_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/NRCellIdentifier.h b/3rdparty/libe2ap/NRCellIdentifier.h
deleted file mode 100644
index dcd4f6e..0000000
--- a/3rdparty/libe2ap/NRCellIdentifier.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_NRCellIdentifier_H_
-#define	_NRCellIdentifier_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* NRCellIdentifier */
-typedef BIT_STRING_t	 NRCellIdentifier_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_NRCellIdentifier_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_NRCellIdentifier;
-asn_struct_free_f NRCellIdentifier_free;
-asn_struct_print_f NRCellIdentifier_print;
-asn_constr_check_f NRCellIdentifier_constraint;
-ber_type_decoder_f NRCellIdentifier_decode_ber;
-der_type_encoder_f NRCellIdentifier_encode_der;
-xer_type_decoder_f NRCellIdentifier_decode_xer;
-xer_type_encoder_f NRCellIdentifier_encode_xer;
-per_type_decoder_f NRCellIdentifier_decode_uper;
-per_type_encoder_f NRCellIdentifier_encode_uper;
-per_type_decoder_f NRCellIdentifier_decode_aper;
-per_type_encoder_f NRCellIdentifier_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _NRCellIdentifier_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/NRFreqInfo.c b/3rdparty/libe2ap/NRFreqInfo.c
deleted file mode 100644
index 4a456f2..0000000
--- a/3rdparty/libe2ap/NRFreqInfo.c
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "NRFreqInfo.h"
-
-#include "SULInformation.h"
-#include "ProtocolExtensionContainer.h"
-#include "FreqBandNrItem.h"
-static int
-memb_nRARFCN_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 3279165)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_freqBandListNr_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	/* Determine the number of elements */
-	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
-	
-	if((size >= 1 && size <= 32)) {
-		/* Perform validation of the inner elements */
-		return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_type_freqBandListNr_constr_3 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 5,  5,  1,  32 }	/* (SIZE(1..32)) */,
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_nRARFCN_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 22, -1,  0,  3279165 }	/* (0..3279165) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_freqBandListNr_constr_3 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 5,  5,  1,  32 }	/* (SIZE(1..32)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_freqBandListNr_3[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_FreqBandNrItem,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_freqBandListNr_tags_3[] = {
-	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_freqBandListNr_specs_3 = {
-	sizeof(struct NRFreqInfo__freqBandListNr),
-	offsetof(struct NRFreqInfo__freqBandListNr, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_freqBandListNr_3 = {
-	"freqBandListNr",
-	"freqBandListNr",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_freqBandListNr_tags_3,
-	sizeof(asn_DEF_freqBandListNr_tags_3)
-		/sizeof(asn_DEF_freqBandListNr_tags_3[0]) - 1, /* 1 */
-	asn_DEF_freqBandListNr_tags_3,	/* Same as above */
-	sizeof(asn_DEF_freqBandListNr_tags_3)
-		/sizeof(asn_DEF_freqBandListNr_tags_3[0]), /* 2 */
-	{ 0, &asn_PER_type_freqBandListNr_constr_3, SEQUENCE_OF_constraint },
-	asn_MBR_freqBandListNr_3,
-	1,	/* Single element */
-	&asn_SPC_freqBandListNr_specs_3	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_NRFreqInfo_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct NRFreqInfo, nRARFCN),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_nRARFCN_constr_2,  memb_nRARFCN_constraint_1 },
-		0, 0, /* No default value */
-		"nRARFCN"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct NRFreqInfo, freqBandListNr),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		0,
-		&asn_DEF_freqBandListNr_3,
-		0,
-		{ 0, &asn_PER_memb_freqBandListNr_constr_3,  memb_freqBandListNr_constraint_1 },
-		0, 0, /* No default value */
-		"freqBandListNr"
-		},
-	{ ATF_POINTER, 2, offsetof(struct NRFreqInfo, sULInformation),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_SULInformation,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"sULInformation"
-		},
-	{ ATF_POINTER, 1, offsetof(struct NRFreqInfo, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P52,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_NRFreqInfo_oms_1[] = { 2, 3 };
-static const ber_tlv_tag_t asn_DEF_NRFreqInfo_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_NRFreqInfo_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nRARFCN */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* freqBandListNr */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* sULInformation */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_NRFreqInfo_specs_1 = {
-	sizeof(struct NRFreqInfo),
-	offsetof(struct NRFreqInfo, _asn_ctx),
-	asn_MAP_NRFreqInfo_tag2el_1,
-	4,	/* Count of tags in the map */
-	asn_MAP_NRFreqInfo_oms_1,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_NRFreqInfo = {
-	"NRFreqInfo",
-	"NRFreqInfo",
-	&asn_OP_SEQUENCE,
-	asn_DEF_NRFreqInfo_tags_1,
-	sizeof(asn_DEF_NRFreqInfo_tags_1)
-		/sizeof(asn_DEF_NRFreqInfo_tags_1[0]), /* 1 */
-	asn_DEF_NRFreqInfo_tags_1,	/* Same as above */
-	sizeof(asn_DEF_NRFreqInfo_tags_1)
-		/sizeof(asn_DEF_NRFreqInfo_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_NRFreqInfo_1,
-	4,	/* Elements count */
-	&asn_SPC_NRFreqInfo_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/NRFreqInfo.h b/3rdparty/libe2ap/NRFreqInfo.h
deleted file mode 100644
index 0e3fe2a..0000000
--- a/3rdparty/libe2ap/NRFreqInfo.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_NRFreqInfo_H_
-#define	_NRFreqInfo_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct SULInformation;
-struct ProtocolExtensionContainer;
-struct FreqBandNrItem;
-
-/* NRFreqInfo */
-typedef struct NRFreqInfo {
-	long	 nRARFCN;
-	struct NRFreqInfo__freqBandListNr {
-		A_SEQUENCE_OF(struct FreqBandNrItem) list;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} freqBandListNr;
-	struct SULInformation	*sULInformation;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} NRFreqInfo_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_NRFreqInfo;
-extern asn_SEQUENCE_specifics_t asn_SPC_NRFreqInfo_specs_1;
-extern asn_TYPE_member_t asn_MBR_NRFreqInfo_1[4];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _NRFreqInfo_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/NRNRB.c b/3rdparty/libe2ap/NRNRB.c
deleted file mode 100644
index 5f9e37e..0000000
--- a/3rdparty/libe2ap/NRNRB.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "NRNRB.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_NRNRB_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  5,  5,  0,  28 }	/* (0..28,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_NRNRB_value2enum_1[] = {
-	{ 0,	5,	"nrb11" },
-	{ 1,	5,	"nrb18" },
-	{ 2,	5,	"nrb24" },
-	{ 3,	5,	"nrb25" },
-	{ 4,	5,	"nrb31" },
-	{ 5,	5,	"nrb32" },
-	{ 6,	5,	"nrb38" },
-	{ 7,	5,	"nrb51" },
-	{ 8,	5,	"nrb52" },
-	{ 9,	5,	"nrb65" },
-	{ 10,	5,	"nrb66" },
-	{ 11,	5,	"nrb78" },
-	{ 12,	5,	"nrb79" },
-	{ 13,	5,	"nrb93" },
-	{ 14,	6,	"nrb106" },
-	{ 15,	6,	"nrb107" },
-	{ 16,	6,	"nrb121" },
-	{ 17,	6,	"nrb132" },
-	{ 18,	6,	"nrb133" },
-	{ 19,	6,	"nrb135" },
-	{ 20,	6,	"nrb160" },
-	{ 21,	6,	"nrb162" },
-	{ 22,	6,	"nrb189" },
-	{ 23,	6,	"nrb216" },
-	{ 24,	6,	"nrb217" },
-	{ 25,	6,	"nrb245" },
-	{ 26,	6,	"nrb264" },
-	{ 27,	6,	"nrb270" },
-	{ 28,	6,	"nrb273" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_NRNRB_enum2value_1[] = {
-	14,	/* nrb106(14) */
-	15,	/* nrb107(15) */
-	0,	/* nrb11(0) */
-	16,	/* nrb121(16) */
-	17,	/* nrb132(17) */
-	18,	/* nrb133(18) */
-	19,	/* nrb135(19) */
-	20,	/* nrb160(20) */
-	21,	/* nrb162(21) */
-	1,	/* nrb18(1) */
-	22,	/* nrb189(22) */
-	23,	/* nrb216(23) */
-	24,	/* nrb217(24) */
-	2,	/* nrb24(2) */
-	25,	/* nrb245(25) */
-	3,	/* nrb25(3) */
-	26,	/* nrb264(26) */
-	27,	/* nrb270(27) */
-	28,	/* nrb273(28) */
-	4,	/* nrb31(4) */
-	5,	/* nrb32(5) */
-	6,	/* nrb38(6) */
-	7,	/* nrb51(7) */
-	8,	/* nrb52(8) */
-	9,	/* nrb65(9) */
-	10,	/* nrb66(10) */
-	11,	/* nrb78(11) */
-	12,	/* nrb79(12) */
-	13	/* nrb93(13) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_NRNRB_specs_1 = {
-	asn_MAP_NRNRB_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_NRNRB_enum2value_1,	/* N => "tag"; sorted by N */
-	29,	/* Number of elements in the maps */
-	30,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_NRNRB_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_NRNRB = {
-	"NRNRB",
-	"NRNRB",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_NRNRB_tags_1,
-	sizeof(asn_DEF_NRNRB_tags_1)
-		/sizeof(asn_DEF_NRNRB_tags_1[0]), /* 1 */
-	asn_DEF_NRNRB_tags_1,	/* Same as above */
-	sizeof(asn_DEF_NRNRB_tags_1)
-		/sizeof(asn_DEF_NRNRB_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_NRNRB_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_NRNRB_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/NRNRB.h b/3rdparty/libe2ap/NRNRB.h
deleted file mode 100644
index e593eda..0000000
--- a/3rdparty/libe2ap/NRNRB.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_NRNRB_H_
-#define	_NRNRB_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum NRNRB {
-	NRNRB_nrb11	= 0,
-	NRNRB_nrb18	= 1,
-	NRNRB_nrb24	= 2,
-	NRNRB_nrb25	= 3,
-	NRNRB_nrb31	= 4,
-	NRNRB_nrb32	= 5,
-	NRNRB_nrb38	= 6,
-	NRNRB_nrb51	= 7,
-	NRNRB_nrb52	= 8,
-	NRNRB_nrb65	= 9,
-	NRNRB_nrb66	= 10,
-	NRNRB_nrb78	= 11,
-	NRNRB_nrb79	= 12,
-	NRNRB_nrb93	= 13,
-	NRNRB_nrb106	= 14,
-	NRNRB_nrb107	= 15,
-	NRNRB_nrb121	= 16,
-	NRNRB_nrb132	= 17,
-	NRNRB_nrb133	= 18,
-	NRNRB_nrb135	= 19,
-	NRNRB_nrb160	= 20,
-	NRNRB_nrb162	= 21,
-	NRNRB_nrb189	= 22,
-	NRNRB_nrb216	= 23,
-	NRNRB_nrb217	= 24,
-	NRNRB_nrb245	= 25,
-	NRNRB_nrb264	= 26,
-	NRNRB_nrb270	= 27,
-	NRNRB_nrb273	= 28
-	/*
-	 * Enumeration is extensible
-	 */
-} e_NRNRB;
-
-/* NRNRB */
-typedef long	 NRNRB_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_NRNRB_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_NRNRB;
-extern const asn_INTEGER_specifics_t asn_SPC_NRNRB_specs_1;
-asn_struct_free_f NRNRB_free;
-asn_struct_print_f NRNRB_print;
-asn_constr_check_f NRNRB_constraint;
-ber_type_decoder_f NRNRB_decode_ber;
-der_type_encoder_f NRNRB_encode_der;
-xer_type_decoder_f NRNRB_decode_xer;
-xer_type_encoder_f NRNRB_encode_xer;
-per_type_decoder_f NRNRB_decode_uper;
-per_type_encoder_f NRNRB_encode_uper;
-per_type_decoder_f NRNRB_decode_aper;
-per_type_encoder_f NRNRB_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _NRNRB_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/NRNeighbour-Information.c b/3rdparty/libe2ap/NRNeighbour-Information.c
deleted file mode 100644
index 558a2a4..0000000
--- a/3rdparty/libe2ap/NRNeighbour-Information.c
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "NRNeighbour-Information.h"
-
-#include "ProtocolExtensionContainer.h"
-static asn_per_constraints_t asn_PER_type_nRNeighbourModeInfo_constr_8 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_NRNeighbour_Information_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 10,  10,  1,  1024 }	/* (SIZE(1..1024)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_nRNeighbourModeInfo_8[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct NRNeighbour_Information__Member__nRNeighbourModeInfo, choice.fdd),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_FDD_InfoNeighbourServedNRCell_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"fdd"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct NRNeighbour_Information__Member__nRNeighbourModeInfo, choice.tdd),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_TDD_InfoNeighbourServedNRCell_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"tdd"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_nRNeighbourModeInfo_tag2el_8[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* fdd */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* tdd */
-};
-static asn_CHOICE_specifics_t asn_SPC_nRNeighbourModeInfo_specs_8 = {
-	sizeof(struct NRNeighbour_Information__Member__nRNeighbourModeInfo),
-	offsetof(struct NRNeighbour_Information__Member__nRNeighbourModeInfo, _asn_ctx),
-	offsetof(struct NRNeighbour_Information__Member__nRNeighbourModeInfo, present),
-	sizeof(((struct NRNeighbour_Information__Member__nRNeighbourModeInfo *)0)->present),
-	asn_MAP_nRNeighbourModeInfo_tag2el_8,
-	2,	/* Count of tags in the map */
-	0, 0,
-	2	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_nRNeighbourModeInfo_8 = {
-	"nRNeighbourModeInfo",
-	"nRNeighbourModeInfo",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_nRNeighbourModeInfo_constr_8, CHOICE_constraint },
-	asn_MBR_nRNeighbourModeInfo_8,
-	2,	/* Elements count */
-	&asn_SPC_nRNeighbourModeInfo_specs_8	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_Member_2[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct NRNeighbour_Information__Member, nrpCI),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRPCI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nrpCI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct NRNeighbour_Information__Member, nrCellID),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRCGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nrCellID"
-		},
-	{ ATF_POINTER, 2, offsetof(struct NRNeighbour_Information__Member, fiveGS_TAC),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_FiveGS_TAC,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"fiveGS-TAC"
-		},
-	{ ATF_POINTER, 1, offsetof(struct NRNeighbour_Information__Member, configured_TAC),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_TAC,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"configured-TAC"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct NRNeighbour_Information__Member, measurementTimingConfiguration),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_OCTET_STRING,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"measurementTimingConfiguration"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct NRNeighbour_Information__Member, nRNeighbourModeInfo),
-		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_nRNeighbourModeInfo_8,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nRNeighbourModeInfo"
-		},
-	{ ATF_POINTER, 1, offsetof(struct NRNeighbour_Information__Member, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P16,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_Member_oms_2[] = { 2, 3, 6 };
-static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nrpCI */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* nrCellID */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* fiveGS-TAC */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* configured-TAC */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* measurementTimingConfiguration */
-    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* nRNeighbourModeInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
-	sizeof(struct NRNeighbour_Information__Member),
-	offsetof(struct NRNeighbour_Information__Member, _asn_ctx),
-	asn_MAP_Member_tag2el_2,
-	7,	/* Count of tags in the map */
-	asn_MAP_Member_oms_2,	/* Optional members */
-	3, 0,	/* Root/Additions */
-	7,	/* First extension addition */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_Member_2 = {
-	"SEQUENCE",
-	"SEQUENCE",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Member_tags_2,
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	asn_DEF_Member_tags_2,	/* Same as above */
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Member_2,
-	7,	/* Elements count */
-	&asn_SPC_Member_specs_2	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_NRNeighbour_Information_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Member_2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_NRNeighbour_Information_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_NRNeighbour_Information_specs_1 = {
-	sizeof(struct NRNeighbour_Information),
-	offsetof(struct NRNeighbour_Information, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_NRNeighbour_Information = {
-	"NRNeighbour-Information",
-	"NRNeighbour-Information",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_NRNeighbour_Information_tags_1,
-	sizeof(asn_DEF_NRNeighbour_Information_tags_1)
-		/sizeof(asn_DEF_NRNeighbour_Information_tags_1[0]), /* 1 */
-	asn_DEF_NRNeighbour_Information_tags_1,	/* Same as above */
-	sizeof(asn_DEF_NRNeighbour_Information_tags_1)
-		/sizeof(asn_DEF_NRNeighbour_Information_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_NRNeighbour_Information_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_NRNeighbour_Information_1,
-	1,	/* Single element */
-	&asn_SPC_NRNeighbour_Information_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/NRNeighbour-Information.h b/3rdparty/libe2ap/NRNeighbour-Information.h
deleted file mode 100644
index dab37e7..0000000
--- a/3rdparty/libe2ap/NRNeighbour-Information.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_NRNeighbour_Information_H_
-#define	_NRNeighbour_Information_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "NRPCI.h"
-#include "NRCGI.h"
-#include "FiveGS-TAC.h"
-#include "TAC.h"
-#include "OCTET_STRING.h"
-#include "FDD-InfoNeighbourServedNRCell-Information.h"
-#include "TDD-InfoNeighbourServedNRCell-Information.h"
-#include "constr_CHOICE.h"
-#include "constr_SEQUENCE.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum NRNeighbour_Information__Member__nRNeighbourModeInfo_PR {
-	NRNeighbour_Information__Member__nRNeighbourModeInfo_PR_NOTHING,	/* No components present */
-	NRNeighbour_Information__Member__nRNeighbourModeInfo_PR_fdd,
-	NRNeighbour_Information__Member__nRNeighbourModeInfo_PR_tdd
-	/* Extensions may appear below */
-	
-} NRNeighbour_Information__Member__nRNeighbourModeInfo_PR;
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* Forward definitions */
-typedef struct NRNeighbour_Information__Member {
-	NRPCI_t	 nrpCI;
-	NRCGI_t	 nrCellID;
-	FiveGS_TAC_t	*fiveGS_TAC;	/* OPTIONAL */
-	TAC_t	*configured_TAC;	/* OPTIONAL */
-	OCTET_STRING_t	 measurementTimingConfiguration;
-	struct NRNeighbour_Information__Member__nRNeighbourModeInfo {
-		NRNeighbour_Information__Member__nRNeighbourModeInfo_PR present;
-		union NRNeighbour_Information__Member__nRNeighbourModeInfo_u {
-			FDD_InfoNeighbourServedNRCell_Information_t	 fdd;
-			TDD_InfoNeighbourServedNRCell_Information_t	 tdd;
-			/*
-			 * This type is extensible,
-			 * possible extensions are below.
-			 */
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} nRNeighbourModeInfo;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} NRNeighbour_Information__Member;
-
-/* NRNeighbour-Information */
-typedef struct NRNeighbour_Information {
-	A_SEQUENCE_OF(NRNeighbour_Information__Member) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} NRNeighbour_Information_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_NRNeighbour_Information;
-extern asn_SET_OF_specifics_t asn_SPC_NRNeighbour_Information_specs_1;
-extern asn_TYPE_member_t asn_MBR_NRNeighbour_Information_1[1];
-extern asn_per_constraints_t asn_PER_type_NRNeighbour_Information_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _NRNeighbour_Information_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/NRPCI.c b/3rdparty/libe2ap/NRPCI.c
deleted file mode 100644
index c6916a1..0000000
--- a/3rdparty/libe2ap/NRPCI.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "NRPCI.h"
-
-int
-NRPCI_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 1007)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_NRPCI_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 10,  10,  0,  1007 }	/* (0..1007) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_NRPCI_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_NRPCI = {
-	"NRPCI",
-	"NRPCI",
-	&asn_OP_NativeInteger,
-	asn_DEF_NRPCI_tags_1,
-	sizeof(asn_DEF_NRPCI_tags_1)
-		/sizeof(asn_DEF_NRPCI_tags_1[0]), /* 1 */
-	asn_DEF_NRPCI_tags_1,	/* Same as above */
-	sizeof(asn_DEF_NRPCI_tags_1)
-		/sizeof(asn_DEF_NRPCI_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_NRPCI_constr_1, NRPCI_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/NRPCI.h b/3rdparty/libe2ap/NRPCI.h
deleted file mode 100644
index 1bb44b3..0000000
--- a/3rdparty/libe2ap/NRPCI.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_NRPCI_H_
-#define	_NRPCI_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* NRPCI */
-typedef long	 NRPCI_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_NRPCI_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_NRPCI;
-asn_struct_free_f NRPCI_free;
-asn_struct_print_f NRPCI_print;
-asn_constr_check_f NRPCI_constraint;
-ber_type_decoder_f NRPCI_decode_ber;
-der_type_encoder_f NRPCI_encode_der;
-xer_type_decoder_f NRPCI_decode_xer;
-xer_type_encoder_f NRPCI_encode_xer;
-per_type_decoder_f NRPCI_decode_uper;
-per_type_encoder_f NRPCI_encode_uper;
-per_type_decoder_f NRPCI_decode_aper;
-per_type_encoder_f NRPCI_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _NRPCI_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/NRS-NSSS-PowerOffset.c b/3rdparty/libe2ap/NRS-NSSS-PowerOffset.c
deleted file mode 100644
index f7aec91..0000000
--- a/3rdparty/libe2ap/NRS-NSSS-PowerOffset.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "NRS-NSSS-PowerOffset.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_NRS_NSSS_PowerOffset_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_NRS_NSSS_PowerOffset_value2enum_1[] = {
-	{ 0,	10,	"minusThree" },
-	{ 1,	4,	"zero" },
-	{ 2,	5,	"three" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_NRS_NSSS_PowerOffset_enum2value_1[] = {
-	0,	/* minusThree(0) */
-	2,	/* three(2) */
-	1	/* zero(1) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_NRS_NSSS_PowerOffset_specs_1 = {
-	asn_MAP_NRS_NSSS_PowerOffset_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_NRS_NSSS_PowerOffset_enum2value_1,	/* N => "tag"; sorted by N */
-	3,	/* Number of elements in the maps */
-	4,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_NRS_NSSS_PowerOffset_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_NRS_NSSS_PowerOffset = {
-	"NRS-NSSS-PowerOffset",
-	"NRS-NSSS-PowerOffset",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_NRS_NSSS_PowerOffset_tags_1,
-	sizeof(asn_DEF_NRS_NSSS_PowerOffset_tags_1)
-		/sizeof(asn_DEF_NRS_NSSS_PowerOffset_tags_1[0]), /* 1 */
-	asn_DEF_NRS_NSSS_PowerOffset_tags_1,	/* Same as above */
-	sizeof(asn_DEF_NRS_NSSS_PowerOffset_tags_1)
-		/sizeof(asn_DEF_NRS_NSSS_PowerOffset_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_NRS_NSSS_PowerOffset_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_NRS_NSSS_PowerOffset_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/NRS-NSSS-PowerOffset.h b/3rdparty/libe2ap/NRS-NSSS-PowerOffset.h
deleted file mode 100644
index af5ede9..0000000
--- a/3rdparty/libe2ap/NRS-NSSS-PowerOffset.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_NRS_NSSS_PowerOffset_H_
-#define	_NRS_NSSS_PowerOffset_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum NRS_NSSS_PowerOffset {
-	NRS_NSSS_PowerOffset_minusThree	= 0,
-	NRS_NSSS_PowerOffset_zero	= 1,
-	NRS_NSSS_PowerOffset_three	= 2
-	/*
-	 * Enumeration is extensible
-	 */
-} e_NRS_NSSS_PowerOffset;
-
-/* NRS-NSSS-PowerOffset */
-typedef long	 NRS_NSSS_PowerOffset_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_NRS_NSSS_PowerOffset;
-asn_struct_free_f NRS_NSSS_PowerOffset_free;
-asn_struct_print_f NRS_NSSS_PowerOffset_print;
-asn_constr_check_f NRS_NSSS_PowerOffset_constraint;
-ber_type_decoder_f NRS_NSSS_PowerOffset_decode_ber;
-der_type_encoder_f NRS_NSSS_PowerOffset_encode_der;
-xer_type_decoder_f NRS_NSSS_PowerOffset_decode_xer;
-xer_type_encoder_f NRS_NSSS_PowerOffset_encode_xer;
-per_type_decoder_f NRS_NSSS_PowerOffset_decode_uper;
-per_type_encoder_f NRS_NSSS_PowerOffset_encode_uper;
-per_type_decoder_f NRS_NSSS_PowerOffset_decode_aper;
-per_type_encoder_f NRS_NSSS_PowerOffset_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _NRS_NSSS_PowerOffset_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/NRSCS.c b/3rdparty/libe2ap/NRSCS.c
deleted file mode 100644
index 1551cf3..0000000
--- a/3rdparty/libe2ap/NRSCS.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "NRSCS.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_NRSCS_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  3 }	/* (0..3,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_NRSCS_value2enum_1[] = {
-	{ 0,	5,	"scs15" },
-	{ 1,	5,	"scs30" },
-	{ 2,	5,	"scs60" },
-	{ 3,	6,	"scs120" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_NRSCS_enum2value_1[] = {
-	3,	/* scs120(3) */
-	0,	/* scs15(0) */
-	1,	/* scs30(1) */
-	2	/* scs60(2) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_NRSCS_specs_1 = {
-	asn_MAP_NRSCS_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_NRSCS_enum2value_1,	/* N => "tag"; sorted by N */
-	4,	/* Number of elements in the maps */
-	5,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_NRSCS_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_NRSCS = {
-	"NRSCS",
-	"NRSCS",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_NRSCS_tags_1,
-	sizeof(asn_DEF_NRSCS_tags_1)
-		/sizeof(asn_DEF_NRSCS_tags_1[0]), /* 1 */
-	asn_DEF_NRSCS_tags_1,	/* Same as above */
-	sizeof(asn_DEF_NRSCS_tags_1)
-		/sizeof(asn_DEF_NRSCS_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_NRSCS_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_NRSCS_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/NRSCS.h b/3rdparty/libe2ap/NRSCS.h
deleted file mode 100644
index 5c8bfe0..0000000
--- a/3rdparty/libe2ap/NRSCS.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_NRSCS_H_
-#define	_NRSCS_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum NRSCS {
-	NRSCS_scs15	= 0,
-	NRSCS_scs30	= 1,
-	NRSCS_scs60	= 2,
-	NRSCS_scs120	= 3
-	/*
-	 * Enumeration is extensible
-	 */
-} e_NRSCS;
-
-/* NRSCS */
-typedef long	 NRSCS_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_NRSCS_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_NRSCS;
-extern const asn_INTEGER_specifics_t asn_SPC_NRSCS_specs_1;
-asn_struct_free_f NRSCS_free;
-asn_struct_print_f NRSCS_print;
-asn_constr_check_f NRSCS_constraint;
-ber_type_decoder_f NRSCS_decode_ber;
-der_type_encoder_f NRSCS_encode_der;
-xer_type_decoder_f NRSCS_decode_xer;
-xer_type_encoder_f NRSCS_encode_xer;
-per_type_decoder_f NRSCS_decode_uper;
-per_type_encoder_f NRSCS_encode_uper;
-per_type_decoder_f NRSCS_decode_aper;
-per_type_encoder_f NRSCS_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _NRSCS_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/NSSS-NumOccasionDifferentPrecoder.c b/3rdparty/libe2ap/NSSS-NumOccasionDifferentPrecoder.c
deleted file mode 100644
index 09c49af..0000000
--- a/3rdparty/libe2ap/NSSS-NumOccasionDifferentPrecoder.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "NSSS-NumOccasionDifferentPrecoder.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_NSSS_NumOccasionDifferentPrecoder_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_NSSS_NumOccasionDifferentPrecoder_value2enum_1[] = {
-	{ 0,	3,	"two" },
-	{ 1,	4,	"four" },
-	{ 2,	5,	"eight" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_NSSS_NumOccasionDifferentPrecoder_enum2value_1[] = {
-	2,	/* eight(2) */
-	1,	/* four(1) */
-	0	/* two(0) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_NSSS_NumOccasionDifferentPrecoder_specs_1 = {
-	asn_MAP_NSSS_NumOccasionDifferentPrecoder_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_NSSS_NumOccasionDifferentPrecoder_enum2value_1,	/* N => "tag"; sorted by N */
-	3,	/* Number of elements in the maps */
-	4,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_NSSS_NumOccasionDifferentPrecoder_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_NSSS_NumOccasionDifferentPrecoder = {
-	"NSSS-NumOccasionDifferentPrecoder",
-	"NSSS-NumOccasionDifferentPrecoder",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_NSSS_NumOccasionDifferentPrecoder_tags_1,
-	sizeof(asn_DEF_NSSS_NumOccasionDifferentPrecoder_tags_1)
-		/sizeof(asn_DEF_NSSS_NumOccasionDifferentPrecoder_tags_1[0]), /* 1 */
-	asn_DEF_NSSS_NumOccasionDifferentPrecoder_tags_1,	/* Same as above */
-	sizeof(asn_DEF_NSSS_NumOccasionDifferentPrecoder_tags_1)
-		/sizeof(asn_DEF_NSSS_NumOccasionDifferentPrecoder_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_NSSS_NumOccasionDifferentPrecoder_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_NSSS_NumOccasionDifferentPrecoder_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/NSSS-NumOccasionDifferentPrecoder.h b/3rdparty/libe2ap/NSSS-NumOccasionDifferentPrecoder.h
deleted file mode 100644
index 2b336c2..0000000
--- a/3rdparty/libe2ap/NSSS-NumOccasionDifferentPrecoder.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_NSSS_NumOccasionDifferentPrecoder_H_
-#define	_NSSS_NumOccasionDifferentPrecoder_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum NSSS_NumOccasionDifferentPrecoder {
-	NSSS_NumOccasionDifferentPrecoder_two	= 0,
-	NSSS_NumOccasionDifferentPrecoder_four	= 1,
-	NSSS_NumOccasionDifferentPrecoder_eight	= 2
-	/*
-	 * Enumeration is extensible
-	 */
-} e_NSSS_NumOccasionDifferentPrecoder;
-
-/* NSSS-NumOccasionDifferentPrecoder */
-typedef long	 NSSS_NumOccasionDifferentPrecoder_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_NSSS_NumOccasionDifferentPrecoder;
-asn_struct_free_f NSSS_NumOccasionDifferentPrecoder_free;
-asn_struct_print_f NSSS_NumOccasionDifferentPrecoder_print;
-asn_constr_check_f NSSS_NumOccasionDifferentPrecoder_constraint;
-ber_type_decoder_f NSSS_NumOccasionDifferentPrecoder_decode_ber;
-der_type_encoder_f NSSS_NumOccasionDifferentPrecoder_encode_der;
-xer_type_decoder_f NSSS_NumOccasionDifferentPrecoder_decode_xer;
-xer_type_encoder_f NSSS_NumOccasionDifferentPrecoder_encode_xer;
-per_type_decoder_f NSSS_NumOccasionDifferentPrecoder_decode_uper;
-per_type_encoder_f NSSS_NumOccasionDifferentPrecoder_encode_uper;
-per_type_decoder_f NSSS_NumOccasionDifferentPrecoder_decode_aper;
-per_type_encoder_f NSSS_NumOccasionDifferentPrecoder_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _NSSS_NumOccasionDifferentPrecoder_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/NULL.c b/3rdparty/libe2ap/NULL.c
deleted file mode 100644
index 4a2914f..0000000
--- a/3rdparty/libe2ap/NULL.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/*-
- * Copyright (c) 2003, 2005 Lev Walkin <vlm@lionet.info>. All rights reserved.
- * Redistribution and modifications are permitted subject to BSD license.
- */
-#include <asn_internal.h>
-#include <asn_codecs_prim.h>
-#include <NULL.h>
-#include <BOOLEAN.h>	/* Implemented in terms of BOOLEAN type */
-
-/*
- * NULL basic type description.
- */
-static const ber_tlv_tag_t asn_DEF_NULL_tags[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (5 << 2))
-};
-asn_TYPE_operation_t asn_OP_NULL = {
-	BOOLEAN_free,
-	NULL_print,
-	NULL_compare,
-	BOOLEAN_decode_ber,	/* Implemented in terms of BOOLEAN */
-	NULL_encode_der,	/* Special handling of DER encoding */
-	NULL_decode_xer,
-	NULL_encode_xer,
-#ifdef	ASN_DISABLE_OER_SUPPORT
-	0,
-	0,
-#else
-	NULL_decode_oer,
-	NULL_encode_oer,
-#endif  /* ASN_DISABLE_OER_SUPPORT */
-#ifdef	ASN_DISABLE_PER_SUPPORT
-	0,
-	0,
-	0,
-	0,
-#else
-	NULL_decode_uper,	/* Unaligned PER decoder */
-	NULL_encode_uper,	/* Unaligned PER encoder */
-	NULL_decode_aper,	/* Aligned PER decoder */
-	NULL_encode_aper,	/* Aligned PER encoder */
-#endif	/* ASN_DISABLE_PER_SUPPORT */
-	NULL_random_fill,
-	0	/* Use generic outmost tag fetcher */
-};
-asn_TYPE_descriptor_t asn_DEF_NULL = {
-	"NULL",
-	"NULL",
-	&asn_OP_NULL,
-	asn_DEF_NULL_tags,
-	sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]),
-	asn_DEF_NULL_tags,	/* Same as above */
-	sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]),
-	{ 0, 0, asn_generic_no_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
-asn_enc_rval_t
-NULL_encode_der(const asn_TYPE_descriptor_t *td, const void *ptr, int tag_mode,
-                ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) {
-	asn_enc_rval_t erval = {0,0,0};
-
-	erval.encoded = der_write_tags(td, 0, tag_mode, 0, tag, cb, app_key);
-	if(erval.encoded == -1) {
-		erval.failed_type = td;
-		erval.structure_ptr = ptr;
-	}
-
-	ASN__ENCODED_OK(erval);
-}
-
-asn_enc_rval_t
-NULL_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
-                enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb,
-                void *app_key) {
-	asn_enc_rval_t er = {0,0,0};
-
-	(void)td;
-	(void)sptr;
-	(void)ilevel;
-	(void)flags;
-	(void)cb;
-	(void)app_key;
-
-	/* XMLNullValue is empty */
-	er.encoded = 0;
-	ASN__ENCODED_OK(er);
-}
-
-
-static enum xer_pbd_rval
-NULL__xer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr,
-                      const void *chunk_buf, size_t chunk_size) {
-    (void)td;
-	(void)sptr;
-	(void)chunk_buf;    /* Going to be empty according to the rules below. */
-
-	/*
-	 * There must be no content in self-terminating <NULL/> tag.
-	 */
-	if(chunk_size)
-		return XPBD_BROKEN_ENCODING;
-	else
-		return XPBD_BODY_CONSUMED;
-}
-
-asn_dec_rval_t
-NULL_decode_xer(const asn_codec_ctx_t *opt_codec_ctx,
-                const asn_TYPE_descriptor_t *td, void **sptr,
-                const char *opt_mname, const void *buf_ptr, size_t size) {
-    return xer_decode_primitive(opt_codec_ctx, td,
-		sptr, sizeof(NULL_t), opt_mname, buf_ptr, size,
-		NULL__xer_body_decode);
-}
-
-int
-NULL_compare(const asn_TYPE_descriptor_t *td, const void *a, const void *b) {
-    (void)td;
-    (void)a;
-    (void)b;
-    return 0;
-}
-
-int
-NULL_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
-           asn_app_consume_bytes_f *cb, void *app_key) {
-    (void)td;	/* Unused argument */
-	(void)ilevel;	/* Unused argument */
-
-	if(sptr) {
-		return (cb("<present>", 9, app_key) < 0) ? -1 : 0;
-	} else {
-		return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
-	}
-}
-
-#ifndef ASN_DISABLE_OER_SUPPORT
-
-asn_dec_rval_t
-NULL_decode_oer(const asn_codec_ctx_t *opt_codec_ctx,
-                const asn_TYPE_descriptor_t *td,
-                const asn_oer_constraints_t *constraints, void **sptr,
-                const void *ptr, size_t size) {
-    asn_dec_rval_t rv = {RC_OK, 0};
-    (void)opt_codec_ctx;
-    (void)td;
-    (void)constraints;
-    (void)ptr;
-    (void)size;
-
-    if(!*sptr) {
-        *sptr = MALLOC(sizeof(NULL_t));
-        if(*sptr) {
-            *(NULL_t *)*sptr = 0;
-        } else {
-            ASN__DECODE_FAILED;
-        }
-    }
-
-    return rv;
-}
-
-asn_enc_rval_t
-NULL_encode_oer(const asn_TYPE_descriptor_t *td,
-                const asn_oer_constraints_t *constraints, const void *sptr,
-                asn_app_consume_bytes_f *cb, void *app_key) {
-    asn_enc_rval_t er = {0,0,0};
-
-    (void)td;
-    (void)sptr;
-    (void)constraints;
-    (void)cb;
-    (void)app_key;
-
-    er.encoded = 0; /* Encoding in 0 bytes. */
-
-    ASN__ENCODED_OK(er);
-}
-
-#endif /* ASN_DISABLE_OER_SUPPORT */
-
-#ifndef ASN_DISABLE_PER_SUPPORT
-
-asn_dec_rval_t
-NULL_decode_uper(const asn_codec_ctx_t *opt_codec_ctx,
-                 const asn_TYPE_descriptor_t *td,
-                 const asn_per_constraints_t *constraints, void **sptr,
-                 asn_per_data_t *pd) {
-    asn_dec_rval_t rv;
-
-	(void)opt_codec_ctx;
-	(void)td;
-	(void)constraints;
-	(void)pd;
-
-	if(!*sptr) {
-		*sptr = MALLOC(sizeof(NULL_t));
-		if(*sptr) {
-			*(NULL_t *)*sptr = 0;
-		} else {
-			ASN__DECODE_FAILED;
-		}
-	}
-
-	/*
-	 * NULL type does not have content octets.
-	 */
-
-	rv.code = RC_OK;
-	rv.consumed = 0;
-	return rv;
-}
-
-asn_enc_rval_t
-NULL_encode_uper(const asn_TYPE_descriptor_t *td,
-                 const asn_per_constraints_t *constraints, const void *sptr,
-                 asn_per_outp_t *po) {
-	asn_enc_rval_t er = {0,0,0};
-
-	(void)td;
-	(void)constraints;
-	(void)sptr;
-	(void)po;
-
-	er.encoded = 0;
-	ASN__ENCODED_OK(er);
-}
-
-asn_dec_rval_t
-NULL_decode_aper(const asn_codec_ctx_t *opt_codec_ctx,
-                 const asn_TYPE_descriptor_t *td,
-                 const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) {
-	asn_dec_rval_t rv = {RC_OK, 0};
-
-	(void)opt_codec_ctx;
-	(void)td;
-	(void)constraints;
-	(void)pd;
-
-	if(!*sptr) {
-		*sptr = MALLOC(sizeof(NULL_t));
-		if(*sptr) {
-			*(NULL_t *)*sptr = 0;
-		} else {
-			ASN__DECODE_FAILED;
-		}
-	}
-
-	/*
-	 * NULL type does not have content octets.
-	 */
-
-	rv.code = RC_OK;
-	rv.consumed = 0;
-	return rv;
-}
-
-
-asn_enc_rval_t
-NULL_encode_aper(const asn_TYPE_descriptor_t *td,
-                 const asn_per_constraints_t *constraints,
-                 const void *sptr, asn_per_outp_t *po) {
-	asn_enc_rval_t er = {0,0,0};
-
-	(void)td;
-	(void)constraints;
-	(void)sptr;
-	(void)po;
-
-	er.encoded = 0;
-	ASN__ENCODED_OK(er);
-}
-
-#endif  /* ASN_DISABLE_PER_SUPPORT */
-
-asn_random_fill_result_t
-NULL_random_fill(const asn_TYPE_descriptor_t *td, void **sptr,
-                    const asn_encoding_constraints_t *constr,
-                    size_t max_length) {
-    asn_random_fill_result_t result_ok = {ARFILL_OK, 1};
-    asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0};
-    asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0};
-    NULL_t *st = *sptr;
-
-    (void)td;
-    (void)constr;
-
-    if(max_length == 0) return result_skipped;
-
-    if(st == NULL) {
-        st = (NULL_t *)(*sptr = CALLOC(1, sizeof(*st)));
-        if(st == NULL) {
-            return result_failed;
-        }
-    }
-
-    return result_ok;
-}
-
diff --git a/3rdparty/libe2ap/NULL.h b/3rdparty/libe2ap/NULL.h
deleted file mode 100644
index 802d12c..0000000
--- a/3rdparty/libe2ap/NULL.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*-
- * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
- * Redistribution and modifications are permitted subject to BSD license.
- */
-#ifndef	ASN_TYPE_NULL_H
-#define	ASN_TYPE_NULL_H
-
-#include <asn_application.h>
-#include <BOOLEAN.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * The value of the NULL type is meaningless: see BOOLEAN if you want to
- * carry true/false semantics.
- */
-typedef int NULL_t;
-
-extern asn_TYPE_descriptor_t asn_DEF_NULL;
-extern asn_TYPE_operation_t asn_OP_NULL;
-
-asn_struct_print_f NULL_print;
-asn_struct_compare_f NULL_compare;
-der_type_encoder_f NULL_encode_der;
-xer_type_decoder_f NULL_decode_xer;
-xer_type_encoder_f NULL_encode_xer;
-oer_type_decoder_f NULL_decode_oer;
-oer_type_encoder_f NULL_encode_oer;
-per_type_decoder_f NULL_decode_uper;
-per_type_encoder_f NULL_encode_uper;
-per_type_decoder_f NULL_decode_aper;
-per_type_encoder_f NULL_encode_aper;
-asn_random_fill_f  NULL_random_fill;
-
-#define NULL_free	BOOLEAN_free
-#define NULL_decode_ber	BOOLEAN_decode_ber
-#define NULL_constraint	asn_generic_no_constraint
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* NULL_H */
diff --git a/3rdparty/libe2ap/Neighbour-Information.c b/3rdparty/libe2ap/Neighbour-Information.c
deleted file mode 100644
index 77ad804..0000000
--- a/3rdparty/libe2ap/Neighbour-Information.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "Neighbour-Information.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_per_constraints_t asn_PER_type_Neighbour_Information_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 10,  10,  0,  512 }	/* (SIZE(0..512)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_Member_2[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct Neighbour_Information__Member, eCGI),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"eCGI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct Neighbour_Information__Member, pCI),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_PCI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"pCI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct Neighbour_Information__Member, eARFCN),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_EARFCN,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"eARFCN"
-		},
-	{ ATF_POINTER, 1, offsetof(struct Neighbour_Information__Member, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P51,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_Member_oms_2[] = { 3 };
-static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* eCGI */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* pCI */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* eARFCN */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
-	sizeof(struct Neighbour_Information__Member),
-	offsetof(struct Neighbour_Information__Member, _asn_ctx),
-	asn_MAP_Member_tag2el_2,
-	4,	/* Count of tags in the map */
-	asn_MAP_Member_oms_2,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_Member_2 = {
-	"SEQUENCE",
-	"SEQUENCE",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Member_tags_2,
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	asn_DEF_Member_tags_2,	/* Same as above */
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Member_2,
-	4,	/* Elements count */
-	&asn_SPC_Member_specs_2	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_Neighbour_Information_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Member_2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_Neighbour_Information_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_Neighbour_Information_specs_1 = {
-	sizeof(struct Neighbour_Information),
-	offsetof(struct Neighbour_Information, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_Neighbour_Information = {
-	"Neighbour-Information",
-	"Neighbour-Information",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_Neighbour_Information_tags_1,
-	sizeof(asn_DEF_Neighbour_Information_tags_1)
-		/sizeof(asn_DEF_Neighbour_Information_tags_1[0]), /* 1 */
-	asn_DEF_Neighbour_Information_tags_1,	/* Same as above */
-	sizeof(asn_DEF_Neighbour_Information_tags_1)
-		/sizeof(asn_DEF_Neighbour_Information_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_Neighbour_Information_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_Neighbour_Information_1,
-	1,	/* Single element */
-	&asn_SPC_Neighbour_Information_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/Neighbour-Information.h b/3rdparty/libe2ap/Neighbour-Information.h
deleted file mode 100644
index dc1dfb6..0000000
--- a/3rdparty/libe2ap/Neighbour-Information.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_Neighbour_Information_H_
-#define	_Neighbour_Information_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "ECGI.h"
-#include "PCI.h"
-#include "EARFCN.h"
-#include "constr_SEQUENCE.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* Forward definitions */
-typedef struct Neighbour_Information__Member {
-	ECGI_t	 eCGI;
-	PCI_t	 pCI;
-	EARFCN_t	 eARFCN;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} Neighbour_Information__Member;
-
-/* Neighbour-Information */
-typedef struct Neighbour_Information {
-	A_SEQUENCE_OF(Neighbour_Information__Member) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} Neighbour_Information_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_Neighbour_Information;
-extern asn_SET_OF_specifics_t asn_SPC_Neighbour_Information_specs_1;
-extern asn_TYPE_member_t asn_MBR_Neighbour_Information_1[1];
-extern asn_per_constraints_t asn_PER_type_Neighbour_Information_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _Neighbour_Information_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/Number-of-Antennaports.c b/3rdparty/libe2ap/Number-of-Antennaports.c
deleted file mode 100644
index 2046471..0000000
--- a/3rdparty/libe2ap/Number-of-Antennaports.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "Number-of-Antennaports.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_Number_of_Antennaports_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_Number_of_Antennaports_value2enum_1[] = {
-	{ 0,	3,	"an1" },
-	{ 1,	3,	"an2" },
-	{ 2,	3,	"an4" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_Number_of_Antennaports_enum2value_1[] = {
-	0,	/* an1(0) */
-	1,	/* an2(1) */
-	2	/* an4(2) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_Number_of_Antennaports_specs_1 = {
-	asn_MAP_Number_of_Antennaports_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_Number_of_Antennaports_enum2value_1,	/* N => "tag"; sorted by N */
-	3,	/* Number of elements in the maps */
-	4,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_Number_of_Antennaports_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_Number_of_Antennaports = {
-	"Number-of-Antennaports",
-	"Number-of-Antennaports",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_Number_of_Antennaports_tags_1,
-	sizeof(asn_DEF_Number_of_Antennaports_tags_1)
-		/sizeof(asn_DEF_Number_of_Antennaports_tags_1[0]), /* 1 */
-	asn_DEF_Number_of_Antennaports_tags_1,	/* Same as above */
-	sizeof(asn_DEF_Number_of_Antennaports_tags_1)
-		/sizeof(asn_DEF_Number_of_Antennaports_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_Number_of_Antennaports_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_Number_of_Antennaports_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/Number-of-Antennaports.h b/3rdparty/libe2ap/Number-of-Antennaports.h
deleted file mode 100644
index 2aaf83e..0000000
--- a/3rdparty/libe2ap/Number-of-Antennaports.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_Number_of_Antennaports_H_
-#define	_Number_of_Antennaports_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum Number_of_Antennaports {
-	Number_of_Antennaports_an1	= 0,
-	Number_of_Antennaports_an2	= 1,
-	Number_of_Antennaports_an4	= 2
-	/*
-	 * Enumeration is extensible
-	 */
-} e_Number_of_Antennaports;
-
-/* Number-of-Antennaports */
-typedef long	 Number_of_Antennaports_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_Number_of_Antennaports;
-asn_struct_free_f Number_of_Antennaports_free;
-asn_struct_print_f Number_of_Antennaports_print;
-asn_constr_check_f Number_of_Antennaports_constraint;
-ber_type_decoder_f Number_of_Antennaports_decode_ber;
-der_type_encoder_f Number_of_Antennaports_encode_der;
-xer_type_decoder_f Number_of_Antennaports_decode_xer;
-xer_type_encoder_f Number_of_Antennaports_encode_xer;
-per_type_decoder_f Number_of_Antennaports_decode_uper;
-per_type_encoder_f Number_of_Antennaports_encode_uper;
-per_type_decoder_f Number_of_Antennaports_decode_aper;
-per_type_encoder_f Number_of_Antennaports_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _Number_of_Antennaports_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/OBJECT_IDENTIFIER.c b/3rdparty/libe2ap/OBJECT_IDENTIFIER.c
deleted file mode 100644
index 8dccf01..0000000
--- a/3rdparty/libe2ap/OBJECT_IDENTIFIER.c
+++ /dev/null
@@ -1,656 +0,0 @@
-/*-
- * Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
- * Redistribution and modifications are permitted subject to BSD license.
- */
-#include <asn_internal.h>
-#include <INTEGER.h>
-#include <OBJECT_IDENTIFIER.h>
-#include <OCTET_STRING.h>
-#include <limits.h>	/* for CHAR_BIT */
-#include <errno.h>
-
-/*
- * OBJECT IDENTIFIER basic type description.
- */
-static const ber_tlv_tag_t asn_DEF_OBJECT_IDENTIFIER_tags[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (6 << 2))
-};
-asn_TYPE_operation_t asn_OP_OBJECT_IDENTIFIER = {
-	ASN__PRIMITIVE_TYPE_free,
-	OBJECT_IDENTIFIER_print,
-	OCTET_STRING_compare,   /* Implemented in terms of a string comparison */
-	ber_decode_primitive,
-	der_encode_primitive,
-	OBJECT_IDENTIFIER_decode_xer,
-	OBJECT_IDENTIFIER_encode_xer,
-#ifdef	ASN_DISABLE_OER_SUPPORT
-	0,
-	0,
-#else
-	OBJECT_IDENTIFIER_decode_oer,
-	OBJECT_IDENTIFIER_encode_oer,
-#endif  /* ASN_DISABLE_OER_SUPPORT */
-#ifdef	ASN_DISABLE_PER_SUPPORT
-	0,
-	0,
-	0,
-	0,
-#else
-	OCTET_STRING_decode_uper,
-	OCTET_STRING_encode_uper,
-	OCTET_STRING_decode_aper,
-	OCTET_STRING_encode_aper,
-#endif	/* ASN_DISABLE_PER_SUPPORT */
-	OBJECT_IDENTIFIER_random_fill,
-	0	/* Use generic outmost tag fetcher */
-};
-asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER = {
-	"OBJECT IDENTIFIER",
-	"OBJECT_IDENTIFIER",
-	&asn_OP_OBJECT_IDENTIFIER,
-	asn_DEF_OBJECT_IDENTIFIER_tags,
-	sizeof(asn_DEF_OBJECT_IDENTIFIER_tags)
-	    / sizeof(asn_DEF_OBJECT_IDENTIFIER_tags[0]),
-	asn_DEF_OBJECT_IDENTIFIER_tags,	/* Same as above */
-	sizeof(asn_DEF_OBJECT_IDENTIFIER_tags)
-	    / sizeof(asn_DEF_OBJECT_IDENTIFIER_tags[0]),
-	{ 0, 0, OBJECT_IDENTIFIER_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
-int
-OBJECT_IDENTIFIER_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-                             asn_app_constraint_failed_f *ctfailcb,
-                             void *app_key) {
-    const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr;
-
-	if(st && st->buf) {
-		if(st->size < 1) {
-			ASN__CTFAIL(app_key, td, sptr,
-				"%s: at least one numerical value "
-				"expected (%s:%d)",
-				td->name, __FILE__, __LINE__);
-			return -1;
-		}
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-
-	return 0;
-}
-
-static ssize_t
-OBJECT_IDENTIFIER_get_first_arcs(const uint8_t *arcbuf, size_t arcbuf_len,
-                                 asn_oid_arc_t *arc0, asn_oid_arc_t *arc1) {
-    asn_oid_arc_t value;
-
-    ssize_t rd = OBJECT_IDENTIFIER_get_single_arc(arcbuf, arcbuf_len, &value);
-    if(rd <= 0) return rd;
-
-    if(value >= 80) {
-        *arc0 = 2;
-        *arc1 = value - 80;
-    } else if(value >= 40) {
-        *arc0 = 1;
-        *arc1 = value - 40;
-    } else {
-        *arc0 = 0;
-        *arc1 = value;
-    }
-
-    return rd;
-}
-
-ssize_t
-OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf, size_t arcbuf_len,
-                                 asn_oid_arc_t *ret_value) {
-    const uint8_t *b = arcbuf;
-    const uint8_t *arcend = arcbuf + arcbuf_len; /* End of arc */
-
-    if(arcbuf == arcend) {
-        return 0;
-    } else {
-        asn_oid_arc_t accum;
-	asn_oid_arc_t upper_limit = (ASN_OID_ARC_MAX >> 7);
-	/* When the value reaches "upper_limit", it can take */
-	/* at most one more digit. If it exceeds "upper_limit" */
-	/* but there are more digits - it's an Overflow condition */
-        /* Gather all bits into the accumulator */
-        for(accum = 0; b < arcend; b++) {
-            accum = (accum << 7) | (*b & ~0x80);
-            if((*b & 0x80) == 0) { // no more digits
-                if(accum <= ASN_OID_ARC_MAX) {
-                    *ret_value = accum;
-                    return 1 + (b - arcbuf);
-                } else {
-                    errno = ERANGE; /* Overflow */
-                    return -1;
-                }
-            } else { // to make sure we aren't wrapping around
-	      if(accum > upper_limit) {
-		    errno = ERANGE; /* Overflow */
-		    return -1;
-	      }
-	    }
-        }
-        errno = EINVAL;
-        return -1;
-    }
-
-}
-
-static ssize_t
-OBJECT_IDENTIFIER__dump_body(const OBJECT_IDENTIFIER_t *st,
-                             asn_app_consume_bytes_f *cb, void *app_key) {
-    char scratch[32];
-    asn_oid_arc_t arc0, arc1;
-    size_t produced = 0;
-    size_t off = 0;
-    ssize_t rd;
-    int ret;
-
-    rd = OBJECT_IDENTIFIER_get_first_arcs(st->buf, st->size, &arc0, &arc1);
-    if(rd <= 0) {
-        return -1;
-    }
-
-    ret = snprintf(scratch, sizeof(scratch), "%"PRIu32".%"PRIu32, arc0, arc1);
-    if(ret >= (ssize_t)sizeof(scratch)) {
-        return -1;
-    }
-    produced += ret;
-    if(cb(scratch, ret, app_key) < 0)
-        return -1;
-
-    for(off = rd; ; ) {
-        asn_oid_arc_t arc;
-        rd = OBJECT_IDENTIFIER_get_single_arc(st->buf + off, st->size - off,
-                                              &arc);
-        if(rd < 0) {
-            return -1;
-        } else if(rd == 0) {
-            /* No more arcs. */
-            break;
-        } else {
-            off += rd;
-            assert(off <= st->size);
-            ret = snprintf(scratch, sizeof(scratch), ".%" PRIu32, arc);
-            if(ret >= (ssize_t)sizeof(scratch)) {
-                return -1;
-            }
-            produced += ret;
-            if(cb(scratch, ret, app_key) < 0) return -1;
-        }
-    }
-
-    if(off != st->size) {
-        ASN_DEBUG("Could not scan to the end of Object Identifier");
-        return -1;
-    }
-
-	return produced;
-}
-
-static enum xer_pbd_rval
-OBJECT_IDENTIFIER__xer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr,
-                                   const void *chunk_buf, size_t chunk_size) {
-    OBJECT_IDENTIFIER_t *st = (OBJECT_IDENTIFIER_t *)sptr;
-	const char *chunk_end = (const char *)chunk_buf + chunk_size;
-	const char *endptr;
-	asn_oid_arc_t s_arcs[10];
-	asn_oid_arc_t *arcs = s_arcs;
-	ssize_t num_arcs;
-	ssize_t ret;
-
-	(void)td;
-
-    num_arcs = OBJECT_IDENTIFIER_parse_arcs(
-        (const char *)chunk_buf, chunk_size, arcs,
-        sizeof(s_arcs) / sizeof(s_arcs[0]), &endptr);
-    if(num_arcs < 0) {
-		/* Expecting more than zero arcs */
-		return XPBD_BROKEN_ENCODING;
-	} else if(num_arcs == 0) {
-		return XPBD_NOT_BODY_IGNORE;
-	}
-	assert(endptr == chunk_end);
-
-	if((size_t)num_arcs > sizeof(s_arcs)/sizeof(s_arcs[0])) {
-		arcs = (asn_oid_arc_t *)MALLOC(num_arcs * sizeof(asn_oid_arc_t));
-		if(!arcs) return XPBD_SYSTEM_FAILURE;
-        ret = OBJECT_IDENTIFIER_parse_arcs((const char *)chunk_buf, chunk_size,
-                                           arcs, num_arcs, &endptr);
-        if(ret != num_arcs)
-			return XPBD_SYSTEM_FAILURE;	/* assert?.. */
-	}
-
-	/*
-	 * Convert arcs into BER representation.
-	 */
-	ret = OBJECT_IDENTIFIER_set_arcs(st, arcs, num_arcs);
-	if(arcs != s_arcs) FREEMEM(arcs);
-
-	return ret ? XPBD_SYSTEM_FAILURE : XPBD_BODY_CONSUMED;
-}
-
-asn_dec_rval_t
-OBJECT_IDENTIFIER_decode_xer(const asn_codec_ctx_t *opt_codec_ctx,
-                             const asn_TYPE_descriptor_t *td, void **sptr,
-                             const char *opt_mname, const void *buf_ptr,
-                             size_t size) {
-    return xer_decode_primitive(opt_codec_ctx, td,
-		sptr, sizeof(OBJECT_IDENTIFIER_t), opt_mname,
-			buf_ptr, size, OBJECT_IDENTIFIER__xer_body_decode);
-}
-
-asn_enc_rval_t
-OBJECT_IDENTIFIER_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr,
-                             int ilevel, enum xer_encoder_flags_e flags,
-                             asn_app_consume_bytes_f *cb, void *app_key) {
-    const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr;
-    asn_enc_rval_t er = {0,0,0};
-
-    (void)ilevel;
-    (void)flags;
-
-    if(!st || !st->buf) {
-        ASN__ENCODE_FAILED;
-    }
-
-    er.encoded = OBJECT_IDENTIFIER__dump_body(st, cb, app_key);
-    if(er.encoded < 0) ASN__ENCODE_FAILED;
-
-    ASN__ENCODED_OK(er);
-}
-
-int
-OBJECT_IDENTIFIER_print(const asn_TYPE_descriptor_t *td, const void *sptr,
-                        int ilevel, asn_app_consume_bytes_f *cb,
-                        void *app_key) {
-    const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr;
-
-	(void)td;	/* Unused argument */
-	(void)ilevel;	/* Unused argument */
-
-	if(!st || !st->buf)
-		return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
-
-	/* Dump preamble */
-	if(cb("{ ", 2, app_key) < 0)
-		return -1;
-
-    if(OBJECT_IDENTIFIER__dump_body(st, cb, app_key) < 0) {
-        return -1;
-    }
-
-    return (cb(" }", 2, app_key) < 0) ? -1 : 0;
-}
-
-ssize_t
-OBJECT_IDENTIFIER_get_arcs(const OBJECT_IDENTIFIER_t *st, asn_oid_arc_t *arcs,
-                           size_t arc_slots) {
-    asn_oid_arc_t arc0, arc1;
-    size_t num_arcs = 0;
-    size_t off;
-    ssize_t rd;
-
-    if(!st || !st->buf) {
-        errno = EINVAL;
-        return -1;
-    }
-
-    rd = OBJECT_IDENTIFIER_get_first_arcs(st->buf, st->size, &arc0, &arc1);
-    if(rd <= 0) {
-        return -1;
-    }
-    num_arcs = 2;
-    switch(arc_slots) {
-    default:
-    case 2:
-        arcs[1] = arc1;
-        /* Fall through */
-    case 1:
-        arcs[0] = arc0;
-        /* Fall through */
-    case 0:
-        break;
-    }
-
-    for(off = rd; ; ) {
-        asn_oid_arc_t arc;
-        rd = OBJECT_IDENTIFIER_get_single_arc(st->buf + off, st->size - off,
-                                              &arc);
-        if(rd < 0) {
-            return -1;
-        } else if(rd == 0) {
-            /* No more arcs. */
-            break;
-        } else {
-            off += rd;
-            if(num_arcs < arc_slots) {
-                arcs[num_arcs] = arc;
-            }
-            num_arcs++;
-        }
-    }
-
-    if(off != st->size) {
-        return -1;
-    }
-
-    return num_arcs;
-}
-
-
-/*
- * Save the single value as an object identifier arc.
- */
-ssize_t
-OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, size_t arcbuf_len,
-                                 asn_oid_arc_t value) {
-    /*
-	 * The following conditions must hold:
-	 * assert(arcbuf);
-	 */
-    uint8_t scratch[((sizeof(value) * CHAR_BIT + 6) / 7)];
-    uint8_t *scratch_end = &scratch[sizeof(scratch)-1];
-    uint8_t *b;
-    size_t result_len;
-    uint8_t mask;
-
-    for(b = scratch_end, mask = 0; ; mask = 0x80, b--) {
-        *b = mask | (value & 0x7f);
-        value >>= 7;
-        if(!value) {
-            break;
-        }
-    }
-
-    result_len = (scratch_end - b) + 1;
-
-    if(result_len > arcbuf_len) {
-        return -1;
-    }
-
-    memcpy(arcbuf, b, result_len);
-
-	return result_len;
-}
-
-int
-OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *st, const asn_oid_arc_t *arcs,
-                           size_t arc_slots) {
-    uint8_t *buf;
-    uint8_t *bp;
-    ssize_t wrote;
-    asn_oid_arc_t arc0;
-    asn_oid_arc_t arc1;
-    size_t size;
-    size_t i;
-
-    if(!st || !arcs || arc_slots < 2) {
-        errno = EINVAL;
-		return -1;
-	}
-
-    arc0 = arcs[0];
-    arc1 = arcs[1];
-
-	if(arc0 <= 1) {
-		if(arc1 >= 40) {
-			/* 8.19.4: At most 39 subsequent values (including 0) */
-			errno = ERANGE;
-			return -1;
-		}
-    } else if(arc0 == 2) {
-        if(arc1 > ASN_OID_ARC_MAX - 80) {
-            errno = ERANGE;
-            return -1;
-        }
-    } else if(arc0 > 2) {
-        /* 8.19.4: Only three values are allocated from the root node */
-        errno = ERANGE;
-        return -1;
-    }
-
-    /*
-	 * After above tests it is known that the value of arc0 is completely
-	 * trustworthy (0..2). However, the arc1's value is still meaningless.
-	 */
-
-    /*
-     * Roughly estimate the maximum size necessary to encode these arcs.
-     * This estimation implicitly takes in account the following facts,
-     * that cancel each other:
-     * 	* the first two arcs are encoded in a single value.
-     * 	* the first value may require more space (+1 byte)
-     * 	* the value of the first arc which is in range (0..2)
-     */
-    size = ((sizeof(asn_oid_arc_t) * CHAR_BIT + 6) / 7) * arc_slots;
-    bp = buf = (uint8_t *)MALLOC(size + 1);
-    if(!buf) {
-        /* ENOMEM */
-        return -1;
-    }
-
-    wrote = OBJECT_IDENTIFIER_set_single_arc(bp, size, arc0 * 40 + arc1);
-    if(wrote <= 0) {
-        FREEMEM(buf);
-        return -1;
-    }
-    assert((size_t)wrote <= size);
-    bp += wrote;
-    size -= wrote;
-
-    for(i = 2; i < arc_slots; i++) {
-		wrote = OBJECT_IDENTIFIER_set_single_arc(bp, size, arcs[i]);
-        if(wrote <= 0) {
-            FREEMEM(buf);
-            return -1;
-        }
-        assert((size_t)wrote <= size);
-        bp += wrote;
-        size -= wrote;
-    }
-
-    /*
-	 * Replace buffer.
-	 */
-	st->size = bp - buf;
-	bp = st->buf;
-	st->buf = buf;
-	st->buf[st->size] = '\0';
-	if(bp) FREEMEM(bp);
-
-	return 0;
-}
-
-ssize_t
-OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length,
-                             asn_oid_arc_t *arcs, size_t arcs_count,
-                             const char **opt_oid_text_end) {
-    size_t num_arcs = 0;
-    const char *oid_end;
-	enum {
-		ST_LEADSPACE,
-		ST_TAILSPACE,
-		ST_AFTERVALUE,	/* Next character ought to be '.' or a space */
-		ST_WAITDIGITS 	/* Next character is expected to be a digit */
-	} state = ST_LEADSPACE;
-
-	if(!oid_text || oid_txt_length < -1 || (arcs_count && !arcs)) {
-		if(opt_oid_text_end) *opt_oid_text_end = oid_text;
-		errno = EINVAL;
-		return -1;
-	}
-
-	if(oid_txt_length == -1)
-		oid_txt_length = strlen(oid_text);
-
-#define _OID_CAPTURE_ARC(oid_text, oid_end)                       \
-    do {                                                          \
-        const char *endp = oid_end;                               \
-        unsigned long value;                                      \
-        switch(asn_strtoul_lim(oid_text, &endp, &value)) {        \
-        case ASN_STRTOX_EXTRA_DATA:                               \
-        case ASN_STRTOX_OK:                                       \
-            if(value <= ASN_OID_ARC_MAX) {                        \
-                if(num_arcs < arcs_count) arcs[num_arcs] = value; \
-                num_arcs++;                                       \
-                oid_text = endp - 1;                              \
-                break;                                            \
-            }                                                     \
-            /* Fall through */                                    \
-        case ASN_STRTOX_ERROR_RANGE:                              \
-            if(opt_oid_text_end) *opt_oid_text_end = oid_text;    \
-            errno = ERANGE;                                       \
-            return -1;                                            \
-        case ASN_STRTOX_ERROR_INVAL:                              \
-        case ASN_STRTOX_EXPECT_MORE:                              \
-            if(opt_oid_text_end) *opt_oid_text_end = oid_text;    \
-            errno = EINVAL;                                       \
-            return -1;                                            \
-        }                                                         \
-    } while(0)
-
-    for(oid_end = oid_text + oid_txt_length; oid_text<oid_end; oid_text++) {
-	    switch(*oid_text) {
-	    case 0x09: case 0x0a: case 0x0d: case 0x20:	/* whitespace */
-		switch(state) {
-		case ST_LEADSPACE:
-		case ST_TAILSPACE:
-			continue;
-		case ST_AFTERVALUE:
-			state = ST_TAILSPACE;
-			continue;
-		case ST_WAITDIGITS:
-			break;	/* Digits expected after ".", got whitespace */
-		}
-		break;
-	    case 0x2e:	/* '.' */
-		switch(state) {
-		case ST_LEADSPACE:
-		case ST_TAILSPACE:
-		case ST_WAITDIGITS:
-			if(opt_oid_text_end)
-				*opt_oid_text_end = oid_text;
-			errno = EINVAL;	/* Broken OID */
-			return -1;
-			break;
-		case ST_AFTERVALUE:
-			state = ST_WAITDIGITS;
-			continue;
-		}
-		break;
-	    case 0x30: case 0x31: case 0x32: case 0x33: case 0x34:
-	    case 0x35: case 0x36: case 0x37: case 0x38: case 0x39:
-		switch(state) {
-		case ST_TAILSPACE:
-		case ST_AFTERVALUE:
-			if(opt_oid_text_end)
-				*opt_oid_text_end = oid_text;
-			errno = EINVAL;	/* "1. 1" => broken OID */
-			return -1;
-		case ST_LEADSPACE:
-		case ST_WAITDIGITS:
-			_OID_CAPTURE_ARC(oid_text, oid_end);
-			state = ST_AFTERVALUE;
-			continue;
-		}
-		break;
-	    default:
-		/* Unexpected symbols */
-		state = ST_WAITDIGITS;
-		break;
-	    } /* switch() */
-	    break;
-	} /* for() */
-
-
-	if(opt_oid_text_end) *opt_oid_text_end = oid_text;
-
-	/* Finalize last arc */
-	switch(state) {
-	case ST_LEADSPACE:
-		return 0; /* No OID found in input data */
-	case ST_WAITDIGITS:
-		errno = EINVAL;	/* Broken OID */
-		return -1;
-	case ST_AFTERVALUE:
-	case ST_TAILSPACE:
-		return num_arcs;
-	}
-
-	errno = EINVAL;	/* Broken OID */
-	return -1;
-}
-
-/*
- * Generate values from the list of interesting values, or just a random
- * value up to the upper limit.
- */
-static asn_oid_arc_t
-OBJECT_IDENTIFIER__biased_random_arc(asn_oid_arc_t upper_bound) {
-    const asn_oid_arc_t values[] = {0, 1, 127, 128, 129, 254, 255, 256};
-    size_t idx;
-
-    switch(asn_random_between(0, 2)) {
-    case 0:
-        idx = asn_random_between(0, sizeof(values) / sizeof(values[0]) - 1);
-        if(values[idx] < upper_bound) {
-            return values[idx];
-        }
-        /* Fall through */
-    case 1:
-        return asn_random_between(0, upper_bound);
-    case 2:
-    default:
-        return upper_bound;
-    }
-}
-
-asn_random_fill_result_t
-OBJECT_IDENTIFIER_random_fill(const asn_TYPE_descriptor_t *td, void **sptr,
-                              const asn_encoding_constraints_t *constraints,
-                              size_t max_length) {
-    asn_random_fill_result_t result_ok = {ARFILL_OK, 1};
-    asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0};
-    asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0};
-    OBJECT_IDENTIFIER_t *st;
-    asn_oid_arc_t arcs[5];
-    size_t arcs_len = asn_random_between(2, 5);
-    size_t i;
-
-    (void)constraints;
-
-    if(max_length < arcs_len) return result_skipped;
-
-    if(*sptr) {
-        st = *sptr;
-    } else {
-        st = CALLOC(1, sizeof(*st));
-    }
-
-    arcs[0] = asn_random_between(0, 2);
-    arcs[1] = OBJECT_IDENTIFIER__biased_random_arc(
-        arcs[0] <= 1 ? 39 : (ASN_OID_ARC_MAX - 80));
-    for(i = 2; i < arcs_len; i++) {
-        arcs[i] = OBJECT_IDENTIFIER__biased_random_arc(ASN_OID_ARC_MAX);
-    }
-
-    if(OBJECT_IDENTIFIER_set_arcs(st, arcs, arcs_len)) {
-        if(st != *sptr) {
-            ASN_STRUCT_FREE(*td, st);
-        }
-        return result_failed;
-    }
-
-    *sptr = st;
-
-    result_ok.length = st->size;
-    return result_ok;
-}
diff --git a/3rdparty/libe2ap/OBJECT_IDENTIFIER.h b/3rdparty/libe2ap/OBJECT_IDENTIFIER.h
deleted file mode 100644
index 087c6fd..0000000
--- a/3rdparty/libe2ap/OBJECT_IDENTIFIER.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
- * Redistribution and modifications are permitted subject to BSD license.
- */
-#ifndef	_OBJECT_IDENTIFIER_H_
-#define	_OBJECT_IDENTIFIER_H_
-
-#include <asn_application.h>
-#include <asn_codecs_prim.h>
-#include <OCTET_STRING.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef uint32_t asn_oid_arc_t;
-#define ASN_OID_ARC_MAX (~((asn_oid_arc_t)0))
-
-typedef ASN__PRIMITIVE_TYPE_t OBJECT_IDENTIFIER_t;
-
-extern asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER;
-extern asn_TYPE_operation_t asn_OP_OBJECT_IDENTIFIER;
-
-asn_struct_print_f OBJECT_IDENTIFIER_print;
-asn_constr_check_f OBJECT_IDENTIFIER_constraint;
-der_type_encoder_f OBJECT_IDENTIFIER_encode_der;
-xer_type_decoder_f OBJECT_IDENTIFIER_decode_xer;
-xer_type_encoder_f OBJECT_IDENTIFIER_encode_xer;
-asn_random_fill_f  OBJECT_IDENTIFIER_random_fill;
-
-#define OBJECT_IDENTIFIER_free           ASN__PRIMITIVE_TYPE_free
-#define OBJECT_IDENTIFIER_compare        OCTET_STRING_compare
-#define OBJECT_IDENTIFIER_decode_ber     ber_decode_primitive
-#define OBJECT_IDENTIFIER_encode_der     der_encode_primitive
-#define OBJECT_IDENTIFIER_decode_oer     oer_decode_primitive
-#define OBJECT_IDENTIFIER_encode_oer     oer_encode_primitive
-#define OBJECT_IDENTIFIER_decode_uper    OCTET_STRING_decode_uper
-#define OBJECT_IDENTIFIER_encode_uper    OCTET_STRING_encode_uper
-#define OBJECT_IDENTIFIER_decode_aper    OCTET_STRING_decode_aper
-#define OBJECT_IDENTIFIER_encode_aper    OCTET_STRING_encode_aper
-
-/**********************************
- * Some handy conversion routines *
- **********************************/
-
-/*
- * This function fills an (arcs) array with OBJECT IDENTIFIER arcs
- * up to specified (arc_slots) elements.
- *
- * EXAMPLE:
- * 	void print_arcs(OBJECT_IDENTIFIER_t *oid) {
- * 		asn_oid_arc_t fixed_arcs[10];	// Try with fixed space first
- * 		asn_oid_arc_t *arcs = fixed_arcs;
- * 		size_t arc_slots = sizeof(fixed_arcs)/sizeof(fixed_arcs[0]); // 10
- * 		ssize_t count;	// Real number of arcs.
- * 		int i;
- *
- * 		count = OBJECT_IDENTIFIER_get_arcs(oid, arcs, arc_slots);
- * 		// If necessary, reallocate arcs array and try again.
- * 		if(count > arc_slots) {
- * 			arc_slots = count;
- * 			arcs = malloc(sizeof(asn_oid_arc_t) * arc_slots);
- * 			if(!arcs) return;
- * 			count = OBJECT_IDENTIFIER_get_arcs(oid, arcs, arc_slots);
- * 			assert(count == arc_slots);
- * 		}
- *
- * 		// Print the contents of the arcs array.
- * 		for(i = 0; i < count; i++)
- * 			printf("%"PRIu32"\n", arcs[i]);
- *
- * 		// Avoid memory leak.
- * 		if(arcs != fixed_arcs) free(arcs);
- * 	}
- *
- * RETURN VALUES:
- * -1/EINVAL:	Invalid arguments (oid is missing)
- * -1/ERANGE:	One or more arcs have value out of array cell type range.
- * >=0:		Number of arcs contained in the OBJECT IDENTIFIER
- *
- * WARNING: The function always returns the actual number of arcs,
- * even if there is no sufficient (arc_slots) provided.
- */
-ssize_t OBJECT_IDENTIFIER_get_arcs(const OBJECT_IDENTIFIER_t *oid,
-                                   asn_oid_arc_t *arcs, size_t arc_slots);
-
-/*
- * This functions initializes the OBJECT IDENTIFIER object with
- * the given set of arcs.
- * The minimum of two arcs must be present; some restrictions apply.
- * RETURN VALUES:
- * -1/EINVAL:	Invalid arguments
- * -1/ERANGE:	The first two arcs do not conform to ASN.1 restrictions.
- * -1/ENOMEM:	Memory allocation failed
- * 0:		The object was initialized with new arcs.
- */
-int OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid,
-                               const asn_oid_arc_t *arcs, size_t arcs_count);
-
-
-/*
- * Parse the OBJECT IDENTIFIER textual representation ("1.3.6.1.4.1.9363").
- * No arc can exceed the (0..ASN_OID_ARC_MAX, which is the same as UINT32_MAX).
- * This function is not specific to OBJECT IDENTIFIER, it may be used to parse
- * the RELATIVE-OID data, or any other data consisting of dot-separated
- * series of numeric values.
- *
- * If (oid_txt_length == -1), the strlen() will be invoked to determine the
- * size of the (oid_text) string.
- * 
- * After return, the optional (opt_oid_text_end) is set to the character after
- * the last parsed one. (opt_oid_text_end) is never less than (oid_text).
- * 
- * RETURN VALUES:
- *   -1:	Parse error.
- * >= 0:	Number of arcs contained in the OBJECT IDENTIFIER.
- * 
- * WARNING: The function always returns the real number of arcs,
- * even if there is no sufficient (arc_slots) provided.
- * This is useful for (arc_slots) value estimation.
- */
-ssize_t OBJECT_IDENTIFIER_parse_arcs(const char *oid_text,
-                                     ssize_t oid_txt_length,
-                                     asn_oid_arc_t *arcs, size_t arcs_count,
-                                     const char **opt_oid_text_end);
-
-/*
- * Internal functions.
- * Used by RELATIVE-OID implementation in particular.
- */
-
-/*
- * Retrieve a single arc of size from the (arcbuf) buffer.
- * RETURN VALUES:
- *  -1: Failed to retrieve the value from the (arcbuf).
- *  >0: Number of bytes consumed from the (arcbuf), <= (arcbuf_len).
- */
-ssize_t OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf,
-                                         size_t arcbuf_len,
-                                         asn_oid_arc_t *ret_value);
-
-/*
- * Write the unterminated arc value into the (arcbuf) which has the size at
- * least (arcbuf_len).
- * RETURN VALUES:
- *   -1: (arcbuf_len) size is not sufficient to write the value.
- *  <n>: Number of bytes appended to the arcbuf (<= arcbuf_len).
- */
-ssize_t OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, size_t arcbuf_len,
-                                         asn_oid_arc_t arc_value);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _OBJECT_IDENTIFIER_H_ */
diff --git a/3rdparty/libe2ap/OffsetOfNbiotChannelNumberToEARFCN.c b/3rdparty/libe2ap/OffsetOfNbiotChannelNumberToEARFCN.c
deleted file mode 100644
index ac1efcf..0000000
--- a/3rdparty/libe2ap/OffsetOfNbiotChannelNumberToEARFCN.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "OffsetOfNbiotChannelNumberToEARFCN.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_OffsetOfNbiotChannelNumberToEARFCN_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  5,  5,  0,  20 }	/* (0..20,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_OffsetOfNbiotChannelNumberToEARFCN_value2enum_1[] = {
-	{ 0,	8,	"minusTen" },
-	{ 1,	9,	"minusNine" },
-	{ 2,	10,	"minusEight" },
-	{ 3,	10,	"minusSeven" },
-	{ 4,	8,	"minusSix" },
-	{ 5,	9,	"minusFive" },
-	{ 6,	9,	"minusFour" },
-	{ 7,	10,	"minusThree" },
-	{ 8,	8,	"minusTwo" },
-	{ 9,	8,	"minusOne" },
-	{ 10,	16,	"minusZeroDotFive" },
-	{ 11,	4,	"zero" },
-	{ 12,	3,	"one" },
-	{ 13,	3,	"two" },
-	{ 14,	5,	"three" },
-	{ 15,	4,	"four" },
-	{ 16,	4,	"five" },
-	{ 17,	3,	"six" },
-	{ 18,	5,	"seven" },
-	{ 19,	5,	"eight" },
-	{ 20,	4,	"nine" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_OffsetOfNbiotChannelNumberToEARFCN_enum2value_1[] = {
-	19,	/* eight(19) */
-	16,	/* five(16) */
-	15,	/* four(15) */
-	2,	/* minusEight(2) */
-	5,	/* minusFive(5) */
-	6,	/* minusFour(6) */
-	1,	/* minusNine(1) */
-	9,	/* minusOne(9) */
-	3,	/* minusSeven(3) */
-	4,	/* minusSix(4) */
-	0,	/* minusTen(0) */
-	7,	/* minusThree(7) */
-	8,	/* minusTwo(8) */
-	10,	/* minusZeroDotFive(10) */
-	20,	/* nine(20) */
-	12,	/* one(12) */
-	18,	/* seven(18) */
-	17,	/* six(17) */
-	14,	/* three(14) */
-	13,	/* two(13) */
-	11	/* zero(11) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_OffsetOfNbiotChannelNumberToEARFCN_specs_1 = {
-	asn_MAP_OffsetOfNbiotChannelNumberToEARFCN_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_OffsetOfNbiotChannelNumberToEARFCN_enum2value_1,	/* N => "tag"; sorted by N */
-	21,	/* Number of elements in the maps */
-	22,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_OffsetOfNbiotChannelNumberToEARFCN_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_OffsetOfNbiotChannelNumberToEARFCN = {
-	"OffsetOfNbiotChannelNumberToEARFCN",
-	"OffsetOfNbiotChannelNumberToEARFCN",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_OffsetOfNbiotChannelNumberToEARFCN_tags_1,
-	sizeof(asn_DEF_OffsetOfNbiotChannelNumberToEARFCN_tags_1)
-		/sizeof(asn_DEF_OffsetOfNbiotChannelNumberToEARFCN_tags_1[0]), /* 1 */
-	asn_DEF_OffsetOfNbiotChannelNumberToEARFCN_tags_1,	/* Same as above */
-	sizeof(asn_DEF_OffsetOfNbiotChannelNumberToEARFCN_tags_1)
-		/sizeof(asn_DEF_OffsetOfNbiotChannelNumberToEARFCN_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_OffsetOfNbiotChannelNumberToEARFCN_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_OffsetOfNbiotChannelNumberToEARFCN_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/OffsetOfNbiotChannelNumberToEARFCN.h b/3rdparty/libe2ap/OffsetOfNbiotChannelNumberToEARFCN.h
deleted file mode 100644
index d3b3c08..0000000
--- a/3rdparty/libe2ap/OffsetOfNbiotChannelNumberToEARFCN.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_OffsetOfNbiotChannelNumberToEARFCN_H_
-#define	_OffsetOfNbiotChannelNumberToEARFCN_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum OffsetOfNbiotChannelNumberToEARFCN {
-	OffsetOfNbiotChannelNumberToEARFCN_minusTen	= 0,
-	OffsetOfNbiotChannelNumberToEARFCN_minusNine	= 1,
-	OffsetOfNbiotChannelNumberToEARFCN_minusEight	= 2,
-	OffsetOfNbiotChannelNumberToEARFCN_minusSeven	= 3,
-	OffsetOfNbiotChannelNumberToEARFCN_minusSix	= 4,
-	OffsetOfNbiotChannelNumberToEARFCN_minusFive	= 5,
-	OffsetOfNbiotChannelNumberToEARFCN_minusFour	= 6,
-	OffsetOfNbiotChannelNumberToEARFCN_minusThree	= 7,
-	OffsetOfNbiotChannelNumberToEARFCN_minusTwo	= 8,
-	OffsetOfNbiotChannelNumberToEARFCN_minusOne	= 9,
-	OffsetOfNbiotChannelNumberToEARFCN_minusZeroDotFive	= 10,
-	OffsetOfNbiotChannelNumberToEARFCN_zero	= 11,
-	OffsetOfNbiotChannelNumberToEARFCN_one	= 12,
-	OffsetOfNbiotChannelNumberToEARFCN_two	= 13,
-	OffsetOfNbiotChannelNumberToEARFCN_three	= 14,
-	OffsetOfNbiotChannelNumberToEARFCN_four	= 15,
-	OffsetOfNbiotChannelNumberToEARFCN_five	= 16,
-	OffsetOfNbiotChannelNumberToEARFCN_six	= 17,
-	OffsetOfNbiotChannelNumberToEARFCN_seven	= 18,
-	OffsetOfNbiotChannelNumberToEARFCN_eight	= 19,
-	OffsetOfNbiotChannelNumberToEARFCN_nine	= 20
-	/*
-	 * Enumeration is extensible
-	 */
-} e_OffsetOfNbiotChannelNumberToEARFCN;
-
-/* OffsetOfNbiotChannelNumberToEARFCN */
-typedef long	 OffsetOfNbiotChannelNumberToEARFCN_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_OffsetOfNbiotChannelNumberToEARFCN;
-asn_struct_free_f OffsetOfNbiotChannelNumberToEARFCN_free;
-asn_struct_print_f OffsetOfNbiotChannelNumberToEARFCN_print;
-asn_constr_check_f OffsetOfNbiotChannelNumberToEARFCN_constraint;
-ber_type_decoder_f OffsetOfNbiotChannelNumberToEARFCN_decode_ber;
-der_type_encoder_f OffsetOfNbiotChannelNumberToEARFCN_encode_der;
-xer_type_decoder_f OffsetOfNbiotChannelNumberToEARFCN_decode_xer;
-xer_type_encoder_f OffsetOfNbiotChannelNumberToEARFCN_encode_xer;
-per_type_decoder_f OffsetOfNbiotChannelNumberToEARFCN_decode_uper;
-per_type_encoder_f OffsetOfNbiotChannelNumberToEARFCN_encode_uper;
-per_type_decoder_f OffsetOfNbiotChannelNumberToEARFCN_decode_aper;
-per_type_encoder_f OffsetOfNbiotChannelNumberToEARFCN_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _OffsetOfNbiotChannelNumberToEARFCN_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/Old-ECGIs.c b/3rdparty/libe2ap/Old-ECGIs.c
deleted file mode 100644
index 913b990..0000000
--- a/3rdparty/libe2ap/Old-ECGIs.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "Old-ECGIs.h"
-
-#include "ECGI.h"
-static asn_per_constraints_t asn_PER_type_Old_ECGIs_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_Old_ECGIs_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_Old_ECGIs_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_Old_ECGIs_specs_1 = {
-	sizeof(struct Old_ECGIs),
-	offsetof(struct Old_ECGIs, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_Old_ECGIs = {
-	"Old-ECGIs",
-	"Old-ECGIs",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_Old_ECGIs_tags_1,
-	sizeof(asn_DEF_Old_ECGIs_tags_1)
-		/sizeof(asn_DEF_Old_ECGIs_tags_1[0]), /* 1 */
-	asn_DEF_Old_ECGIs_tags_1,	/* Same as above */
-	sizeof(asn_DEF_Old_ECGIs_tags_1)
-		/sizeof(asn_DEF_Old_ECGIs_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_Old_ECGIs_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_Old_ECGIs_1,
-	1,	/* Single element */
-	&asn_SPC_Old_ECGIs_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/Old-ECGIs.h b/3rdparty/libe2ap/Old-ECGIs.h
deleted file mode 100644
index 2b8f542..0000000
--- a/3rdparty/libe2ap/Old-ECGIs.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_Old_ECGIs_H_
-#define	_Old_ECGIs_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ECGI;
-
-/* Old-ECGIs */
-typedef struct Old_ECGIs {
-	A_SEQUENCE_OF(struct ECGI) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} Old_ECGIs_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_Old_ECGIs;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _Old_ECGIs_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/Oneframe.c b/3rdparty/libe2ap/Oneframe.c
deleted file mode 100644
index b34783e..0000000
--- a/3rdparty/libe2ap/Oneframe.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "Oneframe.h"
-
-int
-Oneframe_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 6)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using BIT_STRING,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_Oneframe_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  6,  6 }	/* (SIZE(6..6)) */,
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_Oneframe_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_Oneframe = {
-	"Oneframe",
-	"Oneframe",
-	&asn_OP_BIT_STRING,
-	asn_DEF_Oneframe_tags_1,
-	sizeof(asn_DEF_Oneframe_tags_1)
-		/sizeof(asn_DEF_Oneframe_tags_1[0]), /* 1 */
-	asn_DEF_Oneframe_tags_1,	/* Same as above */
-	sizeof(asn_DEF_Oneframe_tags_1)
-		/sizeof(asn_DEF_Oneframe_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_Oneframe_constr_1, Oneframe_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_BIT_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/Oneframe.h b/3rdparty/libe2ap/Oneframe.h
deleted file mode 100644
index 05299a2..0000000
--- a/3rdparty/libe2ap/Oneframe.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_Oneframe_H_
-#define	_Oneframe_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Oneframe */
-typedef BIT_STRING_t	 Oneframe_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_Oneframe_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_Oneframe;
-asn_struct_free_f Oneframe_free;
-asn_struct_print_f Oneframe_print;
-asn_constr_check_f Oneframe_constraint;
-ber_type_decoder_f Oneframe_decode_ber;
-der_type_encoder_f Oneframe_encode_der;
-xer_type_decoder_f Oneframe_decode_xer;
-xer_type_encoder_f Oneframe_encode_xer;
-per_type_decoder_f Oneframe_decode_uper;
-per_type_encoder_f Oneframe_encode_uper;
-per_type_decoder_f Oneframe_decode_aper;
-per_type_encoder_f Oneframe_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _Oneframe_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/PA-Values.c b/3rdparty/libe2ap/PA-Values.c
deleted file mode 100644
index 6ca7b6b..0000000
--- a/3rdparty/libe2ap/PA-Values.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "PA-Values.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_PA_Values_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  7 }	/* (0..7,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_PA_Values_value2enum_1[] = {
-	{ 0,	4,	"dB-6" },
-	{ 1,	9,	"dB-4dot77" },
-	{ 2,	4,	"dB-3" },
-	{ 3,	9,	"dB-1dot77" },
-	{ 4,	3,	"dB0" },
-	{ 5,	3,	"dB1" },
-	{ 6,	3,	"dB2" },
-	{ 7,	3,	"dB3" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_PA_Values_enum2value_1[] = {
-	3,	/* dB-1dot77(3) */
-	2,	/* dB-3(2) */
-	1,	/* dB-4dot77(1) */
-	0,	/* dB-6(0) */
-	4,	/* dB0(4) */
-	5,	/* dB1(5) */
-	6,	/* dB2(6) */
-	7	/* dB3(7) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_PA_Values_specs_1 = {
-	asn_MAP_PA_Values_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_PA_Values_enum2value_1,	/* N => "tag"; sorted by N */
-	8,	/* Number of elements in the maps */
-	9,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_PA_Values_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_PA_Values = {
-	"PA-Values",
-	"PA-Values",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_PA_Values_tags_1,
-	sizeof(asn_DEF_PA_Values_tags_1)
-		/sizeof(asn_DEF_PA_Values_tags_1[0]), /* 1 */
-	asn_DEF_PA_Values_tags_1,	/* Same as above */
-	sizeof(asn_DEF_PA_Values_tags_1)
-		/sizeof(asn_DEF_PA_Values_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_PA_Values_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_PA_Values_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/PA-Values.h b/3rdparty/libe2ap/PA-Values.h
deleted file mode 100644
index eb5f323..0000000
--- a/3rdparty/libe2ap/PA-Values.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_PA_Values_H_
-#define	_PA_Values_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum PA_Values {
-	PA_Values_dB_6	= 0,
-	PA_Values_dB_4dot77	= 1,
-	PA_Values_dB_3	= 2,
-	PA_Values_dB_1dot77	= 3,
-	PA_Values_dB0	= 4,
-	PA_Values_dB1	= 5,
-	PA_Values_dB2	= 6,
-	PA_Values_dB3	= 7
-	/*
-	 * Enumeration is extensible
-	 */
-} e_PA_Values;
-
-/* PA-Values */
-typedef long	 PA_Values_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_PA_Values_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_PA_Values;
-extern const asn_INTEGER_specifics_t asn_SPC_PA_Values_specs_1;
-asn_struct_free_f PA_Values_free;
-asn_struct_print_f PA_Values_print;
-asn_constr_check_f PA_Values_constraint;
-ber_type_decoder_f PA_Values_decode_ber;
-der_type_encoder_f PA_Values_encode_der;
-xer_type_decoder_f PA_Values_decode_xer;
-xer_type_encoder_f PA_Values_encode_xer;
-per_type_decoder_f PA_Values_decode_uper;
-per_type_encoder_f PA_Values_encode_uper;
-per_type_decoder_f PA_Values_decode_aper;
-per_type_encoder_f PA_Values_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _PA_Values_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/PCI.c b/3rdparty/libe2ap/PCI.c
deleted file mode 100644
index 1993508..0000000
--- a/3rdparty/libe2ap/PCI.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "PCI.h"
-
-int
-PCI_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 503)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_PCI_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  9,  9,  0,  503 }	/* (0..503,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_PCI_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_PCI = {
-	"PCI",
-	"PCI",
-	&asn_OP_NativeInteger,
-	asn_DEF_PCI_tags_1,
-	sizeof(asn_DEF_PCI_tags_1)
-		/sizeof(asn_DEF_PCI_tags_1[0]), /* 1 */
-	asn_DEF_PCI_tags_1,	/* Same as above */
-	sizeof(asn_DEF_PCI_tags_1)
-		/sizeof(asn_DEF_PCI_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_PCI_constr_1, PCI_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/PCI.h b/3rdparty/libe2ap/PCI.h
deleted file mode 100644
index 497e350..0000000
--- a/3rdparty/libe2ap/PCI.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_PCI_H_
-#define	_PCI_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* PCI */
-typedef long	 PCI_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_PCI_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_PCI;
-asn_struct_free_f PCI_free;
-asn_struct_print_f PCI_print;
-asn_constr_check_f PCI_constraint;
-ber_type_decoder_f PCI_decode_ber;
-der_type_encoder_f PCI_encode_der;
-xer_type_decoder_f PCI_decode_xer;
-xer_type_encoder_f PCI_encode_xer;
-per_type_decoder_f PCI_decode_uper;
-per_type_encoder_f PCI_encode_uper;
-per_type_decoder_f PCI_decode_aper;
-per_type_encoder_f PCI_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _PCI_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/PLMN-Identity.c b/3rdparty/libe2ap/PLMN-Identity.c
deleted file mode 100644
index f8e20a3..0000000
--- a/3rdparty/libe2ap/PLMN-Identity.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "PLMN-Identity.h"
-
-int
-PLMN_Identity_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	size = st->size;
-	
-	if((size == 3)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_PLMN_Identity_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  3,  3 }	/* (SIZE(3..3)) */,
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_PLMN_Identity_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_PLMN_Identity = {
-	"PLMN-Identity",
-	"PLMN-Identity",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_PLMN_Identity_tags_1,
-	sizeof(asn_DEF_PLMN_Identity_tags_1)
-		/sizeof(asn_DEF_PLMN_Identity_tags_1[0]), /* 1 */
-	asn_DEF_PLMN_Identity_tags_1,	/* Same as above */
-	sizeof(asn_DEF_PLMN_Identity_tags_1)
-		/sizeof(asn_DEF_PLMN_Identity_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_PLMN_Identity_constr_1, PLMN_Identity_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/PLMN-Identity.h b/3rdparty/libe2ap/PLMN-Identity.h
deleted file mode 100644
index 5fefda7..0000000
--- a/3rdparty/libe2ap/PLMN-Identity.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_PLMN_Identity_H_
-#define	_PLMN_Identity_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* PLMN-Identity */
-typedef OCTET_STRING_t	 PLMN_Identity_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_PLMN_Identity_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_PLMN_Identity;
-asn_struct_free_f PLMN_Identity_free;
-asn_struct_print_f PLMN_Identity_print;
-asn_constr_check_f PLMN_Identity_constraint;
-ber_type_decoder_f PLMN_Identity_decode_ber;
-der_type_encoder_f PLMN_Identity_encode_der;
-xer_type_decoder_f PLMN_Identity_decode_xer;
-xer_type_encoder_f PLMN_Identity_encode_xer;
-per_type_decoder_f PLMN_Identity_decode_uper;
-per_type_encoder_f PLMN_Identity_encode_uper;
-per_type_decoder_f PLMN_Identity_decode_aper;
-per_type_encoder_f PLMN_Identity_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _PLMN_Identity_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/PRACH-Configuration.c b/3rdparty/libe2ap/PRACH-Configuration.c
deleted file mode 100644
index 747012c..0000000
--- a/3rdparty/libe2ap/PRACH-Configuration.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "PRACH-Configuration.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_rootSequenceIndex_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 837)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_zeroCorrelationIndex_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 15)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_prach_FreqOffset_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 94)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_prach_ConfigIndex_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 63)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_rootSequenceIndex_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 10,  10,  0,  837 }	/* (0..837) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_zeroCorrelationIndex_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 4,  4,  0,  15 }	/* (0..15) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_prach_FreqOffset_constr_5 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 7,  7,  0,  94 }	/* (0..94) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_prach_ConfigIndex_constr_6 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 6,  6,  0,  63 }	/* (0..63) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_PRACH_Configuration_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct PRACH_Configuration, rootSequenceIndex),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_rootSequenceIndex_constr_2,  memb_rootSequenceIndex_constraint_1 },
-		0, 0, /* No default value */
-		"rootSequenceIndex"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct PRACH_Configuration, zeroCorrelationIndex),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_zeroCorrelationIndex_constr_3,  memb_zeroCorrelationIndex_constraint_1 },
-		0, 0, /* No default value */
-		"zeroCorrelationIndex"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct PRACH_Configuration, highSpeedFlag),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BOOLEAN,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"highSpeedFlag"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct PRACH_Configuration, prach_FreqOffset),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_prach_FreqOffset_constr_5,  memb_prach_FreqOffset_constraint_1 },
-		0, 0, /* No default value */
-		"prach-FreqOffset"
-		},
-	{ ATF_POINTER, 2, offsetof(struct PRACH_Configuration, prach_ConfigIndex),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_prach_ConfigIndex_constr_6,  memb_prach_ConfigIndex_constraint_1 },
-		0, 0, /* No default value */
-		"prach-ConfigIndex"
-		},
-	{ ATF_POINTER, 1, offsetof(struct PRACH_Configuration, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P55,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_PRACH_Configuration_oms_1[] = { 4, 5 };
-static const ber_tlv_tag_t asn_DEF_PRACH_Configuration_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_PRACH_Configuration_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rootSequenceIndex */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* zeroCorrelationIndex */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* highSpeedFlag */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* prach-FreqOffset */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* prach-ConfigIndex */
-    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_PRACH_Configuration_specs_1 = {
-	sizeof(struct PRACH_Configuration),
-	offsetof(struct PRACH_Configuration, _asn_ctx),
-	asn_MAP_PRACH_Configuration_tag2el_1,
-	6,	/* Count of tags in the map */
-	asn_MAP_PRACH_Configuration_oms_1,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	6,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_PRACH_Configuration = {
-	"PRACH-Configuration",
-	"PRACH-Configuration",
-	&asn_OP_SEQUENCE,
-	asn_DEF_PRACH_Configuration_tags_1,
-	sizeof(asn_DEF_PRACH_Configuration_tags_1)
-		/sizeof(asn_DEF_PRACH_Configuration_tags_1[0]), /* 1 */
-	asn_DEF_PRACH_Configuration_tags_1,	/* Same as above */
-	sizeof(asn_DEF_PRACH_Configuration_tags_1)
-		/sizeof(asn_DEF_PRACH_Configuration_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_PRACH_Configuration_1,
-	6,	/* Elements count */
-	&asn_SPC_PRACH_Configuration_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/PRACH-Configuration.h b/3rdparty/libe2ap/PRACH-Configuration.h
deleted file mode 100644
index 40732ec..0000000
--- a/3rdparty/libe2ap/PRACH-Configuration.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_PRACH_Configuration_H_
-#define	_PRACH_Configuration_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "BOOLEAN.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* PRACH-Configuration */
-typedef struct PRACH_Configuration {
-	long	 rootSequenceIndex;
-	long	 zeroCorrelationIndex;
-	BOOLEAN_t	 highSpeedFlag;
-	long	 prach_FreqOffset;
-	long	*prach_ConfigIndex;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} PRACH_Configuration_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_PRACH_Configuration;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _PRACH_Configuration_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/PartialSuccessIndicator.c b/3rdparty/libe2ap/PartialSuccessIndicator.c
deleted file mode 100644
index 5317d5e..0000000
--- a/3rdparty/libe2ap/PartialSuccessIndicator.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "PartialSuccessIndicator.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_PartialSuccessIndicator_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_PartialSuccessIndicator_value2enum_1[] = {
-	{ 0,	23,	"partial-success-allowed" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_PartialSuccessIndicator_enum2value_1[] = {
-	0	/* partial-success-allowed(0) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_PartialSuccessIndicator_specs_1 = {
-	asn_MAP_PartialSuccessIndicator_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_PartialSuccessIndicator_enum2value_1,	/* N => "tag"; sorted by N */
-	1,	/* Number of elements in the maps */
-	2,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_PartialSuccessIndicator_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_PartialSuccessIndicator = {
-	"PartialSuccessIndicator",
-	"PartialSuccessIndicator",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_PartialSuccessIndicator_tags_1,
-	sizeof(asn_DEF_PartialSuccessIndicator_tags_1)
-		/sizeof(asn_DEF_PartialSuccessIndicator_tags_1[0]), /* 1 */
-	asn_DEF_PartialSuccessIndicator_tags_1,	/* Same as above */
-	sizeof(asn_DEF_PartialSuccessIndicator_tags_1)
-		/sizeof(asn_DEF_PartialSuccessIndicator_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_PartialSuccessIndicator_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_PartialSuccessIndicator_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/PartialSuccessIndicator.h b/3rdparty/libe2ap/PartialSuccessIndicator.h
deleted file mode 100644
index d644e5b..0000000
--- a/3rdparty/libe2ap/PartialSuccessIndicator.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_PartialSuccessIndicator_H_
-#define	_PartialSuccessIndicator_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum PartialSuccessIndicator {
-	PartialSuccessIndicator_partial_success_allowed	= 0
-	/*
-	 * Enumeration is extensible
-	 */
-} e_PartialSuccessIndicator;
-
-/* PartialSuccessIndicator */
-typedef long	 PartialSuccessIndicator_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_PartialSuccessIndicator;
-asn_struct_free_f PartialSuccessIndicator_free;
-asn_struct_print_f PartialSuccessIndicator_print;
-asn_constr_check_f PartialSuccessIndicator_constraint;
-ber_type_decoder_f PartialSuccessIndicator_decode_ber;
-der_type_encoder_f PartialSuccessIndicator_encode_der;
-xer_type_decoder_f PartialSuccessIndicator_decode_xer;
-xer_type_encoder_f PartialSuccessIndicator_encode_xer;
-per_type_decoder_f PartialSuccessIndicator_decode_uper;
-per_type_encoder_f PartialSuccessIndicator_encode_uper;
-per_type_decoder_f PartialSuccessIndicator_decode_aper;
-per_type_encoder_f PartialSuccessIndicator_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _PartialSuccessIndicator_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/Presence.c b/3rdparty/libe2ap/Presence.c
deleted file mode 100644
index ed8b219..0000000
--- a/3rdparty/libe2ap/Presence.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-CommonDataTypes"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "Presence.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_Presence_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_Presence_value2enum_1[] = {
-	{ 0,	8,	"optional" },
-	{ 1,	11,	"conditional" },
-	{ 2,	9,	"mandatory" }
-};
-static const unsigned int asn_MAP_Presence_enum2value_1[] = {
-	1,	/* conditional(1) */
-	2,	/* mandatory(2) */
-	0	/* optional(0) */
-};
-const asn_INTEGER_specifics_t asn_SPC_Presence_specs_1 = {
-	asn_MAP_Presence_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_Presence_enum2value_1,	/* N => "tag"; sorted by N */
-	3,	/* Number of elements in the maps */
-	0,	/* Enumeration is not extensible */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_Presence_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_Presence = {
-	"Presence",
-	"Presence",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_Presence_tags_1,
-	sizeof(asn_DEF_Presence_tags_1)
-		/sizeof(asn_DEF_Presence_tags_1[0]), /* 1 */
-	asn_DEF_Presence_tags_1,	/* Same as above */
-	sizeof(asn_DEF_Presence_tags_1)
-		/sizeof(asn_DEF_Presence_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_Presence_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_Presence_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/Presence.h b/3rdparty/libe2ap/Presence.h
deleted file mode 100644
index 36a6d89..0000000
--- a/3rdparty/libe2ap/Presence.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-CommonDataTypes"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_Presence_H_
-#define	_Presence_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum Presence {
-	Presence_optional	= 0,
-	Presence_conditional	= 1,
-	Presence_mandatory	= 2
-} e_Presence;
-
-/* Presence */
-typedef long	 Presence_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_Presence_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_Presence;
-extern const asn_INTEGER_specifics_t asn_SPC_Presence_specs_1;
-asn_struct_free_f Presence_free;
-asn_struct_print_f Presence_print;
-asn_constr_check_f Presence_constraint;
-ber_type_decoder_f Presence_decode_ber;
-der_type_encoder_f Presence_encode_der;
-xer_type_decoder_f Presence_decode_xer;
-xer_type_encoder_f Presence_encode_xer;
-per_type_decoder_f Presence_decode_uper;
-per_type_encoder_f Presence_encode_uper;
-per_type_decoder_f Presence_decode_aper;
-per_type_encoder_f Presence_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _Presence_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/PrivateIE-ID.c b/3rdparty/libe2ap/PrivateIE-ID.c
deleted file mode 100644
index c9b3ecc..0000000
--- a/3rdparty/libe2ap/PrivateIE-ID.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-CommonDataTypes"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "PrivateIE-ID.h"
-
-static int
-memb_local_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_local_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_PrivateIE_ID_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 1,  1,  0,  1 }	/* (0..1) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_PrivateIE_ID_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct PrivateIE_ID, choice.local),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_local_constr_2,  memb_local_constraint_1 },
-		0, 0, /* No default value */
-		"local"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct PrivateIE_ID, choice.global),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_OBJECT_IDENTIFIER,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"global"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_PrivateIE_ID_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* local */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* global */
-};
-asn_CHOICE_specifics_t asn_SPC_PrivateIE_ID_specs_1 = {
-	sizeof(struct PrivateIE_ID),
-	offsetof(struct PrivateIE_ID, _asn_ctx),
-	offsetof(struct PrivateIE_ID, present),
-	sizeof(((struct PrivateIE_ID *)0)->present),
-	asn_MAP_PrivateIE_ID_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_PrivateIE_ID = {
-	"PrivateIE-ID",
-	"PrivateIE-ID",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_PrivateIE_ID_constr_1, CHOICE_constraint },
-	asn_MBR_PrivateIE_ID_1,
-	2,	/* Elements count */
-	&asn_SPC_PrivateIE_ID_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/PrivateIE-ID.h b/3rdparty/libe2ap/PrivateIE-ID.h
deleted file mode 100644
index 103be4f..0000000
--- a/3rdparty/libe2ap/PrivateIE-ID.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-CommonDataTypes"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_PrivateIE_ID_H_
-#define	_PrivateIE_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "OBJECT_IDENTIFIER.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum PrivateIE_ID_PR {
-	PrivateIE_ID_PR_NOTHING,	/* No components present */
-	PrivateIE_ID_PR_local,
-	PrivateIE_ID_PR_global
-} PrivateIE_ID_PR;
-
-/* PrivateIE-ID */
-typedef struct PrivateIE_ID {
-	PrivateIE_ID_PR present;
-	union PrivateIE_ID_u {
-		long	 local;
-		OBJECT_IDENTIFIER_t	 global;
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} PrivateIE_ID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_PrivateIE_ID;
-extern asn_CHOICE_specifics_t asn_SPC_PrivateIE_ID_specs_1;
-extern asn_TYPE_member_t asn_MBR_PrivateIE_ID_1[2];
-extern asn_per_constraints_t asn_PER_type_PrivateIE_ID_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _PrivateIE_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ProcedureCode.c b/3rdparty/libe2ap/ProcedureCode.c
deleted file mode 100644
index 6fff9b2..0000000
--- a/3rdparty/libe2ap/ProcedureCode.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-CommonDataTypes"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ProcedureCode.h"
-
-int
-ProcedureCode_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 255)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_ProcedureCode_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 8,  8,  0,  255 }	/* (0..255) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_ProcedureCode_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ProcedureCode = {
-	"ProcedureCode",
-	"ProcedureCode",
-	&asn_OP_NativeInteger,
-	asn_DEF_ProcedureCode_tags_1,
-	sizeof(asn_DEF_ProcedureCode_tags_1)
-		/sizeof(asn_DEF_ProcedureCode_tags_1[0]), /* 1 */
-	asn_DEF_ProcedureCode_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ProcedureCode_tags_1)
-		/sizeof(asn_DEF_ProcedureCode_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ProcedureCode_constr_1, ProcedureCode_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/ProcedureCode.h b/3rdparty/libe2ap/ProcedureCode.h
deleted file mode 100644
index 77731b7..0000000
--- a/3rdparty/libe2ap/ProcedureCode.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-CommonDataTypes"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ProcedureCode_H_
-#define	_ProcedureCode_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ProcedureCode */
-typedef long	 ProcedureCode_t;
-
-/* Implementation */
-#define ProcedureCode_id_ricSubscription	((ProcedureCode_t)201)
-#define ProcedureCode_id_ricSubscriptionDelete	((ProcedureCode_t)202)
-#define ProcedureCode_id_ricServiceUpdate	((ProcedureCode_t)203)
-#define ProcedureCode_id_ricControl	((ProcedureCode_t)204)
-#define ProcedureCode_id_ricIndication	((ProcedureCode_t)205)
-#define ProcedureCode_id_ricServiceQuery	((ProcedureCode_t)206)
-extern asn_per_constraints_t asn_PER_type_ProcedureCode_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_ProcedureCode;
-asn_struct_free_f ProcedureCode_free;
-asn_struct_print_f ProcedureCode_print;
-asn_constr_check_f ProcedureCode_constraint;
-ber_type_decoder_f ProcedureCode_decode_ber;
-der_type_encoder_f ProcedureCode_encode_der;
-xer_type_decoder_f ProcedureCode_decode_xer;
-xer_type_encoder_f ProcedureCode_encode_xer;
-per_type_decoder_f ProcedureCode_decode_uper;
-per_type_encoder_f ProcedureCode_encode_uper;
-per_type_decoder_f ProcedureCode_decode_aper;
-per_type_encoder_f ProcedureCode_encode_aper;
-#define ProcedureCode_id_loadIndication	((ProcedureCode_t)2)
-#define ProcedureCode_id_errorIndication	((ProcedureCode_t)3)
-#define ProcedureCode_id_x2Setup	((ProcedureCode_t)6)
-#define ProcedureCode_id_reset	((ProcedureCode_t)7)
-#define ProcedureCode_id_eNBConfigurationUpdate	((ProcedureCode_t)8)
-#define ProcedureCode_id_resourceStatusReportingInitiation	((ProcedureCode_t)9)
-#define ProcedureCode_id_resourceStatusReporting	((ProcedureCode_t)10)
-#define ProcedureCode_id_endcX2Setup	((ProcedureCode_t)36)
-#define ProcedureCode_id_endcConfigurationUpdate	((ProcedureCode_t)37)
-#define ProcedureCode_id_gNBStatusIndication	((ProcedureCode_t)45)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ProcedureCode_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ProtectedEUTRAResourceIndication.c b/3rdparty/libe2ap/ProtectedEUTRAResourceIndication.c
deleted file mode 100644
index 175938f..0000000
--- a/3rdparty/libe2ap/ProtectedEUTRAResourceIndication.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ProtectedEUTRAResourceIndication.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_activationSFN_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 1023)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_mBSFNControlRegionLength_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 3)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_pDCCHRegionLength_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 1 && value <= 3)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_activationSFN_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 10,  10,  0,  1023 }	/* (0..1023) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_mBSFNControlRegionLength_constr_4 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  3 }	/* (0..3) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_pDCCHRegionLength_constr_5 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  1,  3 }	/* (1..3) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_ProtectedEUTRAResourceIndication_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedEUTRAResourceIndication, activationSFN),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_activationSFN_constr_2,  memb_activationSFN_constraint_1 },
-		0, 0, /* No default value */
-		"activationSFN"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedEUTRAResourceIndication, protectedResourceList),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtectedResourceList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protectedResourceList"
-		},
-	{ ATF_POINTER, 3, offsetof(struct ProtectedEUTRAResourceIndication, mBSFNControlRegionLength),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_mBSFNControlRegionLength_constr_4,  memb_mBSFNControlRegionLength_constraint_1 },
-		0, 0, /* No default value */
-		"mBSFNControlRegionLength"
-		},
-	{ ATF_POINTER, 2, offsetof(struct ProtectedEUTRAResourceIndication, pDCCHRegionLength),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_pDCCHRegionLength_constr_5,  memb_pDCCHRegionLength_constraint_1 },
-		0, 0, /* No default value */
-		"pDCCHRegionLength"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ProtectedEUTRAResourceIndication, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P56,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_ProtectedEUTRAResourceIndication_oms_1[] = { 2, 3, 4 };
-static const ber_tlv_tag_t asn_DEF_ProtectedEUTRAResourceIndication_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ProtectedEUTRAResourceIndication_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* activationSFN */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* protectedResourceList */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* mBSFNControlRegionLength */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* pDCCHRegionLength */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_ProtectedEUTRAResourceIndication_specs_1 = {
-	sizeof(struct ProtectedEUTRAResourceIndication),
-	offsetof(struct ProtectedEUTRAResourceIndication, _asn_ctx),
-	asn_MAP_ProtectedEUTRAResourceIndication_tag2el_1,
-	5,	/* Count of tags in the map */
-	asn_MAP_ProtectedEUTRAResourceIndication_oms_1,	/* Optional members */
-	3, 0,	/* Root/Additions */
-	5,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtectedEUTRAResourceIndication = {
-	"ProtectedEUTRAResourceIndication",
-	"ProtectedEUTRAResourceIndication",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtectedEUTRAResourceIndication_tags_1,
-	sizeof(asn_DEF_ProtectedEUTRAResourceIndication_tags_1)
-		/sizeof(asn_DEF_ProtectedEUTRAResourceIndication_tags_1[0]), /* 1 */
-	asn_DEF_ProtectedEUTRAResourceIndication_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ProtectedEUTRAResourceIndication_tags_1)
-		/sizeof(asn_DEF_ProtectedEUTRAResourceIndication_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ProtectedEUTRAResourceIndication_1,
-	5,	/* Elements count */
-	&asn_SPC_ProtectedEUTRAResourceIndication_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ProtectedEUTRAResourceIndication.h b/3rdparty/libe2ap/ProtectedEUTRAResourceIndication.h
deleted file mode 100644
index 630dbc7..0000000
--- a/3rdparty/libe2ap/ProtectedEUTRAResourceIndication.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ProtectedEUTRAResourceIndication_H_
-#define	_ProtectedEUTRAResourceIndication_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "ProtectedResourceList.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* ProtectedEUTRAResourceIndication */
-typedef struct ProtectedEUTRAResourceIndication {
-	long	 activationSFN;
-	ProtectedResourceList_t	 protectedResourceList;
-	long	*mBSFNControlRegionLength;	/* OPTIONAL */
-	long	*pDCCHRegionLength;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtectedEUTRAResourceIndication_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ProtectedEUTRAResourceIndication;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ProtectedEUTRAResourceIndication_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ProtectedFootprintTimePattern.c b/3rdparty/libe2ap/ProtectedFootprintTimePattern.c
deleted file mode 100644
index 3bba40d..0000000
--- a/3rdparty/libe2ap/ProtectedFootprintTimePattern.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ProtectedFootprintTimePattern.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_protectedFootprintTimePeriodicity_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 1 && value <= 320)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_protectedFootprintStartTime_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 1 && value <= 20)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_protectedFootprintTimePeriodicity_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  9,  9,  1,  320 }	/* (1..320,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_protectedFootprintStartTime_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  5,  5,  1,  20 }	/* (1..20,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_ProtectedFootprintTimePattern_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedFootprintTimePattern, protectedFootprintTimePeriodicity),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_protectedFootprintTimePeriodicity_constr_2,  memb_protectedFootprintTimePeriodicity_constraint_1 },
-		0, 0, /* No default value */
-		"protectedFootprintTimePeriodicity"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedFootprintTimePattern, protectedFootprintStartTime),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_protectedFootprintStartTime_constr_3,  memb_protectedFootprintStartTime_constraint_1 },
-		0, 0, /* No default value */
-		"protectedFootprintStartTime"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ProtectedFootprintTimePattern, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P57,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_ProtectedFootprintTimePattern_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_ProtectedFootprintTimePattern_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ProtectedFootprintTimePattern_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* protectedFootprintTimePeriodicity */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* protectedFootprintStartTime */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ProtectedFootprintTimePattern_specs_1 = {
-	sizeof(struct ProtectedFootprintTimePattern),
-	offsetof(struct ProtectedFootprintTimePattern, _asn_ctx),
-	asn_MAP_ProtectedFootprintTimePattern_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_ProtectedFootprintTimePattern_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtectedFootprintTimePattern = {
-	"ProtectedFootprintTimePattern",
-	"ProtectedFootprintTimePattern",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtectedFootprintTimePattern_tags_1,
-	sizeof(asn_DEF_ProtectedFootprintTimePattern_tags_1)
-		/sizeof(asn_DEF_ProtectedFootprintTimePattern_tags_1[0]), /* 1 */
-	asn_DEF_ProtectedFootprintTimePattern_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ProtectedFootprintTimePattern_tags_1)
-		/sizeof(asn_DEF_ProtectedFootprintTimePattern_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ProtectedFootprintTimePattern_1,
-	3,	/* Elements count */
-	&asn_SPC_ProtectedFootprintTimePattern_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ProtectedFootprintTimePattern.h b/3rdparty/libe2ap/ProtectedFootprintTimePattern.h
deleted file mode 100644
index a180ede..0000000
--- a/3rdparty/libe2ap/ProtectedFootprintTimePattern.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ProtectedFootprintTimePattern_H_
-#define	_ProtectedFootprintTimePattern_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* ProtectedFootprintTimePattern */
-typedef struct ProtectedFootprintTimePattern {
-	long	 protectedFootprintTimePeriodicity;
-	long	 protectedFootprintStartTime;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtectedFootprintTimePattern_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ProtectedFootprintTimePattern;
-extern asn_SEQUENCE_specifics_t asn_SPC_ProtectedFootprintTimePattern_specs_1;
-extern asn_TYPE_member_t asn_MBR_ProtectedFootprintTimePattern_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ProtectedFootprintTimePattern_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ProtectedResourceList-Item.c b/3rdparty/libe2ap/ProtectedResourceList-Item.c
deleted file mode 100644
index a9bdc35..0000000
--- a/3rdparty/libe2ap/ProtectedResourceList-Item.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ProtectedResourceList-Item.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_intraPRBProtectedResourceFootprint_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 84)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_protectedFootprintFrequencyPattern_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size >= 6 && size <= 110)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_intraPRBProtectedResourceFootprint_constr_3 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  84,  84 }	/* (SIZE(84..84,...)) */,
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_protectedFootprintFrequencyPattern_constr_4 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  7,  7,  6,  110 }	/* (SIZE(6..110,...)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_ProtectedResourceList_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedResourceList_Item, resourceType),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ResourceType,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"resourceType"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedResourceList_Item, intraPRBProtectedResourceFootprint),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_intraPRBProtectedResourceFootprint_constr_3,  memb_intraPRBProtectedResourceFootprint_constraint_1 },
-		0, 0, /* No default value */
-		"intraPRBProtectedResourceFootprint"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedResourceList_Item, protectedFootprintFrequencyPattern),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_protectedFootprintFrequencyPattern_constr_4,  memb_protectedFootprintFrequencyPattern_constraint_1 },
-		0, 0, /* No default value */
-		"protectedFootprintFrequencyPattern"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedResourceList_Item, protectedFootprintTimePattern),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtectedFootprintTimePattern,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protectedFootprintTimePattern"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ProtectedResourceList_Item, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P58,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_ProtectedResourceList_Item_oms_1[] = { 4 };
-static const ber_tlv_tag_t asn_DEF_ProtectedResourceList_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ProtectedResourceList_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* resourceType */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* intraPRBProtectedResourceFootprint */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* protectedFootprintFrequencyPattern */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* protectedFootprintTimePattern */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ProtectedResourceList_Item_specs_1 = {
-	sizeof(struct ProtectedResourceList_Item),
-	offsetof(struct ProtectedResourceList_Item, _asn_ctx),
-	asn_MAP_ProtectedResourceList_Item_tag2el_1,
-	5,	/* Count of tags in the map */
-	asn_MAP_ProtectedResourceList_Item_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	5,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtectedResourceList_Item = {
-	"ProtectedResourceList-Item",
-	"ProtectedResourceList-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtectedResourceList_Item_tags_1,
-	sizeof(asn_DEF_ProtectedResourceList_Item_tags_1)
-		/sizeof(asn_DEF_ProtectedResourceList_Item_tags_1[0]), /* 1 */
-	asn_DEF_ProtectedResourceList_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ProtectedResourceList_Item_tags_1)
-		/sizeof(asn_DEF_ProtectedResourceList_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ProtectedResourceList_Item_1,
-	5,	/* Elements count */
-	&asn_SPC_ProtectedResourceList_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ProtectedResourceList-Item.h b/3rdparty/libe2ap/ProtectedResourceList-Item.h
deleted file mode 100644
index 5ca68de..0000000
--- a/3rdparty/libe2ap/ProtectedResourceList-Item.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ProtectedResourceList_Item_H_
-#define	_ProtectedResourceList_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ResourceType.h"
-#include "BIT_STRING.h"
-#include "ProtectedFootprintTimePattern.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* ProtectedResourceList-Item */
-typedef struct ProtectedResourceList_Item {
-	ResourceType_t	 resourceType;
-	BIT_STRING_t	 intraPRBProtectedResourceFootprint;
-	BIT_STRING_t	 protectedFootprintFrequencyPattern;
-	ProtectedFootprintTimePattern_t	 protectedFootprintTimePattern;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtectedResourceList_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ProtectedResourceList_Item;
-extern asn_SEQUENCE_specifics_t asn_SPC_ProtectedResourceList_Item_specs_1;
-extern asn_TYPE_member_t asn_MBR_ProtectedResourceList_Item_1[5];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ProtectedResourceList_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ProtectedResourceList.c b/3rdparty/libe2ap/ProtectedResourceList.c
deleted file mode 100644
index 0888175..0000000
--- a/3rdparty/libe2ap/ProtectedResourceList.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ProtectedResourceList.h"
-
-#include "ProtectedResourceList-Item.h"
-asn_per_constraints_t asn_PER_type_ProtectedResourceList_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 4,  4,  1,  16 }	/* (SIZE(1..16)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_ProtectedResourceList_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtectedResourceList_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtectedResourceList_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtectedResourceList_specs_1 = {
-	sizeof(struct ProtectedResourceList),
-	offsetof(struct ProtectedResourceList, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtectedResourceList = {
-	"ProtectedResourceList",
-	"ProtectedResourceList",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtectedResourceList_tags_1,
-	sizeof(asn_DEF_ProtectedResourceList_tags_1)
-		/sizeof(asn_DEF_ProtectedResourceList_tags_1[0]), /* 1 */
-	asn_DEF_ProtectedResourceList_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ProtectedResourceList_tags_1)
-		/sizeof(asn_DEF_ProtectedResourceList_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtectedResourceList_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_ProtectedResourceList_1,
-	1,	/* Single element */
-	&asn_SPC_ProtectedResourceList_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ProtectedResourceList.h b/3rdparty/libe2ap/ProtectedResourceList.h
deleted file mode 100644
index 7031231..0000000
--- a/3rdparty/libe2ap/ProtectedResourceList.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ProtectedResourceList_H_
-#define	_ProtectedResourceList_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtectedResourceList_Item;
-
-/* ProtectedResourceList */
-typedef struct ProtectedResourceList {
-	A_SEQUENCE_OF(struct ProtectedResourceList_Item) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtectedResourceList_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ProtectedResourceList;
-extern asn_SET_OF_specifics_t asn_SPC_ProtectedResourceList_specs_1;
-extern asn_TYPE_member_t asn_MBR_ProtectedResourceList_1[1];
-extern asn_per_constraints_t asn_PER_type_ProtectedResourceList_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ProtectedResourceList_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ProtocolExtensionContainer.c b/3rdparty/libe2ap/ProtocolExtensionContainer.c
deleted file mode 100644
index 325a040..0000000
--- a/3rdparty/libe2ap/ProtocolExtensionContainer.c
+++ /dev/null
@@ -1,3050 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-Containers"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ProtocolExtensionContainer.h"
-
-#include "ProtocolExtensionField.h"
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P0_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P1_constr_3 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P2_constr_5 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P3_constr_7 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P4_constr_9 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P5_constr_11 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P6_constr_13 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P7_constr_15 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P8_constr_17 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P9_constr_19 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P10_constr_21 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P11_constr_23 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P12_constr_25 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P13_constr_27 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P14_constr_29 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P15_constr_31 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P16_constr_33 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P17_constr_35 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P18_constr_37 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P19_constr_39 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P20_constr_41 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P21_constr_43 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P22_constr_45 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P23_constr_47 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P24_constr_49 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P25_constr_51 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P26_constr_53 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P27_constr_55 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P28_constr_57 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P29_constr_59 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P30_constr_61 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P31_constr_63 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P32_constr_65 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P33_constr_67 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P34_constr_69 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P35_constr_71 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P36_constr_73 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P37_constr_75 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P38_constr_77 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P39_constr_79 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P40_constr_81 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P41_constr_83 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P42_constr_85 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P43_constr_87 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P44_constr_89 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P45_constr_91 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P46_constr_93 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P47_constr_95 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P48_constr_97 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P49_constr_99 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P50_constr_101 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P51_constr_103 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P52_constr_105 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P53_constr_107 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P54_constr_109 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P55_constr_111 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P56_constr_113 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P57_constr_115 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P58_constr_117 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P59_constr_119 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P60_constr_121 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P61_constr_123 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P62_constr_125 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P63_constr_127 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P64_constr_129 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P65_constr_131 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P66_constr_133 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P67_constr_135 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P68_constr_137 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P69_constr_139 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P70_constr_141 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P71_constr_143 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P72_constr_145 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P73_constr_147 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P74_constr_149 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P75_constr_151 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  1,  65535 }	/* (SIZE(1..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P0_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CellInformation_Item_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P0_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P0_specs_1 = {
-	sizeof(struct ProtocolExtensionContainer_8858P0),
-	offsetof(struct ProtocolExtensionContainer_8858P0, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P0 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P0_tags_1,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P0_tags_1)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P0_tags_1[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P0_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P0_tags_1)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P0_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P0_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P0_1,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P0_specs_1	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P1_3[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedCellsToModify_Item_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P1_tags_3[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P1_specs_3 = {
-	sizeof(struct ProtocolExtensionContainer_8858P1),
-	offsetof(struct ProtocolExtensionContainer_8858P1, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P1 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P1_tags_3,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P1_tags_3)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P1_tags_3[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P1_tags_3,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P1_tags_3)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P1_tags_3[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P1_constr_3, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P1_3,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P1_specs_3	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P2_5[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CellToReport_Item_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P2_tags_5[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P2_specs_5 = {
-	sizeof(struct ProtocolExtensionContainer_8858P2),
-	offsetof(struct ProtocolExtensionContainer_8858P2, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P2 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P2_tags_5,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P2_tags_5)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P2_tags_5[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P2_tags_5,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P2_tags_5)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P2_tags_5[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P2_constr_5, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P2_5,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P2_specs_5	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P3_7[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_MeasurementInitiationResult_Item_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P3_tags_7[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P3_specs_7 = {
-	sizeof(struct ProtocolExtensionContainer_8858P3),
-	offsetof(struct ProtocolExtensionContainer_8858P3, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P3 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P3_tags_7,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P3_tags_7)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P3_tags_7[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P3_tags_7,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P3_tags_7)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P3_tags_7[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P3_constr_7, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P3_7,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P3_specs_7	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P4_9[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_MeasurementFailureCause_Item_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P4_tags_9[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P4_specs_9 = {
-	sizeof(struct ProtocolExtensionContainer_8858P4),
-	offsetof(struct ProtocolExtensionContainer_8858P4, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P4 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P4_tags_9,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P4_tags_9)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P4_tags_9[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P4_tags_9,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P4_tags_9)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P4_tags_9[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P4_constr_9, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P4_9,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P4_specs_9	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P5_11[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P5_tags_11[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P5_specs_11 = {
-	sizeof(struct ProtocolExtensionContainer_8858P5),
-	offsetof(struct ProtocolExtensionContainer_8858P5, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P5 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P5_tags_11,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P5_tags_11)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P5_tags_11[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P5_tags_11,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P5_tags_11)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P5_tags_11[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P5_constr_11, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P5_11,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P5_specs_11	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P6_13[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CellMeasurementResult_Item_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P6_tags_13[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P6_specs_13 = {
-	sizeof(struct ProtocolExtensionContainer_8858P6),
-	offsetof(struct ProtocolExtensionContainer_8858P6, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P6 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P6_tags_13,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P6_tags_13)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P6_tags_13[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P6_tags_13,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P6_tags_13)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P6_tags_13[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P6_constr_13, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P6_13,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P6_specs_13	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P7_15[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P7_tags_15[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P7_specs_15 = {
-	sizeof(struct ProtocolExtensionContainer_8858P7),
-	offsetof(struct ProtocolExtensionContainer_8858P7, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P7 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P7_tags_15,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P7_tags_15)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P7_tags_15[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P7_tags_15,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P7_tags_15)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P7_tags_15[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P7_constr_15, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P7_15,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P7_specs_15	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P8_17[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P8_tags_17[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P8_specs_17 = {
-	sizeof(struct ProtocolExtensionContainer_8858P8),
-	offsetof(struct ProtocolExtensionContainer_8858P8, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P8 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P8_tags_17,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P8_tags_17)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P8_tags_17[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P8_tags_17,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P8_tags_17)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P8_tags_17[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P8_constr_17, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P8_17,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P8_specs_17	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P9_19[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P9_tags_19[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P9_specs_19 = {
-	sizeof(struct ProtocolExtensionContainer_8858P9),
-	offsetof(struct ProtocolExtensionContainer_8858P9, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P9 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P9_tags_19,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P9_tags_19)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P9_tags_19[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P9_tags_19,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P9_tags_19)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P9_tags_19[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P9_constr_19, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P9_19,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P9_specs_19	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P10_21[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_En_gNBServedCells_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P10_tags_21[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P10_specs_21 = {
-	sizeof(struct ProtocolExtensionContainer_8858P10),
-	offsetof(struct ProtocolExtensionContainer_8858P10, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P10 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P10_tags_21,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P10_tags_21)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P10_tags_21[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P10_tags_21,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P10_tags_21)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P10_tags_21[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P10_constr_21, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P10_21,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P10_specs_21	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P11_23[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedNRCell_Information_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P11_tags_23[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P11_specs_23 = {
-	sizeof(struct ProtocolExtensionContainer_8858P11),
-	offsetof(struct ProtocolExtensionContainer_8858P11, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P11 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P11_tags_23,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P11_tags_23)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P11_tags_23[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P11_tags_23,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P11_tags_23)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P11_tags_23[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P11_constr_23, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P11_23,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P11_specs_23	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P12_25[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P12_tags_25[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P12_specs_25 = {
-	sizeof(struct ProtocolExtensionContainer_8858P12),
-	offsetof(struct ProtocolExtensionContainer_8858P12, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P12 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P12_tags_25,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P12_tags_25)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P12_tags_25[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P12_tags_25,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P12_tags_25)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P12_tags_25[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P12_constr_25, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P12_25,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P12_specs_25	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P13_27[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P13_tags_27[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P13_specs_27 = {
-	sizeof(struct ProtocolExtensionContainer_8858P13),
-	offsetof(struct ProtocolExtensionContainer_8858P13, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P13 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P13_tags_27,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P13_tags_27)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P13_tags_27[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P13_tags_27,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P13_tags_27)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P13_tags_27[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P13_constr_27, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P13_27,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P13_specs_27	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P14_29[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P14_tags_29[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P14_specs_29 = {
-	sizeof(struct ProtocolExtensionContainer_8858P14),
-	offsetof(struct ProtocolExtensionContainer_8858P14, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P14 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P14_tags_29,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P14_tags_29)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P14_tags_29[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P14_tags_29,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P14_tags_29)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P14_tags_29[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P14_constr_29, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P14_29,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P14_specs_29	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P15_31[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P15_tags_31[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P15_specs_31 = {
-	sizeof(struct ProtocolExtensionContainer_8858P15),
-	offsetof(struct ProtocolExtensionContainer_8858P15, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P15 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P15_tags_31,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P15_tags_31)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P15_tags_31[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P15_tags_31,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P15_tags_31)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P15_tags_31[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P15_constr_31, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P15_31,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P15_specs_31	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P16_33[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_NRNeighbour_Information_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P16_tags_33[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P16_specs_33 = {
-	sizeof(struct ProtocolExtensionContainer_8858P16),
-	offsetof(struct ProtocolExtensionContainer_8858P16, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P16 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P16_tags_33,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P16_tags_33)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P16_tags_33[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P16_tags_33,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P16_tags_33)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P16_tags_33[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P16_constr_33, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P16_33,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P16_specs_33	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P17_35[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Limited_list_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P17_tags_35[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P17_specs_35 = {
-	sizeof(struct ProtocolExtensionContainer_8858P17),
-	offsetof(struct ProtocolExtensionContainer_8858P17, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P17 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P17_tags_35,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P17_tags_35)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P17_tags_35[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P17_tags_35,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P17_tags_35)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P17_tags_35[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P17_constr_35, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P17_35,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P17_specs_35	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P18_37[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P18_tags_37[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P18_specs_37 = {
-	sizeof(struct ProtocolExtensionContainer_8858P18),
-	offsetof(struct ProtocolExtensionContainer_8858P18, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P18 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P18_tags_37,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P18_tags_37)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P18_tags_37[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P18_tags_37,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P18_tags_37)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P18_tags_37[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P18_constr_37, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P18_37,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P18_specs_37	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P19_39[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedNRCellsToModify_Item_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P19_tags_39[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P19_specs_39 = {
-	sizeof(struct ProtocolExtensionContainer_8858P19),
-	offsetof(struct ProtocolExtensionContainer_8858P19, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P19 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P19_tags_39,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P19_tags_39)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P19_tags_39[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P19_tags_39,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P19_tags_39)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P19_tags_39[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P19_constr_39, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P19_39,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P19_specs_39	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P20_41[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ABSInformationFDD_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P20_tags_41[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P20_specs_41 = {
-	sizeof(struct ProtocolExtensionContainer_8858P20),
-	offsetof(struct ProtocolExtensionContainer_8858P20, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P20 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P20_tags_41,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P20_tags_41)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P20_tags_41[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P20_tags_41,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P20_tags_41)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P20_tags_41[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P20_constr_41, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P20_41,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P20_specs_41	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P21_43[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ABSInformationTDD_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P21_tags_43[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P21_specs_43 = {
-	sizeof(struct ProtocolExtensionContainer_8858P21),
-	offsetof(struct ProtocolExtensionContainer_8858P21, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P21 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P21_tags_43,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P21_tags_43)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P21_tags_43[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P21_tags_43,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P21_tags_43)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P21_tags_43[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P21_constr_43, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P21_43,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P21_specs_43	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P22_45[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ABS_Status_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P22_tags_45[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P22_specs_45 = {
-	sizeof(struct ProtocolExtensionContainer_8858P22),
-	offsetof(struct ProtocolExtensionContainer_8858P22, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P22 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P22_tags_45,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P22_tags_45)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P22_tags_45[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P22_tags_45,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P22_tags_45)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P22_tags_45[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P22_constr_45, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P22_45,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P22_specs_45	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P23_47[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P23_tags_47[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P23_specs_47 = {
-	sizeof(struct ProtocolExtensionContainer_8858P23),
-	offsetof(struct ProtocolExtensionContainer_8858P23, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P23 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P23_tags_47,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P23_tags_47)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P23_tags_47[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P23_tags_47,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P23_tags_47)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P23_tags_47[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P23_constr_47, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P23_47,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P23_specs_47	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P24_49[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P24_tags_49[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P24_specs_49 = {
-	sizeof(struct ProtocolExtensionContainer_8858P24),
-	offsetof(struct ProtocolExtensionContainer_8858P24, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P24 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P24_tags_49,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P24_tags_49)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P24_tags_49[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P24_tags_49,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P24_tags_49)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P24_tags_49[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P24_constr_49, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P24_49,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P24_specs_49	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P25_51[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CellBasedQMC_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P25_tags_51[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P25_specs_51 = {
-	sizeof(struct ProtocolExtensionContainer_8858P25),
-	offsetof(struct ProtocolExtensionContainer_8858P25, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P25 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P25_tags_51,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P25_tags_51)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P25_tags_51[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P25_tags_51,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P25_tags_51)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P25_tags_51[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P25_constr_51, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P25_51,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P25_specs_51	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P26_53[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CellReplacingInfo_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P26_tags_53[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P26_specs_53 = {
-	sizeof(struct ProtocolExtensionContainer_8858P26),
-	offsetof(struct ProtocolExtensionContainer_8858P26, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P26 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P26_tags_53,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P26_tags_53)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P26_tags_53[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P26_tags_53,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P26_tags_53)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P26_tags_53[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P26_constr_53, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P26_53,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P26_specs_53	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P27_55[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CoMPHypothesisSetItem_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P27_tags_55[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P27_specs_55 = {
-	sizeof(struct ProtocolExtensionContainer_8858P27),
-	offsetof(struct ProtocolExtensionContainer_8858P27, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P27 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P27_tags_55,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P27_tags_55)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P27_tags_55[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P27_tags_55,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P27_tags_55)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P27_tags_55[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P27_constr_55, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P27_55,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P27_specs_55	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P28_57[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CoMPInformation_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P28_tags_57[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P28_specs_57 = {
-	sizeof(struct ProtocolExtensionContainer_8858P28),
-	offsetof(struct ProtocolExtensionContainer_8858P28, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P28 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P28_tags_57,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P28_tags_57)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P28_tags_57[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P28_tags_57,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P28_tags_57)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P28_tags_57[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P28_constr_57, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P28_57,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P28_specs_57	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P29_59[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CoMPInformationItem_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P29_tags_59[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P29_specs_59 = {
-	sizeof(struct ProtocolExtensionContainer_8858P29),
-	offsetof(struct ProtocolExtensionContainer_8858P29, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P29 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P29_tags_59,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P29_tags_59)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P29_tags_59[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P29_tags_59,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P29_tags_59)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P29_tags_59[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P29_constr_59, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P29_59,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P29_specs_59	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P30_61[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CoMPInformationStartTime_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P30_tags_61[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P30_specs_61 = {
-	sizeof(struct ProtocolExtensionContainer_8858P30),
-	offsetof(struct ProtocolExtensionContainer_8858P30, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P30 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P30_tags_61,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P30_tags_61)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P30_tags_61[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P30_tags_61,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P30_tags_61)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P30_tags_61[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P30_constr_61, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P30_61,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P30_specs_61	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P31_63[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CompositeAvailableCapacity_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P31_tags_63[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P31_specs_63 = {
-	sizeof(struct ProtocolExtensionContainer_8858P31),
-	offsetof(struct ProtocolExtensionContainer_8858P31, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P31 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P31_tags_63,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P31_tags_63)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P31_tags_63[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P31_tags_63,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P31_tags_63)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P31_tags_63[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P31_constr_63, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P31_63,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P31_specs_63	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P32_65[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CompositeAvailableCapacityGroup_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P32_tags_65[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P32_specs_65 = {
-	sizeof(struct ProtocolExtensionContainer_8858P32),
-	offsetof(struct ProtocolExtensionContainer_8858P32, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P32 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P32_tags_65,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P32_tags_65)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P32_tags_65[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P32_tags_65,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P32_tags_65)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P32_tags_65[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P32_constr_65, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P32_65,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P32_specs_65	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P33_67[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CriticalityDiagnostics_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P33_tags_67[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P33_specs_67 = {
-	sizeof(struct ProtocolExtensionContainer_8858P33),
-	offsetof(struct ProtocolExtensionContainer_8858P33, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P33 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P33_tags_67,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P33_tags_67)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P33_tags_67[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P33_tags_67,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P33_tags_67)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P33_tags_67[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P33_constr_67, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P33_67,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P33_specs_67	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P34_69[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P34_tags_69[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P34_specs_69 = {
-	sizeof(struct ProtocolExtensionContainer_8858P34),
-	offsetof(struct ProtocolExtensionContainer_8858P34, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P34 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P34_tags_69,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P34_tags_69)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P34_tags_69[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P34_tags_69,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P34_tags_69)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P34_tags_69[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P34_constr_69, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P34_69,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P34_specs_69	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P35_71[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CSIReportList_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P35_tags_71[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P35_specs_71 = {
-	sizeof(struct ProtocolExtensionContainer_8858P35),
-	offsetof(struct ProtocolExtensionContainer_8858P35, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P35 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P35_tags_71,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P35_tags_71)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P35_tags_71[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P35_tags_71,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P35_tags_71)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P35_tags_71[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P35_constr_71, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P35_71,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P35_specs_71	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P36_73[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CSIReportPerCSIProcess_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P36_tags_73[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P36_specs_73 = {
-	sizeof(struct ProtocolExtensionContainer_8858P36),
-	offsetof(struct ProtocolExtensionContainer_8858P36, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P36 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P36_tags_73,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P36_tags_73)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P36_tags_73[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P36_tags_73,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P36_tags_73)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P36_tags_73[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P36_constr_73, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P36_73,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P36_specs_73	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P37_75[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CSIReportPerCSIProcessItem_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P37_tags_75[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P37_specs_75 = {
-	sizeof(struct ProtocolExtensionContainer_8858P37),
-	offsetof(struct ProtocolExtensionContainer_8858P37, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P37 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P37_tags_75,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P37_tags_75)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P37_tags_75[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P37_tags_75,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P37_tags_75)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P37_tags_75[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P37_constr_75, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P37_75,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P37_specs_75	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P38_77[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_DynamicNAICSInformation_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P38_tags_77[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P38_specs_77 = {
-	sizeof(struct ProtocolExtensionContainer_8858P38),
-	offsetof(struct ProtocolExtensionContainer_8858P38, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P38 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P38_tags_77,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P38_tags_77)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P38_tags_77[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P38_tags_77,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P38_tags_77)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P38_tags_77[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P38_constr_77, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P38_77,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P38_specs_77	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P39_79[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ECGI_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P39_tags_79[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P39_specs_79 = {
-	sizeof(struct ProtocolExtensionContainer_8858P39),
-	offsetof(struct ProtocolExtensionContainer_8858P39, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P39 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P39_tags_79,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P39_tags_79)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P39_tags_79[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P39_tags_79,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P39_tags_79)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P39_tags_79[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P39_constr_79, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P39_79,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P39_specs_79	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P40_81[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_EnhancedRNTP_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P40_tags_81[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P40_specs_81 = {
-	sizeof(struct ProtocolExtensionContainer_8858P40),
-	offsetof(struct ProtocolExtensionContainer_8858P40, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P40 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P40_tags_81,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P40_tags_81)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P40_tags_81[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P40_tags_81,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P40_tags_81)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P40_tags_81[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P40_constr_81, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P40_81,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P40_specs_81	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P41_83[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_EnhancedRNTPStartTime_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P41_tags_83[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P41_specs_83 = {
-	sizeof(struct ProtocolExtensionContainer_8858P41),
-	offsetof(struct ProtocolExtensionContainer_8858P41, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P41 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P41_tags_83,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P41_tags_83)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P41_tags_83[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P41_tags_83,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P41_tags_83)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P41_tags_83[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P41_constr_83, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P41_83,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P41_specs_83	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P42_85[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P42_tags_85[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P42_specs_85 = {
-	sizeof(struct ProtocolExtensionContainer_8858P42),
-	offsetof(struct ProtocolExtensionContainer_8858P42, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P42 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P42_tags_85,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P42_tags_85)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P42_tags_85[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P42_tags_85,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P42_tags_85)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P42_tags_85[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P42_constr_85, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P42_85,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P42_specs_85	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P43_87[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_FDD_Info_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P43_tags_87[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P43_specs_87 = {
-	sizeof(struct ProtocolExtensionContainer_8858P43),
-	offsetof(struct ProtocolExtensionContainer_8858P43, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P43 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P43_tags_87,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P43_tags_87)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P43_tags_87[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P43_tags_87,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P43_tags_87)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P43_tags_87[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P43_constr_87, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P43_87,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P43_specs_87	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P44_89[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_FreqBandNrItem_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P44_tags_89[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P44_specs_89 = {
-	sizeof(struct ProtocolExtensionContainer_8858P44),
-	offsetof(struct ProtocolExtensionContainer_8858P44, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P44 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P44_tags_89,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P44_tags_89)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P44_tags_89[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P44_tags_89,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P44_tags_89)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P44_tags_89[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P44_constr_89, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P44_89,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P44_specs_89	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P45_91[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_GlobalENB_ID_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P45_tags_91[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P45_specs_91 = {
-	sizeof(struct ProtocolExtensionContainer_8858P45),
-	offsetof(struct ProtocolExtensionContainer_8858P45, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P45 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P45_tags_91,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P45_tags_91)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P45_tags_91[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P45_tags_91,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P45_tags_91)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P45_tags_91[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P45_constr_91, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P45_91,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P45_specs_91	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P46_93[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_GlobalGNB_ID_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P46_tags_93[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P46_specs_93 = {
-	sizeof(struct ProtocolExtensionContainer_8858P46),
-	offsetof(struct ProtocolExtensionContainer_8858P46, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P46 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P46_tags_93,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P46_tags_93)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P46_tags_93[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P46_tags_93,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P46_tags_93)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P46_tags_93[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P46_constr_93, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P46_93,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P46_specs_93	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P47_95[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_GU_Group_ID_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P47_tags_95[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P47_specs_95 = {
-	sizeof(struct ProtocolExtensionContainer_8858P47),
-	offsetof(struct ProtocolExtensionContainer_8858P47, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P47 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P47_tags_95,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P47_tags_95)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P47_tags_95[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P47_tags_95,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P47_tags_95)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P47_tags_95[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P47_constr_95, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P47_95,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P47_specs_95	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P48_97[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_HWLoadIndicator_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P48_tags_97[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P48_specs_97 = {
-	sizeof(struct ProtocolExtensionContainer_8858P48),
-	offsetof(struct ProtocolExtensionContainer_8858P48, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P48 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P48_tags_97,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P48_tags_97)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P48_tags_97[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P48_tags_97,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P48_tags_97)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P48_tags_97[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P48_constr_97, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P48_97,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P48_specs_97	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P49_99[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_MBSFN_Subframe_Info_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P49_tags_99[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P49_specs_99 = {
-	sizeof(struct ProtocolExtensionContainer_8858P49),
-	offsetof(struct ProtocolExtensionContainer_8858P49, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P49 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P49_tags_99,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P49_tags_99)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P49_tags_99[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P49_tags_99,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P49_tags_99)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P49_tags_99[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P49_constr_99, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P49_99,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P49_specs_99	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P50_101[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_BandInfo_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P50_tags_101[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P50_specs_101 = {
-	sizeof(struct ProtocolExtensionContainer_8858P50),
-	offsetof(struct ProtocolExtensionContainer_8858P50, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P50 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P50_tags_101,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P50_tags_101)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P50_tags_101[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P50_tags_101,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P50_tags_101)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P50_tags_101[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P50_constr_101, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P50_101,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P50_specs_101	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P51_103[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Neighbour_Information_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P51_tags_103[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P51_specs_103 = {
-	sizeof(struct ProtocolExtensionContainer_8858P51),
-	offsetof(struct ProtocolExtensionContainer_8858P51, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P51 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P51_tags_103,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P51_tags_103)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P51_tags_103[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P51_tags_103,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P51_tags_103)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P51_tags_103[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P51_constr_103, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P51_103,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P51_specs_103	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P52_105[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_NRFreqInfo_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P52_tags_105[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P52_specs_105 = {
-	sizeof(struct ProtocolExtensionContainer_8858P52),
-	offsetof(struct ProtocolExtensionContainer_8858P52, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P52 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P52_tags_105,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P52_tags_105)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P52_tags_105[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P52_tags_105,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P52_tags_105)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P52_tags_105[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P52_constr_105, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P52_105,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P52_specs_105	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P53_107[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_NRCGI_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P53_tags_107[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P53_specs_107 = {
-	sizeof(struct ProtocolExtensionContainer_8858P53),
-	offsetof(struct ProtocolExtensionContainer_8858P53, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P53 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P53_tags_107,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P53_tags_107)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P53_tags_107[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P53_tags_107,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P53_tags_107)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P53_tags_107[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P53_constr_107, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P53_107,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P53_specs_107	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P54_109[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_NR_TxBW_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P54_tags_109[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P54_specs_109 = {
-	sizeof(struct ProtocolExtensionContainer_8858P54),
-	offsetof(struct ProtocolExtensionContainer_8858P54, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P54 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P54_tags_109,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P54_tags_109)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P54_tags_109[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P54_tags_109,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P54_tags_109)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P54_tags_109[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P54_constr_109, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P54_109,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P54_specs_109	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P55_111[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_PRACH_Configuration_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P55_tags_111[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P55_specs_111 = {
-	sizeof(struct ProtocolExtensionContainer_8858P55),
-	offsetof(struct ProtocolExtensionContainer_8858P55, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P55 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P55_tags_111,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P55_tags_111)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P55_tags_111[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P55_tags_111,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P55_tags_111)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P55_tags_111[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P55_constr_111, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P55_111,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P55_specs_111	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P56_113[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P56_tags_113[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P56_specs_113 = {
-	sizeof(struct ProtocolExtensionContainer_8858P56),
-	offsetof(struct ProtocolExtensionContainer_8858P56, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P56 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P56_tags_113,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P56_tags_113)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P56_tags_113[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P56_tags_113,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P56_tags_113)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P56_tags_113[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P56_constr_113, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P56_113,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P56_specs_113	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P57_115[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtectedFootprintTimePattern_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P57_tags_115[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P57_specs_115 = {
-	sizeof(struct ProtocolExtensionContainer_8858P57),
-	offsetof(struct ProtocolExtensionContainer_8858P57, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P57 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P57_tags_115,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P57_tags_115)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P57_tags_115[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P57_tags_115,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P57_tags_115)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P57_tags_115[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P57_constr_115, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P57_115,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P57_specs_115	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P58_117[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtectedResourceList_Item_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P58_tags_117[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P58_specs_117 = {
-	sizeof(struct ProtocolExtensionContainer_8858P58),
-	offsetof(struct ProtocolExtensionContainer_8858P58, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P58 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P58_tags_117,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P58_tags_117)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P58_tags_117[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P58_tags_117,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P58_tags_117)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P58_tags_117[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P58_constr_117, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P58_117,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P58_specs_117	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P59_119[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RadioResourceStatus_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P59_tags_119[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P59_specs_119 = {
-	sizeof(struct ProtocolExtensionContainer_8858P59),
-	offsetof(struct ProtocolExtensionContainer_8858P59, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P59 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P59_tags_119,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P59_tags_119)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P59_tags_119[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P59_tags_119,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P59_tags_119)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P59_tags_119[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P59_constr_119, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P59_119,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P59_specs_119	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P60_121[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RelativeNarrowbandTxPower_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P60_tags_121[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P60_specs_121 = {
-	sizeof(struct ProtocolExtensionContainer_8858P60),
-	offsetof(struct ProtocolExtensionContainer_8858P60, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P60 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P60_tags_121,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P60_tags_121)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P60_tags_121[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P60_tags_121,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P60_tags_121)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P60_tags_121[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P60_constr_121, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P60_121,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P60_specs_121	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P61_123[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RSRPMeasurementResult_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P61_tags_123[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P61_specs_123 = {
-	sizeof(struct ProtocolExtensionContainer_8858P61),
-	offsetof(struct ProtocolExtensionContainer_8858P61, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P61 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P61_tags_123,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P61_tags_123)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P61_tags_123[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P61_tags_123,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P61_tags_123)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P61_tags_123[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P61_constr_123, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P61_123,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P61_specs_123	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P62_125[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RSRPMRList_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P62_tags_125[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P62_specs_125 = {
-	sizeof(struct ProtocolExtensionContainer_8858P62),
-	offsetof(struct ProtocolExtensionContainer_8858P62, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P62 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P62_tags_125,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P62_tags_125)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P62_tags_125[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P62_tags_125,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P62_tags_125)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P62_tags_125[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P62_constr_125, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P62_125,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P62_specs_125	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P63_127[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_S1TNLLoadIndicator_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P63_tags_127[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P63_specs_127 = {
-	sizeof(struct ProtocolExtensionContainer_8858P63),
-	offsetof(struct ProtocolExtensionContainer_8858P63, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P63 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P63_tags_127,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P63_tags_127)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P63_tags_127[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P63_tags_127,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P63_tags_127)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P63_tags_127[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P63_constr_127, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P63_127,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P63_specs_127	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P64_129[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedCell_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P64_tags_129[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P64_specs_129 = {
-	sizeof(struct ProtocolExtensionContainer_8858P64),
-	offsetof(struct ProtocolExtensionContainer_8858P64, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P64 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P64_tags_129,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P64_tags_129)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P64_tags_129[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P64_tags_129,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P64_tags_129)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P64_tags_129[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P64_constr_129, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P64_129,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P64_specs_129	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P65_131[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedCell_Information_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P65_tags_131[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P65_specs_131 = {
-	sizeof(struct ProtocolExtensionContainer_8858P65),
-	offsetof(struct ProtocolExtensionContainer_8858P65, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P65 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P65_tags_131,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P65_tags_131)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P65_tags_131[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P65_tags_131,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P65_tags_131)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P65_tags_131[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P65_constr_131, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P65_131,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P65_specs_131	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P66_133[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_SpecialSubframe_Info_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P66_tags_133[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P66_specs_133 = {
-	sizeof(struct ProtocolExtensionContainer_8858P66),
-	offsetof(struct ProtocolExtensionContainer_8858P66, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P66 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P66_tags_133,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P66_tags_133)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P66_tags_133[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P66_tags_133,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P66_tags_133)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P66_tags_133[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P66_constr_133, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P66_133,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P66_specs_133	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P67_135[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_SubbandCQI_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P67_tags_135[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P67_specs_135 = {
-	sizeof(struct ProtocolExtensionContainer_8858P67),
-	offsetof(struct ProtocolExtensionContainer_8858P67, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P67 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P67_tags_135,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P67_tags_135)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P67_tags_135[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P67_tags_135,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P67_tags_135)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P67_tags_135[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P67_constr_135, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P67_135,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P67_specs_135	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P68_137[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_SubbandCQIItem_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P68_tags_137[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P68_specs_137 = {
-	sizeof(struct ProtocolExtensionContainer_8858P68),
-	offsetof(struct ProtocolExtensionContainer_8858P68, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P68 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P68_tags_137,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P68_tags_137)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P68_tags_137[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P68_tags_137,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P68_tags_137)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P68_tags_137[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P68_constr_137, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P68_137,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P68_specs_137	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P69_139[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_SULInformation_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P69_tags_139[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P69_specs_139 = {
-	sizeof(struct ProtocolExtensionContainer_8858P69),
-	offsetof(struct ProtocolExtensionContainer_8858P69, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P69 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P69_tags_139,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P69_tags_139)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P69_tags_139[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P69_tags_139,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P69_tags_139)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P69_tags_139[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P69_constr_139, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P69_139,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P69_specs_139	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P70_141[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_SupportedSULFreqBandItem_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P70_tags_141[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P70_specs_141 = {
-	sizeof(struct ProtocolExtensionContainer_8858P70),
-	offsetof(struct ProtocolExtensionContainer_8858P70, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P70 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P70_tags_141,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P70_tags_141)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P70_tags_141[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P70_tags_141,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P70_tags_141)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P70_tags_141[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P70_constr_141, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P70_141,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P70_specs_141	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P71_143[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_TDD_Info_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P71_tags_143[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P71_specs_143 = {
-	sizeof(struct ProtocolExtensionContainer_8858P71),
-	offsetof(struct ProtocolExtensionContainer_8858P71, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P71 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P71_tags_143,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P71_tags_143)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P71_tags_143[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P71_tags_143,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P71_tags_143)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P71_tags_143[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P71_constr_143, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P71_143,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P71_specs_143	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P72_145[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P72_tags_145[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P72_specs_145 = {
-	sizeof(struct ProtocolExtensionContainer_8858P72),
-	offsetof(struct ProtocolExtensionContainer_8858P72, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P72 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P72_tags_145,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P72_tags_145)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P72_tags_145[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P72_tags_145,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P72_tags_145)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P72_tags_145[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P72_constr_145, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P72_145,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P72_specs_145	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P73_147[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_UsableABSInformationFDD_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P73_tags_147[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P73_specs_147 = {
-	sizeof(struct ProtocolExtensionContainer_8858P73),
-	offsetof(struct ProtocolExtensionContainer_8858P73, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P73 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P73_tags_147,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P73_tags_147)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P73_tags_147[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P73_tags_147,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P73_tags_147)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P73_tags_147[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P73_constr_147, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P73_147,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P73_specs_147	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P74_149[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_UsableABSInformationTDD_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P74_tags_149[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P74_specs_149 = {
-	sizeof(struct ProtocolExtensionContainer_8858P74),
-	offsetof(struct ProtocolExtensionContainer_8858P74, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P74 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P74_tags_149,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P74_tags_149)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P74_tags_149[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P74_tags_149,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P74_tags_149)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P74_tags_149[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P74_constr_149, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P74_149,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P74_specs_149	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P75_151[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_WidebandCQI_ExtIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolExtensionContainer_8858P75_tags_151[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P75_specs_151 = {
-	sizeof(struct ProtocolExtensionContainer_8858P75),
-	offsetof(struct ProtocolExtensionContainer_8858P75, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P75 = {
-	"ProtocolExtensionContainer",
-	"ProtocolExtensionContainer",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolExtensionContainer_8858P75_tags_151,
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P75_tags_151)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P75_tags_151[0]), /* 1 */
-	asn_DEF_ProtocolExtensionContainer_8858P75_tags_151,	/* Same as above */
-	sizeof(asn_DEF_ProtocolExtensionContainer_8858P75_tags_151)
-		/sizeof(asn_DEF_ProtocolExtensionContainer_8858P75_tags_151[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolExtensionContainer_8858P75_constr_151, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolExtensionContainer_8858P75_151,
-	1,	/* Single element */
-	&asn_SPC_ProtocolExtensionContainer_8858P75_specs_151	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ProtocolExtensionContainer.h b/3rdparty/libe2ap/ProtocolExtensionContainer.h
deleted file mode 100644
index 30f64ac..0000000
--- a/3rdparty/libe2ap/ProtocolExtensionContainer.h
+++ /dev/null
@@ -1,869 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-Containers"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ProtocolExtensionContainer_H_
-#define	_ProtocolExtensionContainer_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct CellInformation_Item_ExtIEs;
-struct ServedCellsToModify_Item_ExtIEs;
-struct CellToReport_Item_ExtIEs;
-struct MeasurementInitiationResult_Item_ExtIEs;
-struct MeasurementFailureCause_Item_ExtIEs;
-struct CompleteFailureCauseInformation_Item_ExtIEs;
-struct CellMeasurementResult_Item_ExtIEs;
-struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs;
-struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs;
-struct ServedEUTRAcellsENDCX2Management_ExtIEs;
-struct En_gNBServedCells_ExtIEs;
-struct ServedNRCell_Information_ExtIEs;
-struct FDD_InfoServedNRCell_Information_ExtIEs;
-struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs;
-struct TDD_InfoServedNRCell_Information_ExtIEs;
-struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs;
-struct NRNeighbour_Information_ExtIEs;
-struct Limited_list_ExtIEs;
-struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs;
-struct ServedNRCellsToModify_Item_ExtIEs;
-struct ABSInformationFDD_ExtIEs;
-struct ABSInformationTDD_ExtIEs;
-struct ABS_Status_ExtIEs;
-struct AdditionalSpecialSubframe_Info_ExtIEs;
-struct AdditionalSpecialSubframeExtension_Info_ExtIEs;
-struct CellBasedQMC_ExtIEs;
-struct CellReplacingInfo_ExtIEs;
-struct CoMPHypothesisSetItem_ExtIEs;
-struct CoMPInformation_ExtIEs;
-struct CoMPInformationItem_ExtIEs;
-struct CoMPInformationStartTime_ExtIEs;
-struct CompositeAvailableCapacity_ExtIEs;
-struct CompositeAvailableCapacityGroup_ExtIEs;
-struct CriticalityDiagnostics_ExtIEs;
-struct CriticalityDiagnostics_IE_List_ExtIEs;
-struct CSIReportList_ExtIEs;
-struct CSIReportPerCSIProcess_ExtIEs;
-struct CSIReportPerCSIProcessItem_ExtIEs;
-struct DynamicNAICSInformation_ExtIEs;
-struct ECGI_ExtIEs;
-struct EnhancedRNTP_ExtIEs;
-struct EnhancedRNTPStartTime_ExtIEs;
-struct ExtendedULInterferenceOverloadInfo_ExtIEs;
-struct FDD_Info_ExtIEs;
-struct FreqBandNrItem_ExtIEs;
-struct GlobalENB_ID_ExtIEs;
-struct GlobalGNB_ID_ExtIEs;
-struct GU_Group_ID_ExtIEs;
-struct HWLoadIndicator_ExtIEs;
-struct MBSFN_Subframe_Info_ExtIEs;
-struct BandInfo_ExtIEs;
-struct Neighbour_Information_ExtIEs;
-struct NRFreqInfo_ExtIEs;
-struct NRCGI_ExtIEs;
-struct NR_TxBW_ExtIEs;
-struct PRACH_Configuration_ExtIEs;
-struct ProtectedEUTRAResourceIndication_ExtIEs;
-struct ProtectedFootprintTimePattern_ExtIEs;
-struct ProtectedResourceList_Item_ExtIEs;
-struct RadioResourceStatus_ExtIEs;
-struct RelativeNarrowbandTxPower_ExtIEs;
-struct RSRPMeasurementResult_ExtIEs;
-struct RSRPMRList_ExtIEs;
-struct S1TNLLoadIndicator_ExtIEs;
-struct ServedCell_ExtIEs;
-struct ServedCell_Information_ExtIEs;
-struct SpecialSubframe_Info_ExtIEs;
-struct SubbandCQI_ExtIEs;
-struct SubbandCQIItem_ExtIEs;
-struct SULInformation_ExtIEs;
-struct SupportedSULFreqBandItem_ExtIEs;
-struct TDD_Info_ExtIEs;
-struct UL_HighInterferenceIndicationInfo_Item_ExtIEs;
-struct UsableABSInformationFDD_ExtIEs;
-struct UsableABSInformationTDD_ExtIEs;
-struct WidebandCQI_ExtIEs;
-
-/* ProtocolExtensionContainer */
-typedef struct ProtocolExtensionContainer_8858P0 {
-	A_SEQUENCE_OF(struct CellInformation_Item_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P0_t;
-typedef struct ProtocolExtensionContainer_8858P1 {
-	A_SEQUENCE_OF(struct ServedCellsToModify_Item_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P1_t;
-typedef struct ProtocolExtensionContainer_8858P2 {
-	A_SEQUENCE_OF(struct CellToReport_Item_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P2_t;
-typedef struct ProtocolExtensionContainer_8858P3 {
-	A_SEQUENCE_OF(struct MeasurementInitiationResult_Item_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P3_t;
-typedef struct ProtocolExtensionContainer_8858P4 {
-	A_SEQUENCE_OF(struct MeasurementFailureCause_Item_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P4_t;
-typedef struct ProtocolExtensionContainer_8858P5 {
-	A_SEQUENCE_OF(struct CompleteFailureCauseInformation_Item_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P5_t;
-typedef struct ProtocolExtensionContainer_8858P6 {
-	A_SEQUENCE_OF(struct CellMeasurementResult_Item_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P6_t;
-typedef struct ProtocolExtensionContainer_8858P7 {
-	A_SEQUENCE_OF(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P7_t;
-typedef struct ProtocolExtensionContainer_8858P8 {
-	A_SEQUENCE_OF(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P8_t;
-typedef struct ProtocolExtensionContainer_8858P9 {
-	A_SEQUENCE_OF(struct ServedEUTRAcellsENDCX2Management_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P9_t;
-typedef struct ProtocolExtensionContainer_8858P10 {
-	A_SEQUENCE_OF(struct En_gNBServedCells_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P10_t;
-typedef struct ProtocolExtensionContainer_8858P11 {
-	A_SEQUENCE_OF(struct ServedNRCell_Information_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P11_t;
-typedef struct ProtocolExtensionContainer_8858P12 {
-	A_SEQUENCE_OF(struct FDD_InfoServedNRCell_Information_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P12_t;
-typedef struct ProtocolExtensionContainer_8858P13 {
-	A_SEQUENCE_OF(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P13_t;
-typedef struct ProtocolExtensionContainer_8858P14 {
-	A_SEQUENCE_OF(struct TDD_InfoServedNRCell_Information_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P14_t;
-typedef struct ProtocolExtensionContainer_8858P15 {
-	A_SEQUENCE_OF(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P15_t;
-typedef struct ProtocolExtensionContainer_8858P16 {
-	A_SEQUENCE_OF(struct NRNeighbour_Information_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P16_t;
-typedef struct ProtocolExtensionContainer_8858P17 {
-	A_SEQUENCE_OF(struct Limited_list_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P17_t;
-typedef struct ProtocolExtensionContainer_8858P18 {
-	A_SEQUENCE_OF(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P18_t;
-typedef struct ProtocolExtensionContainer_8858P19 {
-	A_SEQUENCE_OF(struct ServedNRCellsToModify_Item_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P19_t;
-typedef struct ProtocolExtensionContainer_8858P20 {
-	A_SEQUENCE_OF(struct ABSInformationFDD_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P20_t;
-typedef struct ProtocolExtensionContainer_8858P21 {
-	A_SEQUENCE_OF(struct ABSInformationTDD_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P21_t;
-typedef struct ProtocolExtensionContainer_8858P22 {
-	A_SEQUENCE_OF(struct ABS_Status_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P22_t;
-typedef struct ProtocolExtensionContainer_8858P23 {
-	A_SEQUENCE_OF(struct AdditionalSpecialSubframe_Info_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P23_t;
-typedef struct ProtocolExtensionContainer_8858P24 {
-	A_SEQUENCE_OF(struct AdditionalSpecialSubframeExtension_Info_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P24_t;
-typedef struct ProtocolExtensionContainer_8858P25 {
-	A_SEQUENCE_OF(struct CellBasedQMC_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P25_t;
-typedef struct ProtocolExtensionContainer_8858P26 {
-	A_SEQUENCE_OF(struct CellReplacingInfo_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P26_t;
-typedef struct ProtocolExtensionContainer_8858P27 {
-	A_SEQUENCE_OF(struct CoMPHypothesisSetItem_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P27_t;
-typedef struct ProtocolExtensionContainer_8858P28 {
-	A_SEQUENCE_OF(struct CoMPInformation_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P28_t;
-typedef struct ProtocolExtensionContainer_8858P29 {
-	A_SEQUENCE_OF(struct CoMPInformationItem_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P29_t;
-typedef struct ProtocolExtensionContainer_8858P30 {
-	A_SEQUENCE_OF(struct CoMPInformationStartTime_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P30_t;
-typedef struct ProtocolExtensionContainer_8858P31 {
-	A_SEQUENCE_OF(struct CompositeAvailableCapacity_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P31_t;
-typedef struct ProtocolExtensionContainer_8858P32 {
-	A_SEQUENCE_OF(struct CompositeAvailableCapacityGroup_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P32_t;
-typedef struct ProtocolExtensionContainer_8858P33 {
-	A_SEQUENCE_OF(struct CriticalityDiagnostics_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P33_t;
-typedef struct ProtocolExtensionContainer_8858P34 {
-	A_SEQUENCE_OF(struct CriticalityDiagnostics_IE_List_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P34_t;
-typedef struct ProtocolExtensionContainer_8858P35 {
-	A_SEQUENCE_OF(struct CSIReportList_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P35_t;
-typedef struct ProtocolExtensionContainer_8858P36 {
-	A_SEQUENCE_OF(struct CSIReportPerCSIProcess_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P36_t;
-typedef struct ProtocolExtensionContainer_8858P37 {
-	A_SEQUENCE_OF(struct CSIReportPerCSIProcessItem_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P37_t;
-typedef struct ProtocolExtensionContainer_8858P38 {
-	A_SEQUENCE_OF(struct DynamicNAICSInformation_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P38_t;
-typedef struct ProtocolExtensionContainer_8858P39 {
-	A_SEQUENCE_OF(struct ECGI_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P39_t;
-typedef struct ProtocolExtensionContainer_8858P40 {
-	A_SEQUENCE_OF(struct EnhancedRNTP_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P40_t;
-typedef struct ProtocolExtensionContainer_8858P41 {
-	A_SEQUENCE_OF(struct EnhancedRNTPStartTime_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P41_t;
-typedef struct ProtocolExtensionContainer_8858P42 {
-	A_SEQUENCE_OF(struct ExtendedULInterferenceOverloadInfo_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P42_t;
-typedef struct ProtocolExtensionContainer_8858P43 {
-	A_SEQUENCE_OF(struct FDD_Info_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P43_t;
-typedef struct ProtocolExtensionContainer_8858P44 {
-	A_SEQUENCE_OF(struct FreqBandNrItem_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P44_t;
-typedef struct ProtocolExtensionContainer_8858P45 {
-	A_SEQUENCE_OF(struct GlobalENB_ID_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P45_t;
-typedef struct ProtocolExtensionContainer_8858P46 {
-	A_SEQUENCE_OF(struct GlobalGNB_ID_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P46_t;
-typedef struct ProtocolExtensionContainer_8858P47 {
-	A_SEQUENCE_OF(struct GU_Group_ID_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P47_t;
-typedef struct ProtocolExtensionContainer_8858P48 {
-	A_SEQUENCE_OF(struct HWLoadIndicator_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P48_t;
-typedef struct ProtocolExtensionContainer_8858P49 {
-	A_SEQUENCE_OF(struct MBSFN_Subframe_Info_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P49_t;
-typedef struct ProtocolExtensionContainer_8858P50 {
-	A_SEQUENCE_OF(struct BandInfo_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P50_t;
-typedef struct ProtocolExtensionContainer_8858P51 {
-	A_SEQUENCE_OF(struct Neighbour_Information_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P51_t;
-typedef struct ProtocolExtensionContainer_8858P52 {
-	A_SEQUENCE_OF(struct NRFreqInfo_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P52_t;
-typedef struct ProtocolExtensionContainer_8858P53 {
-	A_SEQUENCE_OF(struct NRCGI_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P53_t;
-typedef struct ProtocolExtensionContainer_8858P54 {
-	A_SEQUENCE_OF(struct NR_TxBW_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P54_t;
-typedef struct ProtocolExtensionContainer_8858P55 {
-	A_SEQUENCE_OF(struct PRACH_Configuration_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P55_t;
-typedef struct ProtocolExtensionContainer_8858P56 {
-	A_SEQUENCE_OF(struct ProtectedEUTRAResourceIndication_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P56_t;
-typedef struct ProtocolExtensionContainer_8858P57 {
-	A_SEQUENCE_OF(struct ProtectedFootprintTimePattern_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P57_t;
-typedef struct ProtocolExtensionContainer_8858P58 {
-	A_SEQUENCE_OF(struct ProtectedResourceList_Item_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P58_t;
-typedef struct ProtocolExtensionContainer_8858P59 {
-	A_SEQUENCE_OF(struct RadioResourceStatus_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P59_t;
-typedef struct ProtocolExtensionContainer_8858P60 {
-	A_SEQUENCE_OF(struct RelativeNarrowbandTxPower_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P60_t;
-typedef struct ProtocolExtensionContainer_8858P61 {
-	A_SEQUENCE_OF(struct RSRPMeasurementResult_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P61_t;
-typedef struct ProtocolExtensionContainer_8858P62 {
-	A_SEQUENCE_OF(struct RSRPMRList_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P62_t;
-typedef struct ProtocolExtensionContainer_8858P63 {
-	A_SEQUENCE_OF(struct S1TNLLoadIndicator_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P63_t;
-typedef struct ProtocolExtensionContainer_8858P64 {
-	A_SEQUENCE_OF(struct ServedCell_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P64_t;
-typedef struct ProtocolExtensionContainer_8858P65 {
-	A_SEQUENCE_OF(struct ServedCell_Information_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P65_t;
-typedef struct ProtocolExtensionContainer_8858P66 {
-	A_SEQUENCE_OF(struct SpecialSubframe_Info_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P66_t;
-typedef struct ProtocolExtensionContainer_8858P67 {
-	A_SEQUENCE_OF(struct SubbandCQI_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P67_t;
-typedef struct ProtocolExtensionContainer_8858P68 {
-	A_SEQUENCE_OF(struct SubbandCQIItem_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P68_t;
-typedef struct ProtocolExtensionContainer_8858P69 {
-	A_SEQUENCE_OF(struct SULInformation_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P69_t;
-typedef struct ProtocolExtensionContainer_8858P70 {
-	A_SEQUENCE_OF(struct SupportedSULFreqBandItem_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P70_t;
-typedef struct ProtocolExtensionContainer_8858P71 {
-	A_SEQUENCE_OF(struct TDD_Info_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P71_t;
-typedef struct ProtocolExtensionContainer_8858P72 {
-	A_SEQUENCE_OF(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P72_t;
-typedef struct ProtocolExtensionContainer_8858P73 {
-	A_SEQUENCE_OF(struct UsableABSInformationFDD_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P73_t;
-typedef struct ProtocolExtensionContainer_8858P74 {
-	A_SEQUENCE_OF(struct UsableABSInformationTDD_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P74_t;
-typedef struct ProtocolExtensionContainer_8858P75 {
-	A_SEQUENCE_OF(struct WidebandCQI_ExtIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolExtensionContainer_8858P75_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P0;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P0_specs_1;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P0_1[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P0_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P1;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P1_specs_3;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P1_3[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P1_constr_3;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P2;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P2_specs_5;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P2_5[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P2_constr_5;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P3;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P3_specs_7;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P3_7[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P3_constr_7;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P4;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P4_specs_9;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P4_9[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P4_constr_9;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P5;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P5_specs_11;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P5_11[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P5_constr_11;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P6;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P6_specs_13;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P6_13[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P6_constr_13;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P7;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P7_specs_15;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P7_15[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P7_constr_15;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P8;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P8_specs_17;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P8_17[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P8_constr_17;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P9;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P9_specs_19;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P9_19[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P9_constr_19;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P10;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P10_specs_21;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P10_21[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P10_constr_21;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P11;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P11_specs_23;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P11_23[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P11_constr_23;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P12;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P12_specs_25;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P12_25[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P12_constr_25;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P13;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P13_specs_27;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P13_27[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P13_constr_27;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P14;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P14_specs_29;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P14_29[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P14_constr_29;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P15;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P15_specs_31;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P15_31[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P15_constr_31;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P16;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P16_specs_33;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P16_33[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P16_constr_33;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P17;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P17_specs_35;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P17_35[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P17_constr_35;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P18;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P18_specs_37;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P18_37[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P18_constr_37;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P19;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P19_specs_39;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P19_39[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P19_constr_39;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P20;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P20_specs_41;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P20_41[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P20_constr_41;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P21;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P21_specs_43;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P21_43[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P21_constr_43;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P22;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P22_specs_45;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P22_45[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P22_constr_45;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P23;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P23_specs_47;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P23_47[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P23_constr_47;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P24;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P24_specs_49;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P24_49[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P24_constr_49;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P25;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P25_specs_51;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P25_51[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P25_constr_51;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P26;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P26_specs_53;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P26_53[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P26_constr_53;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P27;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P27_specs_55;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P27_55[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P27_constr_55;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P28;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P28_specs_57;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P28_57[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P28_constr_57;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P29;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P29_specs_59;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P29_59[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P29_constr_59;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P30;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P30_specs_61;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P30_61[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P30_constr_61;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P31;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P31_specs_63;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P31_63[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P31_constr_63;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P32;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P32_specs_65;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P32_65[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P32_constr_65;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P33;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P33_specs_67;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P33_67[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P33_constr_67;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P34;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P34_specs_69;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P34_69[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P34_constr_69;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P35;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P35_specs_71;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P35_71[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P35_constr_71;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P36;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P36_specs_73;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P36_73[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P36_constr_73;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P37;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P37_specs_75;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P37_75[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P37_constr_75;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P38;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P38_specs_77;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P38_77[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P38_constr_77;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P39;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P39_specs_79;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P39_79[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P39_constr_79;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P40;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P40_specs_81;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P40_81[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P40_constr_81;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P41;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P41_specs_83;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P41_83[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P41_constr_83;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P42;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P42_specs_85;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P42_85[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P42_constr_85;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P43;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P43_specs_87;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P43_87[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P43_constr_87;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P44;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P44_specs_89;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P44_89[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P44_constr_89;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P45;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P45_specs_91;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P45_91[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P45_constr_91;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P46;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P46_specs_93;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P46_93[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P46_constr_93;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P47;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P47_specs_95;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P47_95[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P47_constr_95;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P48;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P48_specs_97;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P48_97[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P48_constr_97;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P49;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P49_specs_99;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P49_99[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P49_constr_99;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P50;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P50_specs_101;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P50_101[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P50_constr_101;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P51;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P51_specs_103;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P51_103[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P51_constr_103;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P52;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P52_specs_105;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P52_105[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P52_constr_105;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P53;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P53_specs_107;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P53_107[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P53_constr_107;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P54;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P54_specs_109;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P54_109[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P54_constr_109;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P55;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P55_specs_111;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P55_111[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P55_constr_111;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P56;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P56_specs_113;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P56_113[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P56_constr_113;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P57;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P57_specs_115;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P57_115[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P57_constr_115;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P58;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P58_specs_117;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P58_117[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P58_constr_117;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P59;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P59_specs_119;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P59_119[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P59_constr_119;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P60;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P60_specs_121;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P60_121[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P60_constr_121;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P61;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P61_specs_123;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P61_123[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P61_constr_123;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P62;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P62_specs_125;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P62_125[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P62_constr_125;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P63;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P63_specs_127;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P63_127[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P63_constr_127;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P64;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P64_specs_129;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P64_129[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P64_constr_129;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P65;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P65_specs_131;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P65_131[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P65_constr_131;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P66;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P66_specs_133;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P66_133[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P66_constr_133;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P67;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P67_specs_135;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P67_135[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P67_constr_135;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P68;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P68_specs_137;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P68_137[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P68_constr_137;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P69;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P69_specs_139;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P69_139[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P69_constr_139;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P70;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P70_specs_141;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P70_141[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P70_constr_141;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P71;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P71_specs_143;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P71_143[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P71_constr_143;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P72;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P72_specs_145;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P72_145[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P72_constr_145;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P73;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P73_specs_147;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P73_147[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P73_constr_147;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P74;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P74_specs_149;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P74_149[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P74_constr_149;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_8858P75;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_8858P75_specs_151;
-extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_8858P75_151[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_8858P75_constr_151;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ProtocolExtensionContainer_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ProtocolExtensionField.c b/3rdparty/libe2ap/ProtocolExtensionField.c
deleted file mode 100644
index dfb1c20..0000000
--- a/3rdparty/libe2ap/ProtocolExtensionField.c
+++ /dev/null
@@ -1,13647 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-Containers"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ProtocolExtensionField.h"
-
-static const long asn_VAL_1_id_ABSInformation = 61;
-static const long asn_VAL_1_ignore = 1;
-static const long asn_VAL_1_optional = 0;
-static const long asn_VAL_2_id_InvokeIndication = 62;
-static const long asn_VAL_2_ignore = 1;
-static const long asn_VAL_2_optional = 0;
-static const long asn_VAL_3_id_IntendedULDLConfiguration = 99;
-static const long asn_VAL_3_ignore = 1;
-static const long asn_VAL_3_optional = 0;
-static const long asn_VAL_4_id_ExtendedULInterferenceOverloadInfo = 100;
-static const long asn_VAL_4_ignore = 1;
-static const long asn_VAL_4_optional = 0;
-static const long asn_VAL_5_id_CoMPInformation = 108;
-static const long asn_VAL_5_ignore = 1;
-static const long asn_VAL_5_optional = 0;
-static const long asn_VAL_6_id_DynamicDLTransmissionInformation = 106;
-static const long asn_VAL_6_ignore = 1;
-static const long asn_VAL_6_optional = 0;
-static const asn_ioc_cell_t asn_IOS_CellInformation_Item_ExtIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_1_id_ABSInformation },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_1_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_ABSInformation },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_1_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_2_id_InvokeIndication },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_2_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_InvokeIndication },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_2_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_3_id_IntendedULDLConfiguration },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_3_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_SubframeAssignment },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_3_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_4_id_ExtendedULInterferenceOverloadInfo },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_4_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_ExtendedULInterferenceOverloadInfo },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_4_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_5_id_CoMPInformation },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_5_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_CoMPInformation },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_5_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_6_id_DynamicDLTransmissionInformation },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_DynamicDLTransmissionInformation },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_6_optional }
-};
-static const asn_ioc_set_t asn_IOS_CellInformation_Item_ExtIEs_1[] = {
-	{ 6, 4, asn_IOS_CellInformation_Item_ExtIEs_1_rows }
-};
-static const long asn_VAL_7_id_DeactivationIndication = 59;
-static const long asn_VAL_7_ignore = 1;
-static const long asn_VAL_7_optional = 0;
-static const asn_ioc_cell_t asn_IOS_ServedCellsToModify_Item_ExtIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_7_id_DeactivationIndication },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_DeactivationIndication },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_7_optional }
-};
-static const asn_ioc_set_t asn_IOS_ServedCellsToModify_Item_ExtIEs_1[] = {
-	{ 1, 4, asn_IOS_ServedCellsToModify_Item_ExtIEs_1_rows }
-};
-static const long asn_VAL_8_id_CompositeAvailableCapacityGroup = 42;
-static const long asn_VAL_8_ignore = 1;
-static const long asn_VAL_8_optional = 0;
-static const long asn_VAL_9_id_ABS_Status = 63;
-static const long asn_VAL_9_ignore = 1;
-static const long asn_VAL_9_optional = 0;
-static const long asn_VAL_10_id_RSRPMRList = 110;
-static const long asn_VAL_10_ignore = 1;
-static const long asn_VAL_10_optional = 0;
-static const long asn_VAL_11_id_CSIReportList = 146;
-static const long asn_VAL_11_ignore = 1;
-static const long asn_VAL_11_optional = 0;
-static const long asn_VAL_12_id_CellReportingIndicator = 170;
-static const long asn_VAL_12_ignore = 1;
-static const long asn_VAL_12_optional = 0;
-static const asn_ioc_cell_t asn_IOS_CellMeasurementResult_Item_ExtIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_8_id_CompositeAvailableCapacityGroup },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_CompositeAvailableCapacityGroup },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_8_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_9_id_ABS_Status },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_ABS_Status },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_9_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_10_id_RSRPMRList },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_10_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_RSRPMRList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_10_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_11_id_CSIReportList },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_11_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_CSIReportList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_11_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_12_id_CellReportingIndicator },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_12_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_CellReportingIndicator },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_12_optional }
-};
-static const asn_ioc_set_t asn_IOS_CellMeasurementResult_Item_ExtIEs_1[] = {
-	{ 5, 4, asn_IOS_CellMeasurementResult_Item_ExtIEs_1_rows }
-};
-static const long asn_VAL_13_id_UL_EARFCNExtension = 95;
-static const long asn_VAL_13_reject = 0;
-static const long asn_VAL_13_optional = 0;
-static const long asn_VAL_14_id_DL_EARFCNExtension = 96;
-static const long asn_VAL_14_reject = 0;
-static const long asn_VAL_14_optional = 0;
-static const long asn_VAL_15_id_OffsetOfNbiotChannelNumberToDL_EARFCN = 177;
-static const long asn_VAL_15_reject = 0;
-static const long asn_VAL_15_optional = 0;
-static const long asn_VAL_16_id_OffsetOfNbiotChannelNumberToUL_EARFCN = 178;
-static const long asn_VAL_16_reject = 0;
-static const long asn_VAL_16_optional = 0;
-static const long asn_VAL_17_id_NRS_NSSS_PowerOffset = 282;
-static const long asn_VAL_17_ignore = 1;
-static const long asn_VAL_17_optional = 0;
-static const long asn_VAL_18_id_NSSS_NumOccasionDifferentPrecoder = 283;
-static const long asn_VAL_18_ignore = 1;
-static const long asn_VAL_18_optional = 0;
-static const asn_ioc_cell_t asn_IOS_FDD_Info_ExtIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_13_id_UL_EARFCNExtension },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_13_reject },
-	{ "&Extension", aioc__type, &asn_DEF_EARFCNExtension },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_13_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_14_id_DL_EARFCNExtension },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_14_reject },
-	{ "&Extension", aioc__type, &asn_DEF_EARFCNExtension },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_14_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_15_id_OffsetOfNbiotChannelNumberToDL_EARFCN },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_15_reject },
-	{ "&Extension", aioc__type, &asn_DEF_OffsetOfNbiotChannelNumberToEARFCN },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_15_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_16_id_OffsetOfNbiotChannelNumberToUL_EARFCN },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_16_reject },
-	{ "&Extension", aioc__type, &asn_DEF_OffsetOfNbiotChannelNumberToEARFCN },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_16_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_17_id_NRS_NSSS_PowerOffset },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_17_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_NRS_NSSS_PowerOffset },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_17_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_18_id_NSSS_NumOccasionDifferentPrecoder },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_18_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_NSSS_NumOccasionDifferentPrecoder },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_18_optional }
-};
-static const asn_ioc_set_t asn_IOS_FDD_Info_ExtIEs_1[] = {
-	{ 6, 4, asn_IOS_FDD_Info_ExtIEs_1_rows }
-};
-static const long asn_VAL_19_id_NeighbourTAC = 76;
-static const long asn_VAL_19_ignore = 1;
-static const long asn_VAL_19_optional = 0;
-static const long asn_VAL_20_id_eARFCNExtension = 94;
-static const long asn_VAL_20_reject = 0;
-static const long asn_VAL_20_optional = 0;
-static const asn_ioc_cell_t asn_IOS_Neighbour_Information_ExtIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_19_id_NeighbourTAC },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_19_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_TAC },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_19_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_20_id_eARFCNExtension },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_20_reject },
-	{ "&Extension", aioc__type, &asn_DEF_EARFCNExtension },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_20_optional }
-};
-static const asn_ioc_set_t asn_IOS_Neighbour_Information_ExtIEs_1[] = {
-	{ 2, 4, asn_IOS_Neighbour_Information_ExtIEs_1_rows }
-};
-static const long asn_VAL_21_id_DL_scheduling_PDCCH_CCE_usage = 193;
-static const long asn_VAL_21_ignore = 1;
-static const long asn_VAL_21_optional = 0;
-static const long asn_VAL_22_id_UL_scheduling_PDCCH_CCE_usage = 194;
-static const long asn_VAL_22_ignore = 1;
-static const long asn_VAL_22_optional = 0;
-static const asn_ioc_cell_t asn_IOS_RadioResourceStatus_ExtIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_21_id_DL_scheduling_PDCCH_CCE_usage },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_21_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_DL_scheduling_PDCCH_CCE_usage },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_21_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_22_id_UL_scheduling_PDCCH_CCE_usage },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_22_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_UL_scheduling_PDCCH_CCE_usage },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_22_optional }
-};
-static const asn_ioc_set_t asn_IOS_RadioResourceStatus_ExtIEs_1[] = {
-	{ 2, 4, asn_IOS_RadioResourceStatus_ExtIEs_1_rows }
-};
-static const long asn_VAL_23_id_enhancedRNTP = 148;
-static const long asn_VAL_23_ignore = 1;
-static const long asn_VAL_23_optional = 0;
-static const asn_ioc_cell_t asn_IOS_RelativeNarrowbandTxPower_ExtIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_23_id_enhancedRNTP },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_23_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_EnhancedRNTP },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_23_optional }
-};
-static const asn_ioc_set_t asn_IOS_RelativeNarrowbandTxPower_ExtIEs_1[] = {
-	{ 1, 4, asn_IOS_RelativeNarrowbandTxPower_ExtIEs_1_rows }
-};
-static const long asn_VAL_24_id_UEID = 147;
-static const long asn_VAL_24_ignore = 1;
-static const long asn_VAL_24_optional = 0;
-static const asn_ioc_cell_t asn_IOS_RSRPMRList_ExtIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_24_id_UEID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_24_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_UEID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_24_optional }
-};
-static const asn_ioc_set_t asn_IOS_RSRPMRList_ExtIEs_1[] = {
-	{ 1, 4, asn_IOS_RSRPMRList_ExtIEs_1_rows }
-};
-static const long asn_VAL_25_id_Number_of_Antennaports = 41;
-static const long asn_VAL_25_ignore = 1;
-static const long asn_VAL_25_optional = 0;
-static const long asn_VAL_26_id_PRACH_Configuration = 55;
-static const long asn_VAL_26_ignore = 1;
-static const long asn_VAL_26_optional = 0;
-static const long asn_VAL_27_id_MBSFN_Subframe_Info = 56;
-static const long asn_VAL_27_ignore = 1;
-static const long asn_VAL_27_optional = 0;
-static const long asn_VAL_28_id_CSG_Id = 70;
-static const long asn_VAL_28_ignore = 1;
-static const long asn_VAL_28_optional = 0;
-static const long asn_VAL_29_id_MBMS_Service_Area_List = 79;
-static const long asn_VAL_29_ignore = 1;
-static const long asn_VAL_29_optional = 0;
-static const long asn_VAL_30_id_MultibandInfoList = 84;
-static const long asn_VAL_30_ignore = 1;
-static const long asn_VAL_30_optional = 0;
-static const long asn_VAL_31_id_FreqBandIndicatorPriority = 160;
-static const long asn_VAL_31_ignore = 1;
-static const long asn_VAL_31_optional = 0;
-static const long asn_VAL_32_id_BandwidthReducedSI = 180;
-static const long asn_VAL_32_ignore = 1;
-static const long asn_VAL_32_optional = 0;
-static const long asn_VAL_33_id_ProtectedEUTRAResourceIndication = 284;
-static const long asn_VAL_33_ignore = 1;
-static const long asn_VAL_33_optional = 0;
-static const asn_ioc_cell_t asn_IOS_ServedCell_Information_ExtIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_25_id_Number_of_Antennaports },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_25_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_Number_of_Antennaports },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_25_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_26_id_PRACH_Configuration },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_26_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_PRACH_Configuration },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_26_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_27_id_MBSFN_Subframe_Info },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_27_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_MBSFN_Subframe_Infolist },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_27_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_28_id_CSG_Id },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_28_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_CSG_Id },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_28_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_29_id_MBMS_Service_Area_List },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_29_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_MBMS_Service_Area_Identity_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_29_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_30_id_MultibandInfoList },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_30_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_MultibandInfoList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_30_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_31_id_FreqBandIndicatorPriority },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_31_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_FreqBandIndicatorPriority },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_31_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_32_id_BandwidthReducedSI },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_32_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_BandwidthReducedSI },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_32_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_33_id_ProtectedEUTRAResourceIndication },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_33_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_ProtectedEUTRAResourceIndication },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_33_optional }
-};
-static const asn_ioc_set_t asn_IOS_ServedCell_Information_ExtIEs_1[] = {
-	{ 9, 4, asn_IOS_ServedCell_Information_ExtIEs_1_rows }
-};
-static const long asn_VAL_34_id_AdditionalSpecialSubframe_Info = 97;
-static const long asn_VAL_34_ignore = 1;
-static const long asn_VAL_34_optional = 0;
-static const long asn_VAL_35_id_eARFCNExtension = 94;
-static const long asn_VAL_35_reject = 0;
-static const long asn_VAL_35_optional = 0;
-static const long asn_VAL_36_id_AdditionalSpecialSubframeExtension_Info = 179;
-static const long asn_VAL_36_ignore = 1;
-static const long asn_VAL_36_optional = 0;
-static const asn_ioc_cell_t asn_IOS_TDD_Info_ExtIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_34_id_AdditionalSpecialSubframe_Info },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_34_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_AdditionalSpecialSubframe_Info },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_34_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_35_id_eARFCNExtension },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_35_reject },
-	{ "&Extension", aioc__type, &asn_DEF_EARFCNExtension },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_35_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_36_id_AdditionalSpecialSubframeExtension_Info },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_36_ignore },
-	{ "&Extension", aioc__type, &asn_DEF_AdditionalSpecialSubframeExtension_Info },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_36_optional }
-};
-static const asn_ioc_set_t asn_IOS_TDD_Info_ExtIEs_1[] = {
-	{ 3, 4, asn_IOS_TDD_Info_ExtIEs_1_rows }
-};
-static int
-memb_id_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_CellInformation_Item_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_CellInformation_Item_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CellInformation_Item_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_CellInformation_Item_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_CellInformation_Item_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Extension */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CellInformation_Item_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_extensionValue_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ServedCellsToModify_Item_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ServedCellsToModify_Item_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ServedCellsToModify_Item_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ServedCellsToModify_Item_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ServedCellsToModify_Item_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Extension */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ServedCellsToModify_Item_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_extensionValue_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_CellMeasurementResult_Item_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_CellMeasurementResult_Item_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CellMeasurementResult_Item_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_CellMeasurementResult_Item_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_CellMeasurementResult_Item_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Extension */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CellMeasurementResult_Item_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_extensionValue_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_105(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_105(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_105(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_109(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_109(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_109(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_113(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_113(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_113(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_117(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_117(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_117(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_121(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_121(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_121(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_125(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_125(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_125(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_129(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_129(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_129(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_133(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_133(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_133(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_137(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_137(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_137(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_141(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_141(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_141(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_145(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_145(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_145(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_149(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_149(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_149(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_153(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_153(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_153(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_157(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_157(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_157(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_161(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_161(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_161(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_165(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_165(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_165(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_169(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_169(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_169(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_173(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_FDD_Info_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_FDD_Info_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct FDD_Info_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_173(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_FDD_Info_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_FDD_Info_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Extension */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct FDD_Info_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_extensionValue_constraint_173(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_177(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_177(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_177(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_181(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_181(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_181(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_185(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_185(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_185(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_189(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_189(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_189(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_193(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_193(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_193(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_197(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_197(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_197(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_201(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_201(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_201(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_205(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_Neighbour_Information_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_Neighbour_Information_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct Neighbour_Information_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_205(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_Neighbour_Information_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_Neighbour_Information_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Extension */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct Neighbour_Information_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_extensionValue_constraint_205(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_209(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_209(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_209(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_213(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_213(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_213(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_217(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_217(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_217(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_221(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_221(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_221(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_225(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_225(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_225(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_229(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_229(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_229(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_233(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_233(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_233(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_237(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RadioResourceStatus_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RadioResourceStatus_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RadioResourceStatus_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_237(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RadioResourceStatus_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RadioResourceStatus_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Extension */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RadioResourceStatus_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_extensionValue_constraint_237(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_241(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RelativeNarrowbandTxPower_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RelativeNarrowbandTxPower_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RelativeNarrowbandTxPower_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_241(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RelativeNarrowbandTxPower_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RelativeNarrowbandTxPower_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Extension */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RelativeNarrowbandTxPower_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_extensionValue_constraint_241(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_245(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_245(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_245(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_249(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RSRPMRList_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RSRPMRList_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RSRPMRList_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_249(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RSRPMRList_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RSRPMRList_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Extension */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RSRPMRList_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_extensionValue_constraint_249(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_253(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_253(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_253(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_257(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_257(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_257(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_261(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ServedCell_Information_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ServedCell_Information_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ServedCell_Information_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_261(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ServedCell_Information_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ServedCell_Information_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Extension */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ServedCell_Information_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_extensionValue_constraint_261(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_265(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_265(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_265(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_269(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_269(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_269(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_273(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_273(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_273(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_277(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_277(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_277(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_281(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_281(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_281(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_285(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_TDD_Info_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_TDD_Info_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct TDD_Info_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_285(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_TDD_Info_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_TDD_Info_ExtIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Extension */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct TDD_Info_ExtIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_extensionValue_constraint_285(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_289(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_289(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_289(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_293(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_293(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_293(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_297(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_297(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_297(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_301(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_301(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_extensionValue_constraint_301(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_per_constraints_t asn_PER_memb_id_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_4 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_6 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_7 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_8 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_10 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_11 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_12 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_14 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_15 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_16 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_18 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_19 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_20 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_22 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_23 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_24 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_26 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_27 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_28 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_30 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_31 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_32 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_34 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_35 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_36 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_38 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_39 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_40 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_42 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_43 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_44 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_46 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_47 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_48 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_50 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_51 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_52 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_54 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_55 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_56 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_58 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_59 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_60 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_62 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_63 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_64 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_66 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_67 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_68 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_70 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_71 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_72 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_74 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_75 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_76 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_78 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_79 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_80 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_82 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_83 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_84 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_86 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_87 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_88 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_90 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_91 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_92 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_94 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_95 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_96 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_98 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_99 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_100 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_102 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_103 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_104 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_106 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_107 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_108 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_110 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_111 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_112 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_114 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_115 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_116 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_118 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_119 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_120 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_122 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_123 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_124 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_126 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_127 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_128 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_130 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_131 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_132 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_134 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_135 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_136 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_138 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_139 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_140 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_142 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_143 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_144 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_146 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_147 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_148 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_150 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_151 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_152 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_154 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_155 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_156 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_158 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_159 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_160 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_162 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_163 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_164 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_166 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_167 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_168 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_170 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_171 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_172 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_174 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_175 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_176 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_178 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_179 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_180 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_182 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_183 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_184 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_186 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_187 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_188 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_190 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_191 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_192 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_194 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_195 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_196 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_198 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_199 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_200 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_202 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_203 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_204 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_206 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_207 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_208 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_210 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_211 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_212 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_214 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_215 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_216 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_218 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_219 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_220 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_222 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_223 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_224 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_226 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_227 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_228 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_230 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_231 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_232 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_234 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_235 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_236 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_238 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_239 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_240 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_242 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_243 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_244 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_246 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_247 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_248 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_250 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_251 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_252 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_254 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_255 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_256 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_258 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_259 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_260 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_262 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_263 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_264 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_266 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_267 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_268 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_270 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_271 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_272 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_274 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_275 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_276 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_278 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_279 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_280 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_282 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_283 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_284 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_286 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_287 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_288 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_290 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_291 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_292 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_294 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_295 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_296 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_298 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_299 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_300 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_302 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_303 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_extensionValue_constr_304 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_extensionValue_4[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs__extensionValue, choice.ABSInformation),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_ABSInformation,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ABSInformation"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs__extensionValue, choice.InvokeIndication),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_InvokeIndication,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"InvokeIndication"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs__extensionValue, choice.SubframeAssignment),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_SubframeAssignment,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"SubframeAssignment"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs__extensionValue, choice.ExtendedULInterferenceOverloadInfo),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ExtendedULInterferenceOverloadInfo,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ExtendedULInterferenceOverloadInfo"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs__extensionValue, choice.CoMPInformation),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CoMPInformation,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CoMPInformation"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs__extensionValue, choice.DynamicDLTransmissionInformation),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_DynamicDLTransmissionInformation,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"DynamicDLTransmissionInformation"
-		},
-};
-static const unsigned asn_MAP_extensionValue_to_canonical_4[] = { 1, 2, 3, 4, 0, 5 };
-static const unsigned asn_MAP_extensionValue_from_canonical_4[] = { 4, 0, 1, 2, 3, 5 };
-static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_4[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 1 }, /* InvokeIndication */
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 2, -1, 0 }, /* SubframeAssignment */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, 0, 1 }, /* ExtendedULInterferenceOverloadInfo */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -1, 0 }, /* CoMPInformation */
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 1 }, /* fdd */
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 5, -1, 0 }, /* naics-active */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 1 }, /* tdd */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 5, -1, 0 }, /* naics-inactive */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 } /* abs-inactive */
-};
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_4 = {
-	sizeof(struct CellInformation_Item_ExtIEs__extensionValue),
-	offsetof(struct CellInformation_Item_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CellInformation_Item_ExtIEs__extensionValue, present),
-	sizeof(((struct CellInformation_Item_ExtIEs__extensionValue *)0)->present),
-	asn_MAP_extensionValue_tag2el_4,
-	9,	/* Count of tags in the map */
-	asn_MAP_extensionValue_to_canonical_4,
-	asn_MAP_extensionValue_from_canonical_4,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_4 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_extensionValue_4,
-	6,	/* Elements count */
-	&asn_SPC_extensionValue_specs_4	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CellInformation_Item_ExtIEs_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_2,  memb_id_constraint_1 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_CellInformation_Item_ExtIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_3,  memb_criticality_constraint_1 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_4,
-		select_CellInformation_Item_ExtIEs_extensionValue_type,
-		{ 0, &asn_PER_memb_extensionValue_constr_4,  memb_extensionValue_constraint_1 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CellInformation_Item_ExtIEs_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CellInformation_Item_ExtIEs_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CellInformation_Item_ExtIEs_specs_1 = {
-	sizeof(struct CellInformation_Item_ExtIEs),
-	offsetof(struct CellInformation_Item_ExtIEs, _asn_ctx),
-	asn_MAP_CellInformation_Item_ExtIEs_tag2el_1,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CellInformation_Item_ExtIEs = {
-	"CellInformation-Item-ExtIEs",
-	"CellInformation-Item-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CellInformation_Item_ExtIEs_tags_1,
-	sizeof(asn_DEF_CellInformation_Item_ExtIEs_tags_1)
-		/sizeof(asn_DEF_CellInformation_Item_ExtIEs_tags_1[0]), /* 1 */
-	asn_DEF_CellInformation_Item_ExtIEs_tags_1,	/* Same as above */
-	sizeof(asn_DEF_CellInformation_Item_ExtIEs_tags_1)
-		/sizeof(asn_DEF_CellInformation_Item_ExtIEs_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellInformation_Item_ExtIEs_1,
-	3,	/* Elements count */
-	&asn_SPC_CellInformation_Item_ExtIEs_specs_1	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_extensionValue_8[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCellsToModify_Item_ExtIEs__extensionValue, choice.DeactivationIndication),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_DeactivationIndication,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"DeactivationIndication"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_8[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, 0, 0 } /* DeactivationIndication */
-};
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_8 = {
-	sizeof(struct ServedCellsToModify_Item_ExtIEs__extensionValue),
-	offsetof(struct ServedCellsToModify_Item_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ServedCellsToModify_Item_ExtIEs__extensionValue, present),
-	sizeof(((struct ServedCellsToModify_Item_ExtIEs__extensionValue *)0)->present),
-	asn_MAP_extensionValue_tag2el_8,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_8 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_extensionValue_8,
-	1,	/* Elements count */
-	&asn_SPC_extensionValue_specs_8	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ServedCellsToModify_Item_ExtIEs_5[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCellsToModify_Item_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_6,  memb_id_constraint_5 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCellsToModify_Item_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ServedCellsToModify_Item_ExtIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_7,  memb_criticality_constraint_5 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ServedCellsToModify_Item_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_8,
-		select_ServedCellsToModify_Item_ExtIEs_extensionValue_type,
-		{ 0, &asn_PER_memb_extensionValue_constr_8,  memb_extensionValue_constraint_5 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ServedCellsToModify_Item_ExtIEs_tags_5[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ServedCellsToModify_Item_ExtIEs_tag2el_5[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ServedCellsToModify_Item_ExtIEs_specs_5 = {
-	sizeof(struct ServedCellsToModify_Item_ExtIEs),
-	offsetof(struct ServedCellsToModify_Item_ExtIEs, _asn_ctx),
-	asn_MAP_ServedCellsToModify_Item_ExtIEs_tag2el_5,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedCellsToModify_Item_ExtIEs = {
-	"ServedCellsToModify-Item-ExtIEs",
-	"ServedCellsToModify-Item-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ServedCellsToModify_Item_ExtIEs_tags_5,
-	sizeof(asn_DEF_ServedCellsToModify_Item_ExtIEs_tags_5)
-		/sizeof(asn_DEF_ServedCellsToModify_Item_ExtIEs_tags_5[0]), /* 1 */
-	asn_DEF_ServedCellsToModify_Item_ExtIEs_tags_5,	/* Same as above */
-	sizeof(asn_DEF_ServedCellsToModify_Item_ExtIEs_tags_5)
-		/sizeof(asn_DEF_ServedCellsToModify_Item_ExtIEs_tags_5[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ServedCellsToModify_Item_ExtIEs_5,
-	3,	/* Elements count */
-	&asn_SPC_ServedCellsToModify_Item_ExtIEs_specs_5	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_12 = {
-	sizeof(struct CellToReport_Item_ExtIEs__extensionValue),
-	offsetof(struct CellToReport_Item_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CellToReport_Item_ExtIEs__extensionValue, present),
-	sizeof(((struct CellToReport_Item_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_12 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_12	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CellToReport_Item_ExtIEs_9[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellToReport_Item_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_10,  memb_id_constraint_9 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellToReport_Item_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_11,  memb_criticality_constraint_9 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CellToReport_Item_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_12,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_12,  memb_extensionValue_constraint_9 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CellToReport_Item_ExtIEs_tags_9[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CellToReport_Item_ExtIEs_tag2el_9[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CellToReport_Item_ExtIEs_specs_9 = {
-	sizeof(struct CellToReport_Item_ExtIEs),
-	offsetof(struct CellToReport_Item_ExtIEs, _asn_ctx),
-	asn_MAP_CellToReport_Item_ExtIEs_tag2el_9,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CellToReport_Item_ExtIEs = {
-	"CellToReport-Item-ExtIEs",
-	"CellToReport-Item-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CellToReport_Item_ExtIEs_tags_9,
-	sizeof(asn_DEF_CellToReport_Item_ExtIEs_tags_9)
-		/sizeof(asn_DEF_CellToReport_Item_ExtIEs_tags_9[0]), /* 1 */
-	asn_DEF_CellToReport_Item_ExtIEs_tags_9,	/* Same as above */
-	sizeof(asn_DEF_CellToReport_Item_ExtIEs_tags_9)
-		/sizeof(asn_DEF_CellToReport_Item_ExtIEs_tags_9[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellToReport_Item_ExtIEs_9,
-	3,	/* Elements count */
-	&asn_SPC_CellToReport_Item_ExtIEs_specs_9	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_16 = {
-	sizeof(struct MeasurementInitiationResult_Item_ExtIEs__extensionValue),
-	offsetof(struct MeasurementInitiationResult_Item_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct MeasurementInitiationResult_Item_ExtIEs__extensionValue, present),
-	sizeof(((struct MeasurementInitiationResult_Item_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_16 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_16	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_MeasurementInitiationResult_Item_ExtIEs_13[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementInitiationResult_Item_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_14,  memb_id_constraint_13 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementInitiationResult_Item_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_15,  memb_criticality_constraint_13 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct MeasurementInitiationResult_Item_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_16,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_16,  memb_extensionValue_constraint_13 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_MeasurementInitiationResult_Item_ExtIEs_tags_13[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_MeasurementInitiationResult_Item_ExtIEs_tag2el_13[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_MeasurementInitiationResult_Item_ExtIEs_specs_13 = {
-	sizeof(struct MeasurementInitiationResult_Item_ExtIEs),
-	offsetof(struct MeasurementInitiationResult_Item_ExtIEs, _asn_ctx),
-	asn_MAP_MeasurementInitiationResult_Item_ExtIEs_tag2el_13,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_MeasurementInitiationResult_Item_ExtIEs = {
-	"MeasurementInitiationResult-Item-ExtIEs",
-	"MeasurementInitiationResult-Item-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_MeasurementInitiationResult_Item_ExtIEs_tags_13,
-	sizeof(asn_DEF_MeasurementInitiationResult_Item_ExtIEs_tags_13)
-		/sizeof(asn_DEF_MeasurementInitiationResult_Item_ExtIEs_tags_13[0]), /* 1 */
-	asn_DEF_MeasurementInitiationResult_Item_ExtIEs_tags_13,	/* Same as above */
-	sizeof(asn_DEF_MeasurementInitiationResult_Item_ExtIEs_tags_13)
-		/sizeof(asn_DEF_MeasurementInitiationResult_Item_ExtIEs_tags_13[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_MeasurementInitiationResult_Item_ExtIEs_13,
-	3,	/* Elements count */
-	&asn_SPC_MeasurementInitiationResult_Item_ExtIEs_specs_13	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_20 = {
-	sizeof(struct MeasurementFailureCause_Item_ExtIEs__extensionValue),
-	offsetof(struct MeasurementFailureCause_Item_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct MeasurementFailureCause_Item_ExtIEs__extensionValue, present),
-	sizeof(((struct MeasurementFailureCause_Item_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_20 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_20	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_MeasurementFailureCause_Item_ExtIEs_17[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementFailureCause_Item_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_18,  memb_id_constraint_17 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementFailureCause_Item_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_19,  memb_criticality_constraint_17 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct MeasurementFailureCause_Item_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_20,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_20,  memb_extensionValue_constraint_17 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_MeasurementFailureCause_Item_ExtIEs_tags_17[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_MeasurementFailureCause_Item_ExtIEs_tag2el_17[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_MeasurementFailureCause_Item_ExtIEs_specs_17 = {
-	sizeof(struct MeasurementFailureCause_Item_ExtIEs),
-	offsetof(struct MeasurementFailureCause_Item_ExtIEs, _asn_ctx),
-	asn_MAP_MeasurementFailureCause_Item_ExtIEs_tag2el_17,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_MeasurementFailureCause_Item_ExtIEs = {
-	"MeasurementFailureCause-Item-ExtIEs",
-	"MeasurementFailureCause-Item-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_MeasurementFailureCause_Item_ExtIEs_tags_17,
-	sizeof(asn_DEF_MeasurementFailureCause_Item_ExtIEs_tags_17)
-		/sizeof(asn_DEF_MeasurementFailureCause_Item_ExtIEs_tags_17[0]), /* 1 */
-	asn_DEF_MeasurementFailureCause_Item_ExtIEs_tags_17,	/* Same as above */
-	sizeof(asn_DEF_MeasurementFailureCause_Item_ExtIEs_tags_17)
-		/sizeof(asn_DEF_MeasurementFailureCause_Item_ExtIEs_tags_17[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_MeasurementFailureCause_Item_ExtIEs_17,
-	3,	/* Elements count */
-	&asn_SPC_MeasurementFailureCause_Item_ExtIEs_specs_17	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_24 = {
-	sizeof(struct CompleteFailureCauseInformation_Item_ExtIEs__extensionValue),
-	offsetof(struct CompleteFailureCauseInformation_Item_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CompleteFailureCauseInformation_Item_ExtIEs__extensionValue, present),
-	sizeof(((struct CompleteFailureCauseInformation_Item_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_24 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_24	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CompleteFailureCauseInformation_Item_ExtIEs_21[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CompleteFailureCauseInformation_Item_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_22,  memb_id_constraint_21 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CompleteFailureCauseInformation_Item_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_23,  memb_criticality_constraint_21 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CompleteFailureCauseInformation_Item_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_24,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_24,  memb_extensionValue_constraint_21 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs_tags_21[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CompleteFailureCauseInformation_Item_ExtIEs_tag2el_21[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CompleteFailureCauseInformation_Item_ExtIEs_specs_21 = {
-	sizeof(struct CompleteFailureCauseInformation_Item_ExtIEs),
-	offsetof(struct CompleteFailureCauseInformation_Item_ExtIEs, _asn_ctx),
-	asn_MAP_CompleteFailureCauseInformation_Item_ExtIEs_tag2el_21,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs = {
-	"CompleteFailureCauseInformation-Item-ExtIEs",
-	"CompleteFailureCauseInformation-Item-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs_tags_21,
-	sizeof(asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs_tags_21)
-		/sizeof(asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs_tags_21[0]), /* 1 */
-	asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs_tags_21,	/* Same as above */
-	sizeof(asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs_tags_21)
-		/sizeof(asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs_tags_21[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CompleteFailureCauseInformation_Item_ExtIEs_21,
-	3,	/* Elements count */
-	&asn_SPC_CompleteFailureCauseInformation_Item_ExtIEs_specs_21	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_extensionValue_28[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs__extensionValue, choice.CompositeAvailableCapacityGroup),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CompositeAvailableCapacityGroup,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CompositeAvailableCapacityGroup"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs__extensionValue, choice.ABS_Status),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ABS_Status,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ABS-Status"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs__extensionValue, choice.RSRPMRList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RSRPMRList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RSRPMRList"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs__extensionValue, choice.CSIReportList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CSIReportList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CSIReportList"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs__extensionValue, choice.CellReportingIndicator),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_CellReportingIndicator,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CellReportingIndicator"
-		},
-};
-static const unsigned asn_MAP_extensionValue_to_canonical_28[] = { 4, 0, 1, 2, 3 };
-static const unsigned asn_MAP_extensionValue_from_canonical_28[] = { 1, 2, 3, 4, 0 };
-static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_28[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 4, 0, 0 }, /* CellReportingIndicator */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 3 }, /* CompositeAvailableCapacityGroup */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 2 }, /* ABS-Status */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 1 }, /* RSRPMRList */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 0 } /* CSIReportList */
-};
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_28 = {
-	sizeof(struct CellMeasurementResult_Item_ExtIEs__extensionValue),
-	offsetof(struct CellMeasurementResult_Item_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CellMeasurementResult_Item_ExtIEs__extensionValue, present),
-	sizeof(((struct CellMeasurementResult_Item_ExtIEs__extensionValue *)0)->present),
-	asn_MAP_extensionValue_tag2el_28,
-	5,	/* Count of tags in the map */
-	asn_MAP_extensionValue_to_canonical_28,
-	asn_MAP_extensionValue_from_canonical_28,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_28 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_extensionValue_28,
-	5,	/* Elements count */
-	&asn_SPC_extensionValue_specs_28	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CellMeasurementResult_Item_ExtIEs_25[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_26,  memb_id_constraint_25 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_CellMeasurementResult_Item_ExtIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_27,  memb_criticality_constraint_25 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_28,
-		select_CellMeasurementResult_Item_ExtIEs_extensionValue_type,
-		{ 0, &asn_PER_memb_extensionValue_constr_28,  memb_extensionValue_constraint_25 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CellMeasurementResult_Item_ExtIEs_tags_25[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CellMeasurementResult_Item_ExtIEs_tag2el_25[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CellMeasurementResult_Item_ExtIEs_specs_25 = {
-	sizeof(struct CellMeasurementResult_Item_ExtIEs),
-	offsetof(struct CellMeasurementResult_Item_ExtIEs, _asn_ctx),
-	asn_MAP_CellMeasurementResult_Item_ExtIEs_tag2el_25,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CellMeasurementResult_Item_ExtIEs = {
-	"CellMeasurementResult-Item-ExtIEs",
-	"CellMeasurementResult-Item-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CellMeasurementResult_Item_ExtIEs_tags_25,
-	sizeof(asn_DEF_CellMeasurementResult_Item_ExtIEs_tags_25)
-		/sizeof(asn_DEF_CellMeasurementResult_Item_ExtIEs_tags_25[0]), /* 1 */
-	asn_DEF_CellMeasurementResult_Item_ExtIEs_tags_25,	/* Same as above */
-	sizeof(asn_DEF_CellMeasurementResult_Item_ExtIEs_tags_25)
-		/sizeof(asn_DEF_CellMeasurementResult_Item_ExtIEs_tags_25[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellMeasurementResult_Item_ExtIEs_25,
-	3,	/* Elements count */
-	&asn_SPC_CellMeasurementResult_Item_ExtIEs_specs_25	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_32 = {
-	sizeof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs__extensionValue),
-	offsetof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs__extensionValue, present),
-	sizeof(((struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_32 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_32	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_29[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_30,  memb_id_constraint_29 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_31,  memb_criticality_constraint_29 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_32,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_32,  memb_extensionValue_constraint_29 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tags_29[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tag2el_29[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_specs_29 = {
-	sizeof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs),
-	offsetof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs, _asn_ctx),
-	asn_MAP_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tag2el_29,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs = {
-	"ResponseInformationSeNBReconfComp-SuccessItemExtIEs",
-	"ResponseInformationSeNBReconfComp-SuccessItemExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tags_29,
-	sizeof(asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tags_29)
-		/sizeof(asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tags_29[0]), /* 1 */
-	asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tags_29,	/* Same as above */
-	sizeof(asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tags_29)
-		/sizeof(asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tags_29[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_29,
-	3,	/* Elements count */
-	&asn_SPC_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_specs_29	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_36 = {
-	sizeof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs__extensionValue),
-	offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs__extensionValue, present),
-	sizeof(((struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_36 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_36	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_33[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_34,  memb_id_constraint_33 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_35,  memb_criticality_constraint_33 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_36,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_36,  memb_extensionValue_constraint_33 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tags_33[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tag2el_33[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_specs_33 = {
-	sizeof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs),
-	offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs, _asn_ctx),
-	asn_MAP_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tag2el_33,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs = {
-	"ResponseInformationSeNBReconfComp-RejectByMeNBItemExtIEs",
-	"ResponseInformationSeNBReconfComp-RejectByMeNBItemExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tags_33,
-	sizeof(asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tags_33)
-		/sizeof(asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tags_33[0]), /* 1 */
-	asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tags_33,	/* Same as above */
-	sizeof(asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tags_33)
-		/sizeof(asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tags_33[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_33,
-	3,	/* Elements count */
-	&asn_SPC_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_specs_33	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_40 = {
-	sizeof(struct ServedEUTRAcellsENDCX2Management_ExtIEs__extensionValue),
-	offsetof(struct ServedEUTRAcellsENDCX2Management_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ServedEUTRAcellsENDCX2Management_ExtIEs__extensionValue, present),
-	sizeof(((struct ServedEUTRAcellsENDCX2Management_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_40 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_40	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ServedEUTRAcellsENDCX2Management_ExtIEs_37[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedEUTRAcellsENDCX2Management_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_38,  memb_id_constraint_37 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedEUTRAcellsENDCX2Management_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_39,  memb_criticality_constraint_37 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ServedEUTRAcellsENDCX2Management_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_40,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_40,  memb_extensionValue_constraint_37 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs_tags_37[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ServedEUTRAcellsENDCX2Management_ExtIEs_tag2el_37[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ServedEUTRAcellsENDCX2Management_ExtIEs_specs_37 = {
-	sizeof(struct ServedEUTRAcellsENDCX2Management_ExtIEs),
-	offsetof(struct ServedEUTRAcellsENDCX2Management_ExtIEs, _asn_ctx),
-	asn_MAP_ServedEUTRAcellsENDCX2Management_ExtIEs_tag2el_37,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs = {
-	"ServedEUTRAcellsENDCX2Management-ExtIEs",
-	"ServedEUTRAcellsENDCX2Management-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs_tags_37,
-	sizeof(asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs_tags_37)
-		/sizeof(asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs_tags_37[0]), /* 1 */
-	asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs_tags_37,	/* Same as above */
-	sizeof(asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs_tags_37)
-		/sizeof(asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs_tags_37[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ServedEUTRAcellsENDCX2Management_ExtIEs_37,
-	3,	/* Elements count */
-	&asn_SPC_ServedEUTRAcellsENDCX2Management_ExtIEs_specs_37	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_44 = {
-	sizeof(struct En_gNBServedCells_ExtIEs__extensionValue),
-	offsetof(struct En_gNBServedCells_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct En_gNBServedCells_ExtIEs__extensionValue, present),
-	sizeof(((struct En_gNBServedCells_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_44 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_44	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_En_gNBServedCells_ExtIEs_41[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNBServedCells_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_42,  memb_id_constraint_41 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNBServedCells_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_43,  memb_criticality_constraint_41 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct En_gNBServedCells_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_44,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_44,  memb_extensionValue_constraint_41 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_En_gNBServedCells_ExtIEs_tags_41[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_En_gNBServedCells_ExtIEs_tag2el_41[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_En_gNBServedCells_ExtIEs_specs_41 = {
-	sizeof(struct En_gNBServedCells_ExtIEs),
-	offsetof(struct En_gNBServedCells_ExtIEs, _asn_ctx),
-	asn_MAP_En_gNBServedCells_ExtIEs_tag2el_41,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_En_gNBServedCells_ExtIEs = {
-	"En-gNBServedCells-ExtIEs",
-	"En-gNBServedCells-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_En_gNBServedCells_ExtIEs_tags_41,
-	sizeof(asn_DEF_En_gNBServedCells_ExtIEs_tags_41)
-		/sizeof(asn_DEF_En_gNBServedCells_ExtIEs_tags_41[0]), /* 1 */
-	asn_DEF_En_gNBServedCells_ExtIEs_tags_41,	/* Same as above */
-	sizeof(asn_DEF_En_gNBServedCells_ExtIEs_tags_41)
-		/sizeof(asn_DEF_En_gNBServedCells_ExtIEs_tags_41[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_En_gNBServedCells_ExtIEs_41,
-	3,	/* Elements count */
-	&asn_SPC_En_gNBServedCells_ExtIEs_specs_41	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_48 = {
-	sizeof(struct ServedNRCell_Information_ExtIEs__extensionValue),
-	offsetof(struct ServedNRCell_Information_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ServedNRCell_Information_ExtIEs__extensionValue, present),
-	sizeof(((struct ServedNRCell_Information_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_48 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_48	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ServedNRCell_Information_ExtIEs_45[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCell_Information_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_46,  memb_id_constraint_45 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCell_Information_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_47,  memb_criticality_constraint_45 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ServedNRCell_Information_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_48,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_48,  memb_extensionValue_constraint_45 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ServedNRCell_Information_ExtIEs_tags_45[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ServedNRCell_Information_ExtIEs_tag2el_45[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ServedNRCell_Information_ExtIEs_specs_45 = {
-	sizeof(struct ServedNRCell_Information_ExtIEs),
-	offsetof(struct ServedNRCell_Information_ExtIEs, _asn_ctx),
-	asn_MAP_ServedNRCell_Information_ExtIEs_tag2el_45,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedNRCell_Information_ExtIEs = {
-	"ServedNRCell-Information-ExtIEs",
-	"ServedNRCell-Information-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ServedNRCell_Information_ExtIEs_tags_45,
-	sizeof(asn_DEF_ServedNRCell_Information_ExtIEs_tags_45)
-		/sizeof(asn_DEF_ServedNRCell_Information_ExtIEs_tags_45[0]), /* 1 */
-	asn_DEF_ServedNRCell_Information_ExtIEs_tags_45,	/* Same as above */
-	sizeof(asn_DEF_ServedNRCell_Information_ExtIEs_tags_45)
-		/sizeof(asn_DEF_ServedNRCell_Information_ExtIEs_tags_45[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ServedNRCell_Information_ExtIEs_45,
-	3,	/* Elements count */
-	&asn_SPC_ServedNRCell_Information_ExtIEs_specs_45	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_52 = {
-	sizeof(struct FDD_InfoServedNRCell_Information_ExtIEs__extensionValue),
-	offsetof(struct FDD_InfoServedNRCell_Information_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct FDD_InfoServedNRCell_Information_ExtIEs__extensionValue, present),
-	sizeof(((struct FDD_InfoServedNRCell_Information_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_52 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_52	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_FDD_InfoServedNRCell_Information_ExtIEs_49[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_InfoServedNRCell_Information_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_50,  memb_id_constraint_49 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_InfoServedNRCell_Information_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_51,  memb_criticality_constraint_49 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct FDD_InfoServedNRCell_Information_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_52,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_52,  memb_extensionValue_constraint_49 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs_tags_49[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_FDD_InfoServedNRCell_Information_ExtIEs_tag2el_49[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_FDD_InfoServedNRCell_Information_ExtIEs_specs_49 = {
-	sizeof(struct FDD_InfoServedNRCell_Information_ExtIEs),
-	offsetof(struct FDD_InfoServedNRCell_Information_ExtIEs, _asn_ctx),
-	asn_MAP_FDD_InfoServedNRCell_Information_ExtIEs_tag2el_49,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs = {
-	"FDD-InfoServedNRCell-Information-ExtIEs",
-	"FDD-InfoServedNRCell-Information-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs_tags_49,
-	sizeof(asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs_tags_49)
-		/sizeof(asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs_tags_49[0]), /* 1 */
-	asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs_tags_49,	/* Same as above */
-	sizeof(asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs_tags_49)
-		/sizeof(asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs_tags_49[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_FDD_InfoServedNRCell_Information_ExtIEs_49,
-	3,	/* Elements count */
-	&asn_SPC_FDD_InfoServedNRCell_Information_ExtIEs_specs_49	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_56 = {
-	sizeof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue),
-	offsetof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue, present),
-	sizeof(((struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_56 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_56	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_53[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_54,  memb_id_constraint_53 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_55,  memb_criticality_constraint_53 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_56,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_56,  memb_extensionValue_constraint_53 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_53[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tag2el_53[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_specs_53 = {
-	sizeof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs),
-	offsetof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs, _asn_ctx),
-	asn_MAP_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tag2el_53,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs = {
-	"FDD-InfoNeighbourServedNRCell-Information-ExtIEs",
-	"FDD-InfoNeighbourServedNRCell-Information-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_53,
-	sizeof(asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_53)
-		/sizeof(asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_53[0]), /* 1 */
-	asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_53,	/* Same as above */
-	sizeof(asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_53)
-		/sizeof(asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_53[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_53,
-	3,	/* Elements count */
-	&asn_SPC_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_specs_53	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_60 = {
-	sizeof(struct TDD_InfoServedNRCell_Information_ExtIEs__extensionValue),
-	offsetof(struct TDD_InfoServedNRCell_Information_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct TDD_InfoServedNRCell_Information_ExtIEs__extensionValue, present),
-	sizeof(((struct TDD_InfoServedNRCell_Information_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_60 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_60	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_TDD_InfoServedNRCell_Information_ExtIEs_57[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_InfoServedNRCell_Information_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_58,  memb_id_constraint_57 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_InfoServedNRCell_Information_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_59,  memb_criticality_constraint_57 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct TDD_InfoServedNRCell_Information_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_60,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_60,  memb_extensionValue_constraint_57 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs_tags_57[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_TDD_InfoServedNRCell_Information_ExtIEs_tag2el_57[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_TDD_InfoServedNRCell_Information_ExtIEs_specs_57 = {
-	sizeof(struct TDD_InfoServedNRCell_Information_ExtIEs),
-	offsetof(struct TDD_InfoServedNRCell_Information_ExtIEs, _asn_ctx),
-	asn_MAP_TDD_InfoServedNRCell_Information_ExtIEs_tag2el_57,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs = {
-	"TDD-InfoServedNRCell-Information-ExtIEs",
-	"TDD-InfoServedNRCell-Information-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs_tags_57,
-	sizeof(asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs_tags_57)
-		/sizeof(asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs_tags_57[0]), /* 1 */
-	asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs_tags_57,	/* Same as above */
-	sizeof(asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs_tags_57)
-		/sizeof(asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs_tags_57[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_TDD_InfoServedNRCell_Information_ExtIEs_57,
-	3,	/* Elements count */
-	&asn_SPC_TDD_InfoServedNRCell_Information_ExtIEs_specs_57	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_64 = {
-	sizeof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue),
-	offsetof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue, present),
-	sizeof(((struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_64 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_64	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_61[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_62,  memb_id_constraint_61 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_63,  memb_criticality_constraint_61 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_64,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_64,  memb_extensionValue_constraint_61 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_61[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tag2el_61[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_specs_61 = {
-	sizeof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs),
-	offsetof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs, _asn_ctx),
-	asn_MAP_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tag2el_61,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs = {
-	"TDD-InfoNeighbourServedNRCell-Information-ExtIEs",
-	"TDD-InfoNeighbourServedNRCell-Information-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_61,
-	sizeof(asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_61)
-		/sizeof(asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_61[0]), /* 1 */
-	asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_61,	/* Same as above */
-	sizeof(asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_61)
-		/sizeof(asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_61[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_61,
-	3,	/* Elements count */
-	&asn_SPC_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_specs_61	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_68 = {
-	sizeof(struct NRNeighbour_Information_ExtIEs__extensionValue),
-	offsetof(struct NRNeighbour_Information_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct NRNeighbour_Information_ExtIEs__extensionValue, present),
-	sizeof(((struct NRNeighbour_Information_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_68 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_68	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_NRNeighbour_Information_ExtIEs_65[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct NRNeighbour_Information_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_66,  memb_id_constraint_65 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct NRNeighbour_Information_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_67,  memb_criticality_constraint_65 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct NRNeighbour_Information_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_68,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_68,  memb_extensionValue_constraint_65 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_NRNeighbour_Information_ExtIEs_tags_65[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_NRNeighbour_Information_ExtIEs_tag2el_65[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_NRNeighbour_Information_ExtIEs_specs_65 = {
-	sizeof(struct NRNeighbour_Information_ExtIEs),
-	offsetof(struct NRNeighbour_Information_ExtIEs, _asn_ctx),
-	asn_MAP_NRNeighbour_Information_ExtIEs_tag2el_65,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_NRNeighbour_Information_ExtIEs = {
-	"NRNeighbour-Information-ExtIEs",
-	"NRNeighbour-Information-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_NRNeighbour_Information_ExtIEs_tags_65,
-	sizeof(asn_DEF_NRNeighbour_Information_ExtIEs_tags_65)
-		/sizeof(asn_DEF_NRNeighbour_Information_ExtIEs_tags_65[0]), /* 1 */
-	asn_DEF_NRNeighbour_Information_ExtIEs_tags_65,	/* Same as above */
-	sizeof(asn_DEF_NRNeighbour_Information_ExtIEs_tags_65)
-		/sizeof(asn_DEF_NRNeighbour_Information_ExtIEs_tags_65[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_NRNeighbour_Information_ExtIEs_65,
-	3,	/* Elements count */
-	&asn_SPC_NRNeighbour_Information_ExtIEs_specs_65	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_72 = {
-	sizeof(struct Limited_list_ExtIEs__extensionValue),
-	offsetof(struct Limited_list_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct Limited_list_ExtIEs__extensionValue, present),
-	sizeof(((struct Limited_list_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_72 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_72	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_Limited_list_ExtIEs_69[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct Limited_list_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_70,  memb_id_constraint_69 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct Limited_list_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_71,  memb_criticality_constraint_69 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct Limited_list_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_72,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_72,  memb_extensionValue_constraint_69 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_Limited_list_ExtIEs_tags_69[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Limited_list_ExtIEs_tag2el_69[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_Limited_list_ExtIEs_specs_69 = {
-	sizeof(struct Limited_list_ExtIEs),
-	offsetof(struct Limited_list_ExtIEs, _asn_ctx),
-	asn_MAP_Limited_list_ExtIEs_tag2el_69,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_Limited_list_ExtIEs = {
-	"Limited-list-ExtIEs",
-	"Limited-list-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Limited_list_ExtIEs_tags_69,
-	sizeof(asn_DEF_Limited_list_ExtIEs_tags_69)
-		/sizeof(asn_DEF_Limited_list_ExtIEs_tags_69[0]), /* 1 */
-	asn_DEF_Limited_list_ExtIEs_tags_69,	/* Same as above */
-	sizeof(asn_DEF_Limited_list_ExtIEs_tags_69)
-		/sizeof(asn_DEF_Limited_list_ExtIEs_tags_69[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Limited_list_ExtIEs_69,
-	3,	/* Elements count */
-	&asn_SPC_Limited_list_ExtIEs_specs_69	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_76 = {
-	sizeof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs__extensionValue),
-	offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs__extensionValue, present),
-	sizeof(((struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_76 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_76	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_73[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_74,  memb_id_constraint_73 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_75,  memb_criticality_constraint_73 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_76,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_76,  memb_extensionValue_constraint_73 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tags_73[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tag2el_73[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_specs_73 = {
-	sizeof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs),
-	offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs, _asn_ctx),
-	asn_MAP_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tag2el_73,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs = {
-	"ServedEUTRAcellsToModifyListENDCConfUpd-ExtIEs",
-	"ServedEUTRAcellsToModifyListENDCConfUpd-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tags_73,
-	sizeof(asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tags_73)
-		/sizeof(asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tags_73[0]), /* 1 */
-	asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tags_73,	/* Same as above */
-	sizeof(asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tags_73)
-		/sizeof(asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tags_73[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_73,
-	3,	/* Elements count */
-	&asn_SPC_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_specs_73	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_80 = {
-	sizeof(struct ServedNRCellsToModify_Item_ExtIEs__extensionValue),
-	offsetof(struct ServedNRCellsToModify_Item_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ServedNRCellsToModify_Item_ExtIEs__extensionValue, present),
-	sizeof(((struct ServedNRCellsToModify_Item_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_80 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_80	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ServedNRCellsToModify_Item_ExtIEs_77[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCellsToModify_Item_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_78,  memb_id_constraint_77 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCellsToModify_Item_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_79,  memb_criticality_constraint_77 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ServedNRCellsToModify_Item_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_80,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_80,  memb_extensionValue_constraint_77 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ServedNRCellsToModify_Item_ExtIEs_tags_77[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ServedNRCellsToModify_Item_ExtIEs_tag2el_77[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ServedNRCellsToModify_Item_ExtIEs_specs_77 = {
-	sizeof(struct ServedNRCellsToModify_Item_ExtIEs),
-	offsetof(struct ServedNRCellsToModify_Item_ExtIEs, _asn_ctx),
-	asn_MAP_ServedNRCellsToModify_Item_ExtIEs_tag2el_77,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedNRCellsToModify_Item_ExtIEs = {
-	"ServedNRCellsToModify-Item-ExtIEs",
-	"ServedNRCellsToModify-Item-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ServedNRCellsToModify_Item_ExtIEs_tags_77,
-	sizeof(asn_DEF_ServedNRCellsToModify_Item_ExtIEs_tags_77)
-		/sizeof(asn_DEF_ServedNRCellsToModify_Item_ExtIEs_tags_77[0]), /* 1 */
-	asn_DEF_ServedNRCellsToModify_Item_ExtIEs_tags_77,	/* Same as above */
-	sizeof(asn_DEF_ServedNRCellsToModify_Item_ExtIEs_tags_77)
-		/sizeof(asn_DEF_ServedNRCellsToModify_Item_ExtIEs_tags_77[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ServedNRCellsToModify_Item_ExtIEs_77,
-	3,	/* Elements count */
-	&asn_SPC_ServedNRCellsToModify_Item_ExtIEs_specs_77	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_84 = {
-	sizeof(struct ABSInformationFDD_ExtIEs__extensionValue),
-	offsetof(struct ABSInformationFDD_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ABSInformationFDD_ExtIEs__extensionValue, present),
-	sizeof(((struct ABSInformationFDD_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_84 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_84	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ABSInformationFDD_ExtIEs_81[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformationFDD_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_82,  memb_id_constraint_81 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformationFDD_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_83,  memb_criticality_constraint_81 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ABSInformationFDD_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_84,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_84,  memb_extensionValue_constraint_81 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ABSInformationFDD_ExtIEs_tags_81[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ABSInformationFDD_ExtIEs_tag2el_81[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ABSInformationFDD_ExtIEs_specs_81 = {
-	sizeof(struct ABSInformationFDD_ExtIEs),
-	offsetof(struct ABSInformationFDD_ExtIEs, _asn_ctx),
-	asn_MAP_ABSInformationFDD_ExtIEs_tag2el_81,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ABSInformationFDD_ExtIEs = {
-	"ABSInformationFDD-ExtIEs",
-	"ABSInformationFDD-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ABSInformationFDD_ExtIEs_tags_81,
-	sizeof(asn_DEF_ABSInformationFDD_ExtIEs_tags_81)
-		/sizeof(asn_DEF_ABSInformationFDD_ExtIEs_tags_81[0]), /* 1 */
-	asn_DEF_ABSInformationFDD_ExtIEs_tags_81,	/* Same as above */
-	sizeof(asn_DEF_ABSInformationFDD_ExtIEs_tags_81)
-		/sizeof(asn_DEF_ABSInformationFDD_ExtIEs_tags_81[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ABSInformationFDD_ExtIEs_81,
-	3,	/* Elements count */
-	&asn_SPC_ABSInformationFDD_ExtIEs_specs_81	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_88 = {
-	sizeof(struct ABSInformationTDD_ExtIEs__extensionValue),
-	offsetof(struct ABSInformationTDD_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ABSInformationTDD_ExtIEs__extensionValue, present),
-	sizeof(((struct ABSInformationTDD_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_88 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_88	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ABSInformationTDD_ExtIEs_85[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformationTDD_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_86,  memb_id_constraint_85 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformationTDD_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_87,  memb_criticality_constraint_85 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ABSInformationTDD_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_88,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_88,  memb_extensionValue_constraint_85 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ABSInformationTDD_ExtIEs_tags_85[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ABSInformationTDD_ExtIEs_tag2el_85[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ABSInformationTDD_ExtIEs_specs_85 = {
-	sizeof(struct ABSInformationTDD_ExtIEs),
-	offsetof(struct ABSInformationTDD_ExtIEs, _asn_ctx),
-	asn_MAP_ABSInformationTDD_ExtIEs_tag2el_85,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ABSInformationTDD_ExtIEs = {
-	"ABSInformationTDD-ExtIEs",
-	"ABSInformationTDD-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ABSInformationTDD_ExtIEs_tags_85,
-	sizeof(asn_DEF_ABSInformationTDD_ExtIEs_tags_85)
-		/sizeof(asn_DEF_ABSInformationTDD_ExtIEs_tags_85[0]), /* 1 */
-	asn_DEF_ABSInformationTDD_ExtIEs_tags_85,	/* Same as above */
-	sizeof(asn_DEF_ABSInformationTDD_ExtIEs_tags_85)
-		/sizeof(asn_DEF_ABSInformationTDD_ExtIEs_tags_85[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ABSInformationTDD_ExtIEs_85,
-	3,	/* Elements count */
-	&asn_SPC_ABSInformationTDD_ExtIEs_specs_85	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_92 = {
-	sizeof(struct ABS_Status_ExtIEs__extensionValue),
-	offsetof(struct ABS_Status_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ABS_Status_ExtIEs__extensionValue, present),
-	sizeof(((struct ABS_Status_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_92 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_92	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ABS_Status_ExtIEs_89[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ABS_Status_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_90,  memb_id_constraint_89 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ABS_Status_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_91,  memb_criticality_constraint_89 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ABS_Status_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_92,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_92,  memb_extensionValue_constraint_89 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ABS_Status_ExtIEs_tags_89[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ABS_Status_ExtIEs_tag2el_89[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ABS_Status_ExtIEs_specs_89 = {
-	sizeof(struct ABS_Status_ExtIEs),
-	offsetof(struct ABS_Status_ExtIEs, _asn_ctx),
-	asn_MAP_ABS_Status_ExtIEs_tag2el_89,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ABS_Status_ExtIEs = {
-	"ABS-Status-ExtIEs",
-	"ABS-Status-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ABS_Status_ExtIEs_tags_89,
-	sizeof(asn_DEF_ABS_Status_ExtIEs_tags_89)
-		/sizeof(asn_DEF_ABS_Status_ExtIEs_tags_89[0]), /* 1 */
-	asn_DEF_ABS_Status_ExtIEs_tags_89,	/* Same as above */
-	sizeof(asn_DEF_ABS_Status_ExtIEs_tags_89)
-		/sizeof(asn_DEF_ABS_Status_ExtIEs_tags_89[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ABS_Status_ExtIEs_89,
-	3,	/* Elements count */
-	&asn_SPC_ABS_Status_ExtIEs_specs_89	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_96 = {
-	sizeof(struct AdditionalSpecialSubframe_Info_ExtIEs__extensionValue),
-	offsetof(struct AdditionalSpecialSubframe_Info_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct AdditionalSpecialSubframe_Info_ExtIEs__extensionValue, present),
-	sizeof(((struct AdditionalSpecialSubframe_Info_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_96 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_96	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_AdditionalSpecialSubframe_Info_ExtIEs_93[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframe_Info_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_94,  memb_id_constraint_93 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframe_Info_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_95,  memb_criticality_constraint_93 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframe_Info_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_96,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_96,  memb_extensionValue_constraint_93 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs_tags_93[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_AdditionalSpecialSubframe_Info_ExtIEs_tag2el_93[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_AdditionalSpecialSubframe_Info_ExtIEs_specs_93 = {
-	sizeof(struct AdditionalSpecialSubframe_Info_ExtIEs),
-	offsetof(struct AdditionalSpecialSubframe_Info_ExtIEs, _asn_ctx),
-	asn_MAP_AdditionalSpecialSubframe_Info_ExtIEs_tag2el_93,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs = {
-	"AdditionalSpecialSubframe-Info-ExtIEs",
-	"AdditionalSpecialSubframe-Info-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs_tags_93,
-	sizeof(asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs_tags_93)
-		/sizeof(asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs_tags_93[0]), /* 1 */
-	asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs_tags_93,	/* Same as above */
-	sizeof(asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs_tags_93)
-		/sizeof(asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs_tags_93[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_AdditionalSpecialSubframe_Info_ExtIEs_93,
-	3,	/* Elements count */
-	&asn_SPC_AdditionalSpecialSubframe_Info_ExtIEs_specs_93	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_100 = {
-	sizeof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs__extensionValue),
-	offsetof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs__extensionValue, present),
-	sizeof(((struct AdditionalSpecialSubframeExtension_Info_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_100 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_100	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_AdditionalSpecialSubframeExtension_Info_ExtIEs_97[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_98,  memb_id_constraint_97 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_99,  memb_criticality_constraint_97 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_100,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_100,  memb_extensionValue_constraint_97 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs_tags_97[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_AdditionalSpecialSubframeExtension_Info_ExtIEs_tag2el_97[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_AdditionalSpecialSubframeExtension_Info_ExtIEs_specs_97 = {
-	sizeof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs),
-	offsetof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs, _asn_ctx),
-	asn_MAP_AdditionalSpecialSubframeExtension_Info_ExtIEs_tag2el_97,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs = {
-	"AdditionalSpecialSubframeExtension-Info-ExtIEs",
-	"AdditionalSpecialSubframeExtension-Info-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs_tags_97,
-	sizeof(asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs_tags_97)
-		/sizeof(asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs_tags_97[0]), /* 1 */
-	asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs_tags_97,	/* Same as above */
-	sizeof(asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs_tags_97)
-		/sizeof(asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs_tags_97[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_AdditionalSpecialSubframeExtension_Info_ExtIEs_97,
-	3,	/* Elements count */
-	&asn_SPC_AdditionalSpecialSubframeExtension_Info_ExtIEs_specs_97	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_104 = {
-	sizeof(struct CellBasedQMC_ExtIEs__extensionValue),
-	offsetof(struct CellBasedQMC_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CellBasedQMC_ExtIEs__extensionValue, present),
-	sizeof(((struct CellBasedQMC_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_104 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_104	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CellBasedQMC_ExtIEs_101[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellBasedQMC_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_102,  memb_id_constraint_101 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellBasedQMC_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_103,  memb_criticality_constraint_101 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CellBasedQMC_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_104,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_104,  memb_extensionValue_constraint_101 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CellBasedQMC_ExtIEs_tags_101[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CellBasedQMC_ExtIEs_tag2el_101[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CellBasedQMC_ExtIEs_specs_101 = {
-	sizeof(struct CellBasedQMC_ExtIEs),
-	offsetof(struct CellBasedQMC_ExtIEs, _asn_ctx),
-	asn_MAP_CellBasedQMC_ExtIEs_tag2el_101,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CellBasedQMC_ExtIEs = {
-	"CellBasedQMC-ExtIEs",
-	"CellBasedQMC-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CellBasedQMC_ExtIEs_tags_101,
-	sizeof(asn_DEF_CellBasedQMC_ExtIEs_tags_101)
-		/sizeof(asn_DEF_CellBasedQMC_ExtIEs_tags_101[0]), /* 1 */
-	asn_DEF_CellBasedQMC_ExtIEs_tags_101,	/* Same as above */
-	sizeof(asn_DEF_CellBasedQMC_ExtIEs_tags_101)
-		/sizeof(asn_DEF_CellBasedQMC_ExtIEs_tags_101[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellBasedQMC_ExtIEs_101,
-	3,	/* Elements count */
-	&asn_SPC_CellBasedQMC_ExtIEs_specs_101	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_108 = {
-	sizeof(struct CellReplacingInfo_ExtIEs__extensionValue),
-	offsetof(struct CellReplacingInfo_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CellReplacingInfo_ExtIEs__extensionValue, present),
-	sizeof(((struct CellReplacingInfo_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_108 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_108	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CellReplacingInfo_ExtIEs_105[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellReplacingInfo_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_106,  memb_id_constraint_105 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellReplacingInfo_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_107,  memb_criticality_constraint_105 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CellReplacingInfo_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_108,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_108,  memb_extensionValue_constraint_105 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CellReplacingInfo_ExtIEs_tags_105[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CellReplacingInfo_ExtIEs_tag2el_105[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CellReplacingInfo_ExtIEs_specs_105 = {
-	sizeof(struct CellReplacingInfo_ExtIEs),
-	offsetof(struct CellReplacingInfo_ExtIEs, _asn_ctx),
-	asn_MAP_CellReplacingInfo_ExtIEs_tag2el_105,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CellReplacingInfo_ExtIEs = {
-	"CellReplacingInfo-ExtIEs",
-	"CellReplacingInfo-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CellReplacingInfo_ExtIEs_tags_105,
-	sizeof(asn_DEF_CellReplacingInfo_ExtIEs_tags_105)
-		/sizeof(asn_DEF_CellReplacingInfo_ExtIEs_tags_105[0]), /* 1 */
-	asn_DEF_CellReplacingInfo_ExtIEs_tags_105,	/* Same as above */
-	sizeof(asn_DEF_CellReplacingInfo_ExtIEs_tags_105)
-		/sizeof(asn_DEF_CellReplacingInfo_ExtIEs_tags_105[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellReplacingInfo_ExtIEs_105,
-	3,	/* Elements count */
-	&asn_SPC_CellReplacingInfo_ExtIEs_specs_105	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_112 = {
-	sizeof(struct CoMPHypothesisSetItem_ExtIEs__extensionValue),
-	offsetof(struct CoMPHypothesisSetItem_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CoMPHypothesisSetItem_ExtIEs__extensionValue, present),
-	sizeof(((struct CoMPHypothesisSetItem_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_112 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_112	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CoMPHypothesisSetItem_ExtIEs_109[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPHypothesisSetItem_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_110,  memb_id_constraint_109 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPHypothesisSetItem_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_111,  memb_criticality_constraint_109 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CoMPHypothesisSetItem_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_112,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_112,  memb_extensionValue_constraint_109 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CoMPHypothesisSetItem_ExtIEs_tags_109[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CoMPHypothesisSetItem_ExtIEs_tag2el_109[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CoMPHypothesisSetItem_ExtIEs_specs_109 = {
-	sizeof(struct CoMPHypothesisSetItem_ExtIEs),
-	offsetof(struct CoMPHypothesisSetItem_ExtIEs, _asn_ctx),
-	asn_MAP_CoMPHypothesisSetItem_ExtIEs_tag2el_109,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CoMPHypothesisSetItem_ExtIEs = {
-	"CoMPHypothesisSetItem-ExtIEs",
-	"CoMPHypothesisSetItem-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CoMPHypothesisSetItem_ExtIEs_tags_109,
-	sizeof(asn_DEF_CoMPHypothesisSetItem_ExtIEs_tags_109)
-		/sizeof(asn_DEF_CoMPHypothesisSetItem_ExtIEs_tags_109[0]), /* 1 */
-	asn_DEF_CoMPHypothesisSetItem_ExtIEs_tags_109,	/* Same as above */
-	sizeof(asn_DEF_CoMPHypothesisSetItem_ExtIEs_tags_109)
-		/sizeof(asn_DEF_CoMPHypothesisSetItem_ExtIEs_tags_109[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CoMPHypothesisSetItem_ExtIEs_109,
-	3,	/* Elements count */
-	&asn_SPC_CoMPHypothesisSetItem_ExtIEs_specs_109	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_116 = {
-	sizeof(struct CoMPInformation_ExtIEs__extensionValue),
-	offsetof(struct CoMPInformation_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CoMPInformation_ExtIEs__extensionValue, present),
-	sizeof(((struct CoMPInformation_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_116 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_116	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CoMPInformation_ExtIEs_113[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformation_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_114,  memb_id_constraint_113 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformation_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_115,  memb_criticality_constraint_113 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CoMPInformation_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_116,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_116,  memb_extensionValue_constraint_113 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CoMPInformation_ExtIEs_tags_113[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CoMPInformation_ExtIEs_tag2el_113[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CoMPInformation_ExtIEs_specs_113 = {
-	sizeof(struct CoMPInformation_ExtIEs),
-	offsetof(struct CoMPInformation_ExtIEs, _asn_ctx),
-	asn_MAP_CoMPInformation_ExtIEs_tag2el_113,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CoMPInformation_ExtIEs = {
-	"CoMPInformation-ExtIEs",
-	"CoMPInformation-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CoMPInformation_ExtIEs_tags_113,
-	sizeof(asn_DEF_CoMPInformation_ExtIEs_tags_113)
-		/sizeof(asn_DEF_CoMPInformation_ExtIEs_tags_113[0]), /* 1 */
-	asn_DEF_CoMPInformation_ExtIEs_tags_113,	/* Same as above */
-	sizeof(asn_DEF_CoMPInformation_ExtIEs_tags_113)
-		/sizeof(asn_DEF_CoMPInformation_ExtIEs_tags_113[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CoMPInformation_ExtIEs_113,
-	3,	/* Elements count */
-	&asn_SPC_CoMPInformation_ExtIEs_specs_113	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_120 = {
-	sizeof(struct CoMPInformationItem_ExtIEs__extensionValue),
-	offsetof(struct CoMPInformationItem_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CoMPInformationItem_ExtIEs__extensionValue, present),
-	sizeof(((struct CoMPInformationItem_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_120 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_120	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CoMPInformationItem_ExtIEs_117[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformationItem_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_118,  memb_id_constraint_117 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformationItem_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_119,  memb_criticality_constraint_117 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CoMPInformationItem_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_120,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_120,  memb_extensionValue_constraint_117 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CoMPInformationItem_ExtIEs_tags_117[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CoMPInformationItem_ExtIEs_tag2el_117[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CoMPInformationItem_ExtIEs_specs_117 = {
-	sizeof(struct CoMPInformationItem_ExtIEs),
-	offsetof(struct CoMPInformationItem_ExtIEs, _asn_ctx),
-	asn_MAP_CoMPInformationItem_ExtIEs_tag2el_117,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CoMPInformationItem_ExtIEs = {
-	"CoMPInformationItem-ExtIEs",
-	"CoMPInformationItem-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CoMPInformationItem_ExtIEs_tags_117,
-	sizeof(asn_DEF_CoMPInformationItem_ExtIEs_tags_117)
-		/sizeof(asn_DEF_CoMPInformationItem_ExtIEs_tags_117[0]), /* 1 */
-	asn_DEF_CoMPInformationItem_ExtIEs_tags_117,	/* Same as above */
-	sizeof(asn_DEF_CoMPInformationItem_ExtIEs_tags_117)
-		/sizeof(asn_DEF_CoMPInformationItem_ExtIEs_tags_117[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CoMPInformationItem_ExtIEs_117,
-	3,	/* Elements count */
-	&asn_SPC_CoMPInformationItem_ExtIEs_specs_117	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_124 = {
-	sizeof(struct CoMPInformationStartTime_ExtIEs__extensionValue),
-	offsetof(struct CoMPInformationStartTime_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CoMPInformationStartTime_ExtIEs__extensionValue, present),
-	sizeof(((struct CoMPInformationStartTime_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_124 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_124	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CoMPInformationStartTime_ExtIEs_121[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformationStartTime_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_122,  memb_id_constraint_121 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformationStartTime_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_123,  memb_criticality_constraint_121 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CoMPInformationStartTime_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_124,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_124,  memb_extensionValue_constraint_121 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CoMPInformationStartTime_ExtIEs_tags_121[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CoMPInformationStartTime_ExtIEs_tag2el_121[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CoMPInformationStartTime_ExtIEs_specs_121 = {
-	sizeof(struct CoMPInformationStartTime_ExtIEs),
-	offsetof(struct CoMPInformationStartTime_ExtIEs, _asn_ctx),
-	asn_MAP_CoMPInformationStartTime_ExtIEs_tag2el_121,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CoMPInformationStartTime_ExtIEs = {
-	"CoMPInformationStartTime-ExtIEs",
-	"CoMPInformationStartTime-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CoMPInformationStartTime_ExtIEs_tags_121,
-	sizeof(asn_DEF_CoMPInformationStartTime_ExtIEs_tags_121)
-		/sizeof(asn_DEF_CoMPInformationStartTime_ExtIEs_tags_121[0]), /* 1 */
-	asn_DEF_CoMPInformationStartTime_ExtIEs_tags_121,	/* Same as above */
-	sizeof(asn_DEF_CoMPInformationStartTime_ExtIEs_tags_121)
-		/sizeof(asn_DEF_CoMPInformationStartTime_ExtIEs_tags_121[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CoMPInformationStartTime_ExtIEs_121,
-	3,	/* Elements count */
-	&asn_SPC_CoMPInformationStartTime_ExtIEs_specs_121	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_128 = {
-	sizeof(struct CompositeAvailableCapacity_ExtIEs__extensionValue),
-	offsetof(struct CompositeAvailableCapacity_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CompositeAvailableCapacity_ExtIEs__extensionValue, present),
-	sizeof(((struct CompositeAvailableCapacity_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_128 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_128	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CompositeAvailableCapacity_ExtIEs_125[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CompositeAvailableCapacity_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_126,  memb_id_constraint_125 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CompositeAvailableCapacity_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_127,  memb_criticality_constraint_125 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CompositeAvailableCapacity_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_128,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_128,  memb_extensionValue_constraint_125 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CompositeAvailableCapacity_ExtIEs_tags_125[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CompositeAvailableCapacity_ExtIEs_tag2el_125[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CompositeAvailableCapacity_ExtIEs_specs_125 = {
-	sizeof(struct CompositeAvailableCapacity_ExtIEs),
-	offsetof(struct CompositeAvailableCapacity_ExtIEs, _asn_ctx),
-	asn_MAP_CompositeAvailableCapacity_ExtIEs_tag2el_125,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CompositeAvailableCapacity_ExtIEs = {
-	"CompositeAvailableCapacity-ExtIEs",
-	"CompositeAvailableCapacity-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CompositeAvailableCapacity_ExtIEs_tags_125,
-	sizeof(asn_DEF_CompositeAvailableCapacity_ExtIEs_tags_125)
-		/sizeof(asn_DEF_CompositeAvailableCapacity_ExtIEs_tags_125[0]), /* 1 */
-	asn_DEF_CompositeAvailableCapacity_ExtIEs_tags_125,	/* Same as above */
-	sizeof(asn_DEF_CompositeAvailableCapacity_ExtIEs_tags_125)
-		/sizeof(asn_DEF_CompositeAvailableCapacity_ExtIEs_tags_125[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CompositeAvailableCapacity_ExtIEs_125,
-	3,	/* Elements count */
-	&asn_SPC_CompositeAvailableCapacity_ExtIEs_specs_125	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_132 = {
-	sizeof(struct CompositeAvailableCapacityGroup_ExtIEs__extensionValue),
-	offsetof(struct CompositeAvailableCapacityGroup_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CompositeAvailableCapacityGroup_ExtIEs__extensionValue, present),
-	sizeof(((struct CompositeAvailableCapacityGroup_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_132 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_132	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CompositeAvailableCapacityGroup_ExtIEs_129[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CompositeAvailableCapacityGroup_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_130,  memb_id_constraint_129 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CompositeAvailableCapacityGroup_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_131,  memb_criticality_constraint_129 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CompositeAvailableCapacityGroup_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_132,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_132,  memb_extensionValue_constraint_129 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CompositeAvailableCapacityGroup_ExtIEs_tags_129[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CompositeAvailableCapacityGroup_ExtIEs_tag2el_129[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CompositeAvailableCapacityGroup_ExtIEs_specs_129 = {
-	sizeof(struct CompositeAvailableCapacityGroup_ExtIEs),
-	offsetof(struct CompositeAvailableCapacityGroup_ExtIEs, _asn_ctx),
-	asn_MAP_CompositeAvailableCapacityGroup_ExtIEs_tag2el_129,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CompositeAvailableCapacityGroup_ExtIEs = {
-	"CompositeAvailableCapacityGroup-ExtIEs",
-	"CompositeAvailableCapacityGroup-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CompositeAvailableCapacityGroup_ExtIEs_tags_129,
-	sizeof(asn_DEF_CompositeAvailableCapacityGroup_ExtIEs_tags_129)
-		/sizeof(asn_DEF_CompositeAvailableCapacityGroup_ExtIEs_tags_129[0]), /* 1 */
-	asn_DEF_CompositeAvailableCapacityGroup_ExtIEs_tags_129,	/* Same as above */
-	sizeof(asn_DEF_CompositeAvailableCapacityGroup_ExtIEs_tags_129)
-		/sizeof(asn_DEF_CompositeAvailableCapacityGroup_ExtIEs_tags_129[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CompositeAvailableCapacityGroup_ExtIEs_129,
-	3,	/* Elements count */
-	&asn_SPC_CompositeAvailableCapacityGroup_ExtIEs_specs_129	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_136 = {
-	sizeof(struct CriticalityDiagnostics_ExtIEs__extensionValue),
-	offsetof(struct CriticalityDiagnostics_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CriticalityDiagnostics_ExtIEs__extensionValue, present),
-	sizeof(((struct CriticalityDiagnostics_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_136 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_136	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_ExtIEs_133[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_134,  memb_id_constraint_133 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_135,  memb_criticality_constraint_133 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_136,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_136,  memb_extensionValue_constraint_133 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CriticalityDiagnostics_ExtIEs_tags_133[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CriticalityDiagnostics_ExtIEs_tag2el_133[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_ExtIEs_specs_133 = {
-	sizeof(struct CriticalityDiagnostics_ExtIEs),
-	offsetof(struct CriticalityDiagnostics_ExtIEs, _asn_ctx),
-	asn_MAP_CriticalityDiagnostics_ExtIEs_tag2el_133,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_ExtIEs = {
-	"CriticalityDiagnostics-ExtIEs",
-	"CriticalityDiagnostics-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CriticalityDiagnostics_ExtIEs_tags_133,
-	sizeof(asn_DEF_CriticalityDiagnostics_ExtIEs_tags_133)
-		/sizeof(asn_DEF_CriticalityDiagnostics_ExtIEs_tags_133[0]), /* 1 */
-	asn_DEF_CriticalityDiagnostics_ExtIEs_tags_133,	/* Same as above */
-	sizeof(asn_DEF_CriticalityDiagnostics_ExtIEs_tags_133)
-		/sizeof(asn_DEF_CriticalityDiagnostics_ExtIEs_tags_133[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CriticalityDiagnostics_ExtIEs_133,
-	3,	/* Elements count */
-	&asn_SPC_CriticalityDiagnostics_ExtIEs_specs_133	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_140 = {
-	sizeof(struct CriticalityDiagnostics_IE_List_ExtIEs__extensionValue),
-	offsetof(struct CriticalityDiagnostics_IE_List_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CriticalityDiagnostics_IE_List_ExtIEs__extensionValue, present),
-	sizeof(((struct CriticalityDiagnostics_IE_List_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_140 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_140	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_List_ExtIEs_137[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_List_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_138,  memb_id_constraint_137 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_List_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_139,  memb_criticality_constraint_137 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_List_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_140,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_140,  memb_extensionValue_constraint_137 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs_tags_137[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CriticalityDiagnostics_IE_List_ExtIEs_tag2el_137[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_IE_List_ExtIEs_specs_137 = {
-	sizeof(struct CriticalityDiagnostics_IE_List_ExtIEs),
-	offsetof(struct CriticalityDiagnostics_IE_List_ExtIEs, _asn_ctx),
-	asn_MAP_CriticalityDiagnostics_IE_List_ExtIEs_tag2el_137,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs = {
-	"CriticalityDiagnostics-IE-List-ExtIEs",
-	"CriticalityDiagnostics-IE-List-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs_tags_137,
-	sizeof(asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs_tags_137)
-		/sizeof(asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs_tags_137[0]), /* 1 */
-	asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs_tags_137,	/* Same as above */
-	sizeof(asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs_tags_137)
-		/sizeof(asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs_tags_137[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CriticalityDiagnostics_IE_List_ExtIEs_137,
-	3,	/* Elements count */
-	&asn_SPC_CriticalityDiagnostics_IE_List_ExtIEs_specs_137	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_144 = {
-	sizeof(struct CSIReportList_ExtIEs__extensionValue),
-	offsetof(struct CSIReportList_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CSIReportList_ExtIEs__extensionValue, present),
-	sizeof(((struct CSIReportList_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_144 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_144	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CSIReportList_ExtIEs_141[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportList_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_142,  memb_id_constraint_141 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportList_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_143,  memb_criticality_constraint_141 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CSIReportList_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_144,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_144,  memb_extensionValue_constraint_141 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CSIReportList_ExtIEs_tags_141[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CSIReportList_ExtIEs_tag2el_141[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CSIReportList_ExtIEs_specs_141 = {
-	sizeof(struct CSIReportList_ExtIEs),
-	offsetof(struct CSIReportList_ExtIEs, _asn_ctx),
-	asn_MAP_CSIReportList_ExtIEs_tag2el_141,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CSIReportList_ExtIEs = {
-	"CSIReportList-ExtIEs",
-	"CSIReportList-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CSIReportList_ExtIEs_tags_141,
-	sizeof(asn_DEF_CSIReportList_ExtIEs_tags_141)
-		/sizeof(asn_DEF_CSIReportList_ExtIEs_tags_141[0]), /* 1 */
-	asn_DEF_CSIReportList_ExtIEs_tags_141,	/* Same as above */
-	sizeof(asn_DEF_CSIReportList_ExtIEs_tags_141)
-		/sizeof(asn_DEF_CSIReportList_ExtIEs_tags_141[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CSIReportList_ExtIEs_141,
-	3,	/* Elements count */
-	&asn_SPC_CSIReportList_ExtIEs_specs_141	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_148 = {
-	sizeof(struct CSIReportPerCSIProcess_ExtIEs__extensionValue),
-	offsetof(struct CSIReportPerCSIProcess_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CSIReportPerCSIProcess_ExtIEs__extensionValue, present),
-	sizeof(((struct CSIReportPerCSIProcess_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_148 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_148	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CSIReportPerCSIProcess_ExtIEs_145[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcess_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_146,  memb_id_constraint_145 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcess_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_147,  memb_criticality_constraint_145 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcess_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_148,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_148,  memb_extensionValue_constraint_145 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CSIReportPerCSIProcess_ExtIEs_tags_145[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CSIReportPerCSIProcess_ExtIEs_tag2el_145[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CSIReportPerCSIProcess_ExtIEs_specs_145 = {
-	sizeof(struct CSIReportPerCSIProcess_ExtIEs),
-	offsetof(struct CSIReportPerCSIProcess_ExtIEs, _asn_ctx),
-	asn_MAP_CSIReportPerCSIProcess_ExtIEs_tag2el_145,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CSIReportPerCSIProcess_ExtIEs = {
-	"CSIReportPerCSIProcess-ExtIEs",
-	"CSIReportPerCSIProcess-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CSIReportPerCSIProcess_ExtIEs_tags_145,
-	sizeof(asn_DEF_CSIReportPerCSIProcess_ExtIEs_tags_145)
-		/sizeof(asn_DEF_CSIReportPerCSIProcess_ExtIEs_tags_145[0]), /* 1 */
-	asn_DEF_CSIReportPerCSIProcess_ExtIEs_tags_145,	/* Same as above */
-	sizeof(asn_DEF_CSIReportPerCSIProcess_ExtIEs_tags_145)
-		/sizeof(asn_DEF_CSIReportPerCSIProcess_ExtIEs_tags_145[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CSIReportPerCSIProcess_ExtIEs_145,
-	3,	/* Elements count */
-	&asn_SPC_CSIReportPerCSIProcess_ExtIEs_specs_145	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_152 = {
-	sizeof(struct CSIReportPerCSIProcessItem_ExtIEs__extensionValue),
-	offsetof(struct CSIReportPerCSIProcessItem_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct CSIReportPerCSIProcessItem_ExtIEs__extensionValue, present),
-	sizeof(((struct CSIReportPerCSIProcessItem_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_152 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_152	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CSIReportPerCSIProcessItem_ExtIEs_149[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcessItem_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_150,  memb_id_constraint_149 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcessItem_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_151,  memb_criticality_constraint_149 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcessItem_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_152,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_152,  memb_extensionValue_constraint_149 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CSIReportPerCSIProcessItem_ExtIEs_tags_149[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CSIReportPerCSIProcessItem_ExtIEs_tag2el_149[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CSIReportPerCSIProcessItem_ExtIEs_specs_149 = {
-	sizeof(struct CSIReportPerCSIProcessItem_ExtIEs),
-	offsetof(struct CSIReportPerCSIProcessItem_ExtIEs, _asn_ctx),
-	asn_MAP_CSIReportPerCSIProcessItem_ExtIEs_tag2el_149,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CSIReportPerCSIProcessItem_ExtIEs = {
-	"CSIReportPerCSIProcessItem-ExtIEs",
-	"CSIReportPerCSIProcessItem-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CSIReportPerCSIProcessItem_ExtIEs_tags_149,
-	sizeof(asn_DEF_CSIReportPerCSIProcessItem_ExtIEs_tags_149)
-		/sizeof(asn_DEF_CSIReportPerCSIProcessItem_ExtIEs_tags_149[0]), /* 1 */
-	asn_DEF_CSIReportPerCSIProcessItem_ExtIEs_tags_149,	/* Same as above */
-	sizeof(asn_DEF_CSIReportPerCSIProcessItem_ExtIEs_tags_149)
-		/sizeof(asn_DEF_CSIReportPerCSIProcessItem_ExtIEs_tags_149[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CSIReportPerCSIProcessItem_ExtIEs_149,
-	3,	/* Elements count */
-	&asn_SPC_CSIReportPerCSIProcessItem_ExtIEs_specs_149	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_156 = {
-	sizeof(struct DynamicNAICSInformation_ExtIEs__extensionValue),
-	offsetof(struct DynamicNAICSInformation_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct DynamicNAICSInformation_ExtIEs__extensionValue, present),
-	sizeof(((struct DynamicNAICSInformation_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_156 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_156	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_DynamicNAICSInformation_ExtIEs_153[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct DynamicNAICSInformation_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_154,  memb_id_constraint_153 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct DynamicNAICSInformation_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_155,  memb_criticality_constraint_153 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct DynamicNAICSInformation_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_156,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_156,  memb_extensionValue_constraint_153 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_DynamicNAICSInformation_ExtIEs_tags_153[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_DynamicNAICSInformation_ExtIEs_tag2el_153[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_DynamicNAICSInformation_ExtIEs_specs_153 = {
-	sizeof(struct DynamicNAICSInformation_ExtIEs),
-	offsetof(struct DynamicNAICSInformation_ExtIEs, _asn_ctx),
-	asn_MAP_DynamicNAICSInformation_ExtIEs_tag2el_153,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_DynamicNAICSInformation_ExtIEs = {
-	"DynamicNAICSInformation-ExtIEs",
-	"DynamicNAICSInformation-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_DynamicNAICSInformation_ExtIEs_tags_153,
-	sizeof(asn_DEF_DynamicNAICSInformation_ExtIEs_tags_153)
-		/sizeof(asn_DEF_DynamicNAICSInformation_ExtIEs_tags_153[0]), /* 1 */
-	asn_DEF_DynamicNAICSInformation_ExtIEs_tags_153,	/* Same as above */
-	sizeof(asn_DEF_DynamicNAICSInformation_ExtIEs_tags_153)
-		/sizeof(asn_DEF_DynamicNAICSInformation_ExtIEs_tags_153[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_DynamicNAICSInformation_ExtIEs_153,
-	3,	/* Elements count */
-	&asn_SPC_DynamicNAICSInformation_ExtIEs_specs_153	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_160 = {
-	sizeof(struct ECGI_ExtIEs__extensionValue),
-	offsetof(struct ECGI_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ECGI_ExtIEs__extensionValue, present),
-	sizeof(((struct ECGI_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_160 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_160	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ECGI_ExtIEs_157[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ECGI_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_158,  memb_id_constraint_157 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ECGI_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_159,  memb_criticality_constraint_157 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ECGI_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_160,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_160,  memb_extensionValue_constraint_157 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ECGI_ExtIEs_tags_157[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ECGI_ExtIEs_tag2el_157[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ECGI_ExtIEs_specs_157 = {
-	sizeof(struct ECGI_ExtIEs),
-	offsetof(struct ECGI_ExtIEs, _asn_ctx),
-	asn_MAP_ECGI_ExtIEs_tag2el_157,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ECGI_ExtIEs = {
-	"ECGI-ExtIEs",
-	"ECGI-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ECGI_ExtIEs_tags_157,
-	sizeof(asn_DEF_ECGI_ExtIEs_tags_157)
-		/sizeof(asn_DEF_ECGI_ExtIEs_tags_157[0]), /* 1 */
-	asn_DEF_ECGI_ExtIEs_tags_157,	/* Same as above */
-	sizeof(asn_DEF_ECGI_ExtIEs_tags_157)
-		/sizeof(asn_DEF_ECGI_ExtIEs_tags_157[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ECGI_ExtIEs_157,
-	3,	/* Elements count */
-	&asn_SPC_ECGI_ExtIEs_specs_157	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_164 = {
-	sizeof(struct EnhancedRNTP_ExtIEs__extensionValue),
-	offsetof(struct EnhancedRNTP_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct EnhancedRNTP_ExtIEs__extensionValue, present),
-	sizeof(((struct EnhancedRNTP_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_164 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_164	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_EnhancedRNTP_ExtIEs_161[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTP_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_162,  memb_id_constraint_161 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTP_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_163,  memb_criticality_constraint_161 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTP_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_164,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_164,  memb_extensionValue_constraint_161 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_EnhancedRNTP_ExtIEs_tags_161[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_EnhancedRNTP_ExtIEs_tag2el_161[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_EnhancedRNTP_ExtIEs_specs_161 = {
-	sizeof(struct EnhancedRNTP_ExtIEs),
-	offsetof(struct EnhancedRNTP_ExtIEs, _asn_ctx),
-	asn_MAP_EnhancedRNTP_ExtIEs_tag2el_161,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_EnhancedRNTP_ExtIEs = {
-	"EnhancedRNTP-ExtIEs",
-	"EnhancedRNTP-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_EnhancedRNTP_ExtIEs_tags_161,
-	sizeof(asn_DEF_EnhancedRNTP_ExtIEs_tags_161)
-		/sizeof(asn_DEF_EnhancedRNTP_ExtIEs_tags_161[0]), /* 1 */
-	asn_DEF_EnhancedRNTP_ExtIEs_tags_161,	/* Same as above */
-	sizeof(asn_DEF_EnhancedRNTP_ExtIEs_tags_161)
-		/sizeof(asn_DEF_EnhancedRNTP_ExtIEs_tags_161[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_EnhancedRNTP_ExtIEs_161,
-	3,	/* Elements count */
-	&asn_SPC_EnhancedRNTP_ExtIEs_specs_161	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_168 = {
-	sizeof(struct EnhancedRNTPStartTime_ExtIEs__extensionValue),
-	offsetof(struct EnhancedRNTPStartTime_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct EnhancedRNTPStartTime_ExtIEs__extensionValue, present),
-	sizeof(((struct EnhancedRNTPStartTime_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_168 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_168	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_EnhancedRNTPStartTime_ExtIEs_165[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTPStartTime_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_166,  memb_id_constraint_165 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTPStartTime_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_167,  memb_criticality_constraint_165 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTPStartTime_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_168,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_168,  memb_extensionValue_constraint_165 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_EnhancedRNTPStartTime_ExtIEs_tags_165[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_EnhancedRNTPStartTime_ExtIEs_tag2el_165[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_EnhancedRNTPStartTime_ExtIEs_specs_165 = {
-	sizeof(struct EnhancedRNTPStartTime_ExtIEs),
-	offsetof(struct EnhancedRNTPStartTime_ExtIEs, _asn_ctx),
-	asn_MAP_EnhancedRNTPStartTime_ExtIEs_tag2el_165,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_EnhancedRNTPStartTime_ExtIEs = {
-	"EnhancedRNTPStartTime-ExtIEs",
-	"EnhancedRNTPStartTime-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_EnhancedRNTPStartTime_ExtIEs_tags_165,
-	sizeof(asn_DEF_EnhancedRNTPStartTime_ExtIEs_tags_165)
-		/sizeof(asn_DEF_EnhancedRNTPStartTime_ExtIEs_tags_165[0]), /* 1 */
-	asn_DEF_EnhancedRNTPStartTime_ExtIEs_tags_165,	/* Same as above */
-	sizeof(asn_DEF_EnhancedRNTPStartTime_ExtIEs_tags_165)
-		/sizeof(asn_DEF_EnhancedRNTPStartTime_ExtIEs_tags_165[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_EnhancedRNTPStartTime_ExtIEs_165,
-	3,	/* Elements count */
-	&asn_SPC_EnhancedRNTPStartTime_ExtIEs_specs_165	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_172 = {
-	sizeof(struct ExtendedULInterferenceOverloadInfo_ExtIEs__extensionValue),
-	offsetof(struct ExtendedULInterferenceOverloadInfo_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ExtendedULInterferenceOverloadInfo_ExtIEs__extensionValue, present),
-	sizeof(((struct ExtendedULInterferenceOverloadInfo_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_172 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_172	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ExtendedULInterferenceOverloadInfo_ExtIEs_169[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ExtendedULInterferenceOverloadInfo_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_170,  memb_id_constraint_169 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ExtendedULInterferenceOverloadInfo_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_171,  memb_criticality_constraint_169 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ExtendedULInterferenceOverloadInfo_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_172,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_172,  memb_extensionValue_constraint_169 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs_tags_169[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ExtendedULInterferenceOverloadInfo_ExtIEs_tag2el_169[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ExtendedULInterferenceOverloadInfo_ExtIEs_specs_169 = {
-	sizeof(struct ExtendedULInterferenceOverloadInfo_ExtIEs),
-	offsetof(struct ExtendedULInterferenceOverloadInfo_ExtIEs, _asn_ctx),
-	asn_MAP_ExtendedULInterferenceOverloadInfo_ExtIEs_tag2el_169,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs = {
-	"ExtendedULInterferenceOverloadInfo-ExtIEs",
-	"ExtendedULInterferenceOverloadInfo-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs_tags_169,
-	sizeof(asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs_tags_169)
-		/sizeof(asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs_tags_169[0]), /* 1 */
-	asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs_tags_169,	/* Same as above */
-	sizeof(asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs_tags_169)
-		/sizeof(asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs_tags_169[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ExtendedULInterferenceOverloadInfo_ExtIEs_169,
-	3,	/* Elements count */
-	&asn_SPC_ExtendedULInterferenceOverloadInfo_ExtIEs_specs_169	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_extensionValue_176[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info_ExtIEs__extensionValue, choice.EARFCNExtension),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_EARFCNExtension,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"EARFCNExtension"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info_ExtIEs__extensionValue, choice.OffsetOfNbiotChannelNumberToEARFCN),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_OffsetOfNbiotChannelNumberToEARFCN,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"OffsetOfNbiotChannelNumberToEARFCN"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info_ExtIEs__extensionValue, choice.NRS_NSSS_PowerOffset),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_NRS_NSSS_PowerOffset,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"NRS-NSSS-PowerOffset"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info_ExtIEs__extensionValue, choice.NSSS_NumOccasionDifferentPrecoder),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_NSSS_NumOccasionDifferentPrecoder,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"NSSS-NumOccasionDifferentPrecoder"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_176[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* EARFCNExtension */
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 2 }, /* OffsetOfNbiotChannelNumberToEARFCN */
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 2, -1, 1 }, /* NRS-NSSS-PowerOffset */
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 3, -2, 0 } /* NSSS-NumOccasionDifferentPrecoder */
-};
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_176 = {
-	sizeof(struct FDD_Info_ExtIEs__extensionValue),
-	offsetof(struct FDD_Info_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct FDD_Info_ExtIEs__extensionValue, present),
-	sizeof(((struct FDD_Info_ExtIEs__extensionValue *)0)->present),
-	asn_MAP_extensionValue_tag2el_176,
-	4,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_176 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_extensionValue_176,
-	4,	/* Elements count */
-	&asn_SPC_extensionValue_specs_176	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_FDD_Info_ExtIEs_173[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_174,  memb_id_constraint_173 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_FDD_Info_ExtIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_175,  memb_criticality_constraint_173 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct FDD_Info_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_176,
-		select_FDD_Info_ExtIEs_extensionValue_type,
-		{ 0, &asn_PER_memb_extensionValue_constr_176,  memb_extensionValue_constraint_173 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_FDD_Info_ExtIEs_tags_173[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_FDD_Info_ExtIEs_tag2el_173[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_FDD_Info_ExtIEs_specs_173 = {
-	sizeof(struct FDD_Info_ExtIEs),
-	offsetof(struct FDD_Info_ExtIEs, _asn_ctx),
-	asn_MAP_FDD_Info_ExtIEs_tag2el_173,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_FDD_Info_ExtIEs = {
-	"FDD-Info-ExtIEs",
-	"FDD-Info-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_FDD_Info_ExtIEs_tags_173,
-	sizeof(asn_DEF_FDD_Info_ExtIEs_tags_173)
-		/sizeof(asn_DEF_FDD_Info_ExtIEs_tags_173[0]), /* 1 */
-	asn_DEF_FDD_Info_ExtIEs_tags_173,	/* Same as above */
-	sizeof(asn_DEF_FDD_Info_ExtIEs_tags_173)
-		/sizeof(asn_DEF_FDD_Info_ExtIEs_tags_173[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_FDD_Info_ExtIEs_173,
-	3,	/* Elements count */
-	&asn_SPC_FDD_Info_ExtIEs_specs_173	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_180 = {
-	sizeof(struct FreqBandNrItem_ExtIEs__extensionValue),
-	offsetof(struct FreqBandNrItem_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct FreqBandNrItem_ExtIEs__extensionValue, present),
-	sizeof(((struct FreqBandNrItem_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_180 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_180	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_FreqBandNrItem_ExtIEs_177[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct FreqBandNrItem_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_178,  memb_id_constraint_177 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct FreqBandNrItem_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_179,  memb_criticality_constraint_177 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct FreqBandNrItem_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_180,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_180,  memb_extensionValue_constraint_177 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_FreqBandNrItem_ExtIEs_tags_177[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_FreqBandNrItem_ExtIEs_tag2el_177[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_FreqBandNrItem_ExtIEs_specs_177 = {
-	sizeof(struct FreqBandNrItem_ExtIEs),
-	offsetof(struct FreqBandNrItem_ExtIEs, _asn_ctx),
-	asn_MAP_FreqBandNrItem_ExtIEs_tag2el_177,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_FreqBandNrItem_ExtIEs = {
-	"FreqBandNrItem-ExtIEs",
-	"FreqBandNrItem-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_FreqBandNrItem_ExtIEs_tags_177,
-	sizeof(asn_DEF_FreqBandNrItem_ExtIEs_tags_177)
-		/sizeof(asn_DEF_FreqBandNrItem_ExtIEs_tags_177[0]), /* 1 */
-	asn_DEF_FreqBandNrItem_ExtIEs_tags_177,	/* Same as above */
-	sizeof(asn_DEF_FreqBandNrItem_ExtIEs_tags_177)
-		/sizeof(asn_DEF_FreqBandNrItem_ExtIEs_tags_177[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_FreqBandNrItem_ExtIEs_177,
-	3,	/* Elements count */
-	&asn_SPC_FreqBandNrItem_ExtIEs_specs_177	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_184 = {
-	sizeof(struct GlobalENB_ID_ExtIEs__extensionValue),
-	offsetof(struct GlobalENB_ID_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct GlobalENB_ID_ExtIEs__extensionValue, present),
-	sizeof(((struct GlobalENB_ID_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_184 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_184	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_GlobalENB_ID_ExtIEs_181[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_182,  memb_id_constraint_181 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_183,  memb_criticality_constraint_181 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_184,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_184,  memb_extensionValue_constraint_181 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_GlobalENB_ID_ExtIEs_tags_181[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_GlobalENB_ID_ExtIEs_tag2el_181[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_GlobalENB_ID_ExtIEs_specs_181 = {
-	sizeof(struct GlobalENB_ID_ExtIEs),
-	offsetof(struct GlobalENB_ID_ExtIEs, _asn_ctx),
-	asn_MAP_GlobalENB_ID_ExtIEs_tag2el_181,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID_ExtIEs = {
-	"GlobalENB-ID-ExtIEs",
-	"GlobalENB-ID-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_GlobalENB_ID_ExtIEs_tags_181,
-	sizeof(asn_DEF_GlobalENB_ID_ExtIEs_tags_181)
-		/sizeof(asn_DEF_GlobalENB_ID_ExtIEs_tags_181[0]), /* 1 */
-	asn_DEF_GlobalENB_ID_ExtIEs_tags_181,	/* Same as above */
-	sizeof(asn_DEF_GlobalENB_ID_ExtIEs_tags_181)
-		/sizeof(asn_DEF_GlobalENB_ID_ExtIEs_tags_181[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_GlobalENB_ID_ExtIEs_181,
-	3,	/* Elements count */
-	&asn_SPC_GlobalENB_ID_ExtIEs_specs_181	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_188 = {
-	sizeof(struct GlobalGNB_ID_ExtIEs__extensionValue),
-	offsetof(struct GlobalGNB_ID_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct GlobalGNB_ID_ExtIEs__extensionValue, present),
-	sizeof(((struct GlobalGNB_ID_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_188 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_188	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_GlobalGNB_ID_ExtIEs_185[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct GlobalGNB_ID_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_186,  memb_id_constraint_185 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct GlobalGNB_ID_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_187,  memb_criticality_constraint_185 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct GlobalGNB_ID_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_188,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_188,  memb_extensionValue_constraint_185 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_GlobalGNB_ID_ExtIEs_tags_185[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_GlobalGNB_ID_ExtIEs_tag2el_185[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_GlobalGNB_ID_ExtIEs_specs_185 = {
-	sizeof(struct GlobalGNB_ID_ExtIEs),
-	offsetof(struct GlobalGNB_ID_ExtIEs, _asn_ctx),
-	asn_MAP_GlobalGNB_ID_ExtIEs_tag2el_185,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_GlobalGNB_ID_ExtIEs = {
-	"GlobalGNB-ID-ExtIEs",
-	"GlobalGNB-ID-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_GlobalGNB_ID_ExtIEs_tags_185,
-	sizeof(asn_DEF_GlobalGNB_ID_ExtIEs_tags_185)
-		/sizeof(asn_DEF_GlobalGNB_ID_ExtIEs_tags_185[0]), /* 1 */
-	asn_DEF_GlobalGNB_ID_ExtIEs_tags_185,	/* Same as above */
-	sizeof(asn_DEF_GlobalGNB_ID_ExtIEs_tags_185)
-		/sizeof(asn_DEF_GlobalGNB_ID_ExtIEs_tags_185[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_GlobalGNB_ID_ExtIEs_185,
-	3,	/* Elements count */
-	&asn_SPC_GlobalGNB_ID_ExtIEs_specs_185	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_192 = {
-	sizeof(struct GU_Group_ID_ExtIEs__extensionValue),
-	offsetof(struct GU_Group_ID_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct GU_Group_ID_ExtIEs__extensionValue, present),
-	sizeof(((struct GU_Group_ID_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_192 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_192	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_GU_Group_ID_ExtIEs_189[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct GU_Group_ID_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_190,  memb_id_constraint_189 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct GU_Group_ID_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_191,  memb_criticality_constraint_189 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct GU_Group_ID_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_192,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_192,  memb_extensionValue_constraint_189 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_GU_Group_ID_ExtIEs_tags_189[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_GU_Group_ID_ExtIEs_tag2el_189[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_GU_Group_ID_ExtIEs_specs_189 = {
-	sizeof(struct GU_Group_ID_ExtIEs),
-	offsetof(struct GU_Group_ID_ExtIEs, _asn_ctx),
-	asn_MAP_GU_Group_ID_ExtIEs_tag2el_189,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_GU_Group_ID_ExtIEs = {
-	"GU-Group-ID-ExtIEs",
-	"GU-Group-ID-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_GU_Group_ID_ExtIEs_tags_189,
-	sizeof(asn_DEF_GU_Group_ID_ExtIEs_tags_189)
-		/sizeof(asn_DEF_GU_Group_ID_ExtIEs_tags_189[0]), /* 1 */
-	asn_DEF_GU_Group_ID_ExtIEs_tags_189,	/* Same as above */
-	sizeof(asn_DEF_GU_Group_ID_ExtIEs_tags_189)
-		/sizeof(asn_DEF_GU_Group_ID_ExtIEs_tags_189[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_GU_Group_ID_ExtIEs_189,
-	3,	/* Elements count */
-	&asn_SPC_GU_Group_ID_ExtIEs_specs_189	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_196 = {
-	sizeof(struct HWLoadIndicator_ExtIEs__extensionValue),
-	offsetof(struct HWLoadIndicator_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct HWLoadIndicator_ExtIEs__extensionValue, present),
-	sizeof(((struct HWLoadIndicator_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_196 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_196	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_HWLoadIndicator_ExtIEs_193[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct HWLoadIndicator_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_194,  memb_id_constraint_193 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct HWLoadIndicator_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_195,  memb_criticality_constraint_193 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct HWLoadIndicator_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_196,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_196,  memb_extensionValue_constraint_193 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_HWLoadIndicator_ExtIEs_tags_193[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_HWLoadIndicator_ExtIEs_tag2el_193[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_HWLoadIndicator_ExtIEs_specs_193 = {
-	sizeof(struct HWLoadIndicator_ExtIEs),
-	offsetof(struct HWLoadIndicator_ExtIEs, _asn_ctx),
-	asn_MAP_HWLoadIndicator_ExtIEs_tag2el_193,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_HWLoadIndicator_ExtIEs = {
-	"HWLoadIndicator-ExtIEs",
-	"HWLoadIndicator-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_HWLoadIndicator_ExtIEs_tags_193,
-	sizeof(asn_DEF_HWLoadIndicator_ExtIEs_tags_193)
-		/sizeof(asn_DEF_HWLoadIndicator_ExtIEs_tags_193[0]), /* 1 */
-	asn_DEF_HWLoadIndicator_ExtIEs_tags_193,	/* Same as above */
-	sizeof(asn_DEF_HWLoadIndicator_ExtIEs_tags_193)
-		/sizeof(asn_DEF_HWLoadIndicator_ExtIEs_tags_193[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_HWLoadIndicator_ExtIEs_193,
-	3,	/* Elements count */
-	&asn_SPC_HWLoadIndicator_ExtIEs_specs_193	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_200 = {
-	sizeof(struct MBSFN_Subframe_Info_ExtIEs__extensionValue),
-	offsetof(struct MBSFN_Subframe_Info_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct MBSFN_Subframe_Info_ExtIEs__extensionValue, present),
-	sizeof(((struct MBSFN_Subframe_Info_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_200 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_200	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_MBSFN_Subframe_Info_ExtIEs_197[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct MBSFN_Subframe_Info_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_198,  memb_id_constraint_197 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct MBSFN_Subframe_Info_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_199,  memb_criticality_constraint_197 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct MBSFN_Subframe_Info_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_200,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_200,  memb_extensionValue_constraint_197 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_MBSFN_Subframe_Info_ExtIEs_tags_197[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_MBSFN_Subframe_Info_ExtIEs_tag2el_197[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_MBSFN_Subframe_Info_ExtIEs_specs_197 = {
-	sizeof(struct MBSFN_Subframe_Info_ExtIEs),
-	offsetof(struct MBSFN_Subframe_Info_ExtIEs, _asn_ctx),
-	asn_MAP_MBSFN_Subframe_Info_ExtIEs_tag2el_197,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_MBSFN_Subframe_Info_ExtIEs = {
-	"MBSFN-Subframe-Info-ExtIEs",
-	"MBSFN-Subframe-Info-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_MBSFN_Subframe_Info_ExtIEs_tags_197,
-	sizeof(asn_DEF_MBSFN_Subframe_Info_ExtIEs_tags_197)
-		/sizeof(asn_DEF_MBSFN_Subframe_Info_ExtIEs_tags_197[0]), /* 1 */
-	asn_DEF_MBSFN_Subframe_Info_ExtIEs_tags_197,	/* Same as above */
-	sizeof(asn_DEF_MBSFN_Subframe_Info_ExtIEs_tags_197)
-		/sizeof(asn_DEF_MBSFN_Subframe_Info_ExtIEs_tags_197[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_MBSFN_Subframe_Info_ExtIEs_197,
-	3,	/* Elements count */
-	&asn_SPC_MBSFN_Subframe_Info_ExtIEs_specs_197	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_204 = {
-	sizeof(struct BandInfo_ExtIEs__extensionValue),
-	offsetof(struct BandInfo_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct BandInfo_ExtIEs__extensionValue, present),
-	sizeof(((struct BandInfo_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_204 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_204	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_BandInfo_ExtIEs_201[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct BandInfo_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_202,  memb_id_constraint_201 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct BandInfo_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_203,  memb_criticality_constraint_201 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct BandInfo_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_204,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_204,  memb_extensionValue_constraint_201 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_BandInfo_ExtIEs_tags_201[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_BandInfo_ExtIEs_tag2el_201[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_BandInfo_ExtIEs_specs_201 = {
-	sizeof(struct BandInfo_ExtIEs),
-	offsetof(struct BandInfo_ExtIEs, _asn_ctx),
-	asn_MAP_BandInfo_ExtIEs_tag2el_201,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_BandInfo_ExtIEs = {
-	"BandInfo-ExtIEs",
-	"BandInfo-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_BandInfo_ExtIEs_tags_201,
-	sizeof(asn_DEF_BandInfo_ExtIEs_tags_201)
-		/sizeof(asn_DEF_BandInfo_ExtIEs_tags_201[0]), /* 1 */
-	asn_DEF_BandInfo_ExtIEs_tags_201,	/* Same as above */
-	sizeof(asn_DEF_BandInfo_ExtIEs_tags_201)
-		/sizeof(asn_DEF_BandInfo_ExtIEs_tags_201[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_BandInfo_ExtIEs_201,
-	3,	/* Elements count */
-	&asn_SPC_BandInfo_ExtIEs_specs_201	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_extensionValue_208[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct Neighbour_Information_ExtIEs__extensionValue, choice.TAC),
-		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
-		0,
-		&asn_DEF_TAC,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"TAC"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct Neighbour_Information_ExtIEs__extensionValue, choice.EARFCNExtension),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_EARFCNExtension,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"EARFCNExtension"
-		},
-};
-static const unsigned asn_MAP_extensionValue_to_canonical_208[] = { 1, 0 };
-static const unsigned asn_MAP_extensionValue_from_canonical_208[] = { 1, 0 };
-static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_208[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* EARFCNExtension */
-    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 0, 0, 0 } /* TAC */
-};
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_208 = {
-	sizeof(struct Neighbour_Information_ExtIEs__extensionValue),
-	offsetof(struct Neighbour_Information_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct Neighbour_Information_ExtIEs__extensionValue, present),
-	sizeof(((struct Neighbour_Information_ExtIEs__extensionValue *)0)->present),
-	asn_MAP_extensionValue_tag2el_208,
-	2,	/* Count of tags in the map */
-	asn_MAP_extensionValue_to_canonical_208,
-	asn_MAP_extensionValue_from_canonical_208,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_208 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_extensionValue_208,
-	2,	/* Elements count */
-	&asn_SPC_extensionValue_specs_208	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_Neighbour_Information_ExtIEs_205[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct Neighbour_Information_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_206,  memb_id_constraint_205 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct Neighbour_Information_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_Neighbour_Information_ExtIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_207,  memb_criticality_constraint_205 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct Neighbour_Information_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_208,
-		select_Neighbour_Information_ExtIEs_extensionValue_type,
-		{ 0, &asn_PER_memb_extensionValue_constr_208,  memb_extensionValue_constraint_205 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_Neighbour_Information_ExtIEs_tags_205[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Neighbour_Information_ExtIEs_tag2el_205[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_Neighbour_Information_ExtIEs_specs_205 = {
-	sizeof(struct Neighbour_Information_ExtIEs),
-	offsetof(struct Neighbour_Information_ExtIEs, _asn_ctx),
-	asn_MAP_Neighbour_Information_ExtIEs_tag2el_205,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_Neighbour_Information_ExtIEs = {
-	"Neighbour-Information-ExtIEs",
-	"Neighbour-Information-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Neighbour_Information_ExtIEs_tags_205,
-	sizeof(asn_DEF_Neighbour_Information_ExtIEs_tags_205)
-		/sizeof(asn_DEF_Neighbour_Information_ExtIEs_tags_205[0]), /* 1 */
-	asn_DEF_Neighbour_Information_ExtIEs_tags_205,	/* Same as above */
-	sizeof(asn_DEF_Neighbour_Information_ExtIEs_tags_205)
-		/sizeof(asn_DEF_Neighbour_Information_ExtIEs_tags_205[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Neighbour_Information_ExtIEs_205,
-	3,	/* Elements count */
-	&asn_SPC_Neighbour_Information_ExtIEs_specs_205	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_212 = {
-	sizeof(struct NRFreqInfo_ExtIEs__extensionValue),
-	offsetof(struct NRFreqInfo_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct NRFreqInfo_ExtIEs__extensionValue, present),
-	sizeof(((struct NRFreqInfo_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_212 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_212	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_NRFreqInfo_ExtIEs_209[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct NRFreqInfo_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_210,  memb_id_constraint_209 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct NRFreqInfo_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_211,  memb_criticality_constraint_209 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct NRFreqInfo_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_212,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_212,  memb_extensionValue_constraint_209 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_NRFreqInfo_ExtIEs_tags_209[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_NRFreqInfo_ExtIEs_tag2el_209[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_NRFreqInfo_ExtIEs_specs_209 = {
-	sizeof(struct NRFreqInfo_ExtIEs),
-	offsetof(struct NRFreqInfo_ExtIEs, _asn_ctx),
-	asn_MAP_NRFreqInfo_ExtIEs_tag2el_209,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_NRFreqInfo_ExtIEs = {
-	"NRFreqInfo-ExtIEs",
-	"NRFreqInfo-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_NRFreqInfo_ExtIEs_tags_209,
-	sizeof(asn_DEF_NRFreqInfo_ExtIEs_tags_209)
-		/sizeof(asn_DEF_NRFreqInfo_ExtIEs_tags_209[0]), /* 1 */
-	asn_DEF_NRFreqInfo_ExtIEs_tags_209,	/* Same as above */
-	sizeof(asn_DEF_NRFreqInfo_ExtIEs_tags_209)
-		/sizeof(asn_DEF_NRFreqInfo_ExtIEs_tags_209[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_NRFreqInfo_ExtIEs_209,
-	3,	/* Elements count */
-	&asn_SPC_NRFreqInfo_ExtIEs_specs_209	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_216 = {
-	sizeof(struct NRCGI_ExtIEs__extensionValue),
-	offsetof(struct NRCGI_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct NRCGI_ExtIEs__extensionValue, present),
-	sizeof(((struct NRCGI_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_216 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_216	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_NRCGI_ExtIEs_213[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct NRCGI_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_214,  memb_id_constraint_213 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct NRCGI_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_215,  memb_criticality_constraint_213 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct NRCGI_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_216,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_216,  memb_extensionValue_constraint_213 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_NRCGI_ExtIEs_tags_213[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_NRCGI_ExtIEs_tag2el_213[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_NRCGI_ExtIEs_specs_213 = {
-	sizeof(struct NRCGI_ExtIEs),
-	offsetof(struct NRCGI_ExtIEs, _asn_ctx),
-	asn_MAP_NRCGI_ExtIEs_tag2el_213,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_NRCGI_ExtIEs = {
-	"NRCGI-ExtIEs",
-	"NRCGI-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_NRCGI_ExtIEs_tags_213,
-	sizeof(asn_DEF_NRCGI_ExtIEs_tags_213)
-		/sizeof(asn_DEF_NRCGI_ExtIEs_tags_213[0]), /* 1 */
-	asn_DEF_NRCGI_ExtIEs_tags_213,	/* Same as above */
-	sizeof(asn_DEF_NRCGI_ExtIEs_tags_213)
-		/sizeof(asn_DEF_NRCGI_ExtIEs_tags_213[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_NRCGI_ExtIEs_213,
-	3,	/* Elements count */
-	&asn_SPC_NRCGI_ExtIEs_specs_213	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_220 = {
-	sizeof(struct NR_TxBW_ExtIEs__extensionValue),
-	offsetof(struct NR_TxBW_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct NR_TxBW_ExtIEs__extensionValue, present),
-	sizeof(((struct NR_TxBW_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_220 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_220	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_NR_TxBW_ExtIEs_217[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct NR_TxBW_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_218,  memb_id_constraint_217 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct NR_TxBW_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_219,  memb_criticality_constraint_217 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct NR_TxBW_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_220,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_220,  memb_extensionValue_constraint_217 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_NR_TxBW_ExtIEs_tags_217[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_NR_TxBW_ExtIEs_tag2el_217[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_NR_TxBW_ExtIEs_specs_217 = {
-	sizeof(struct NR_TxBW_ExtIEs),
-	offsetof(struct NR_TxBW_ExtIEs, _asn_ctx),
-	asn_MAP_NR_TxBW_ExtIEs_tag2el_217,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_NR_TxBW_ExtIEs = {
-	"NR-TxBW-ExtIEs",
-	"NR-TxBW-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_NR_TxBW_ExtIEs_tags_217,
-	sizeof(asn_DEF_NR_TxBW_ExtIEs_tags_217)
-		/sizeof(asn_DEF_NR_TxBW_ExtIEs_tags_217[0]), /* 1 */
-	asn_DEF_NR_TxBW_ExtIEs_tags_217,	/* Same as above */
-	sizeof(asn_DEF_NR_TxBW_ExtIEs_tags_217)
-		/sizeof(asn_DEF_NR_TxBW_ExtIEs_tags_217[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_NR_TxBW_ExtIEs_217,
-	3,	/* Elements count */
-	&asn_SPC_NR_TxBW_ExtIEs_specs_217	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_224 = {
-	sizeof(struct PRACH_Configuration_ExtIEs__extensionValue),
-	offsetof(struct PRACH_Configuration_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct PRACH_Configuration_ExtIEs__extensionValue, present),
-	sizeof(((struct PRACH_Configuration_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_224 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_224	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_PRACH_Configuration_ExtIEs_221[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct PRACH_Configuration_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_222,  memb_id_constraint_221 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct PRACH_Configuration_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_223,  memb_criticality_constraint_221 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct PRACH_Configuration_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_224,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_224,  memb_extensionValue_constraint_221 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_PRACH_Configuration_ExtIEs_tags_221[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_PRACH_Configuration_ExtIEs_tag2el_221[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_PRACH_Configuration_ExtIEs_specs_221 = {
-	sizeof(struct PRACH_Configuration_ExtIEs),
-	offsetof(struct PRACH_Configuration_ExtIEs, _asn_ctx),
-	asn_MAP_PRACH_Configuration_ExtIEs_tag2el_221,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_PRACH_Configuration_ExtIEs = {
-	"PRACH-Configuration-ExtIEs",
-	"PRACH-Configuration-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_PRACH_Configuration_ExtIEs_tags_221,
-	sizeof(asn_DEF_PRACH_Configuration_ExtIEs_tags_221)
-		/sizeof(asn_DEF_PRACH_Configuration_ExtIEs_tags_221[0]), /* 1 */
-	asn_DEF_PRACH_Configuration_ExtIEs_tags_221,	/* Same as above */
-	sizeof(asn_DEF_PRACH_Configuration_ExtIEs_tags_221)
-		/sizeof(asn_DEF_PRACH_Configuration_ExtIEs_tags_221[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_PRACH_Configuration_ExtIEs_221,
-	3,	/* Elements count */
-	&asn_SPC_PRACH_Configuration_ExtIEs_specs_221	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_228 = {
-	sizeof(struct ProtectedEUTRAResourceIndication_ExtIEs__extensionValue),
-	offsetof(struct ProtectedEUTRAResourceIndication_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ProtectedEUTRAResourceIndication_ExtIEs__extensionValue, present),
-	sizeof(((struct ProtectedEUTRAResourceIndication_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_228 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_228	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtectedEUTRAResourceIndication_ExtIEs_225[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedEUTRAResourceIndication_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_226,  memb_id_constraint_225 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedEUTRAResourceIndication_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_227,  memb_criticality_constraint_225 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ProtectedEUTRAResourceIndication_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_228,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_228,  memb_extensionValue_constraint_225 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs_tags_225[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ProtectedEUTRAResourceIndication_ExtIEs_tag2el_225[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ProtectedEUTRAResourceIndication_ExtIEs_specs_225 = {
-	sizeof(struct ProtectedEUTRAResourceIndication_ExtIEs),
-	offsetof(struct ProtectedEUTRAResourceIndication_ExtIEs, _asn_ctx),
-	asn_MAP_ProtectedEUTRAResourceIndication_ExtIEs_tag2el_225,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs = {
-	"ProtectedEUTRAResourceIndication-ExtIEs",
-	"ProtectedEUTRAResourceIndication-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs_tags_225,
-	sizeof(asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs_tags_225)
-		/sizeof(asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs_tags_225[0]), /* 1 */
-	asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs_tags_225,	/* Same as above */
-	sizeof(asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs_tags_225)
-		/sizeof(asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs_tags_225[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ProtectedEUTRAResourceIndication_ExtIEs_225,
-	3,	/* Elements count */
-	&asn_SPC_ProtectedEUTRAResourceIndication_ExtIEs_specs_225	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_232 = {
-	sizeof(struct ProtectedFootprintTimePattern_ExtIEs__extensionValue),
-	offsetof(struct ProtectedFootprintTimePattern_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ProtectedFootprintTimePattern_ExtIEs__extensionValue, present),
-	sizeof(((struct ProtectedFootprintTimePattern_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_232 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_232	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtectedFootprintTimePattern_ExtIEs_229[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedFootprintTimePattern_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_230,  memb_id_constraint_229 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedFootprintTimePattern_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_231,  memb_criticality_constraint_229 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ProtectedFootprintTimePattern_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_232,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_232,  memb_extensionValue_constraint_229 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtectedFootprintTimePattern_ExtIEs_tags_229[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ProtectedFootprintTimePattern_ExtIEs_tag2el_229[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ProtectedFootprintTimePattern_ExtIEs_specs_229 = {
-	sizeof(struct ProtectedFootprintTimePattern_ExtIEs),
-	offsetof(struct ProtectedFootprintTimePattern_ExtIEs, _asn_ctx),
-	asn_MAP_ProtectedFootprintTimePattern_ExtIEs_tag2el_229,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtectedFootprintTimePattern_ExtIEs = {
-	"ProtectedFootprintTimePattern-ExtIEs",
-	"ProtectedFootprintTimePattern-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtectedFootprintTimePattern_ExtIEs_tags_229,
-	sizeof(asn_DEF_ProtectedFootprintTimePattern_ExtIEs_tags_229)
-		/sizeof(asn_DEF_ProtectedFootprintTimePattern_ExtIEs_tags_229[0]), /* 1 */
-	asn_DEF_ProtectedFootprintTimePattern_ExtIEs_tags_229,	/* Same as above */
-	sizeof(asn_DEF_ProtectedFootprintTimePattern_ExtIEs_tags_229)
-		/sizeof(asn_DEF_ProtectedFootprintTimePattern_ExtIEs_tags_229[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ProtectedFootprintTimePattern_ExtIEs_229,
-	3,	/* Elements count */
-	&asn_SPC_ProtectedFootprintTimePattern_ExtIEs_specs_229	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_236 = {
-	sizeof(struct ProtectedResourceList_Item_ExtIEs__extensionValue),
-	offsetof(struct ProtectedResourceList_Item_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ProtectedResourceList_Item_ExtIEs__extensionValue, present),
-	sizeof(((struct ProtectedResourceList_Item_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_236 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_236	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtectedResourceList_Item_ExtIEs_233[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedResourceList_Item_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_234,  memb_id_constraint_233 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedResourceList_Item_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_235,  memb_criticality_constraint_233 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ProtectedResourceList_Item_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_236,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_236,  memb_extensionValue_constraint_233 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtectedResourceList_Item_ExtIEs_tags_233[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ProtectedResourceList_Item_ExtIEs_tag2el_233[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ProtectedResourceList_Item_ExtIEs_specs_233 = {
-	sizeof(struct ProtectedResourceList_Item_ExtIEs),
-	offsetof(struct ProtectedResourceList_Item_ExtIEs, _asn_ctx),
-	asn_MAP_ProtectedResourceList_Item_ExtIEs_tag2el_233,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtectedResourceList_Item_ExtIEs = {
-	"ProtectedResourceList-Item-ExtIEs",
-	"ProtectedResourceList-Item-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtectedResourceList_Item_ExtIEs_tags_233,
-	sizeof(asn_DEF_ProtectedResourceList_Item_ExtIEs_tags_233)
-		/sizeof(asn_DEF_ProtectedResourceList_Item_ExtIEs_tags_233[0]), /* 1 */
-	asn_DEF_ProtectedResourceList_Item_ExtIEs_tags_233,	/* Same as above */
-	sizeof(asn_DEF_ProtectedResourceList_Item_ExtIEs_tags_233)
-		/sizeof(asn_DEF_ProtectedResourceList_Item_ExtIEs_tags_233[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ProtectedResourceList_Item_ExtIEs_233,
-	3,	/* Elements count */
-	&asn_SPC_ProtectedResourceList_Item_ExtIEs_specs_233	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_extensionValue_240[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus_ExtIEs__extensionValue, choice.DL_scheduling_PDCCH_CCE_usage),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_DL_scheduling_PDCCH_CCE_usage,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"DL-scheduling-PDCCH-CCE-usage"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus_ExtIEs__extensionValue, choice.UL_scheduling_PDCCH_CCE_usage),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_UL_scheduling_PDCCH_CCE_usage,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"UL-scheduling-PDCCH-CCE-usage"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_240[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 1 }, /* DL-scheduling-PDCCH-CCE-usage */
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, -1, 0 } /* UL-scheduling-PDCCH-CCE-usage */
-};
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_240 = {
-	sizeof(struct RadioResourceStatus_ExtIEs__extensionValue),
-	offsetof(struct RadioResourceStatus_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct RadioResourceStatus_ExtIEs__extensionValue, present),
-	sizeof(((struct RadioResourceStatus_ExtIEs__extensionValue *)0)->present),
-	asn_MAP_extensionValue_tag2el_240,
-	2,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_240 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_extensionValue_240,
-	2,	/* Elements count */
-	&asn_SPC_extensionValue_specs_240	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RadioResourceStatus_ExtIEs_237[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_238,  memb_id_constraint_237 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RadioResourceStatus_ExtIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_239,  memb_criticality_constraint_237 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_240,
-		select_RadioResourceStatus_ExtIEs_extensionValue_type,
-		{ 0, &asn_PER_memb_extensionValue_constr_240,  memb_extensionValue_constraint_237 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RadioResourceStatus_ExtIEs_tags_237[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RadioResourceStatus_ExtIEs_tag2el_237[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RadioResourceStatus_ExtIEs_specs_237 = {
-	sizeof(struct RadioResourceStatus_ExtIEs),
-	offsetof(struct RadioResourceStatus_ExtIEs, _asn_ctx),
-	asn_MAP_RadioResourceStatus_ExtIEs_tag2el_237,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RadioResourceStatus_ExtIEs = {
-	"RadioResourceStatus-ExtIEs",
-	"RadioResourceStatus-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RadioResourceStatus_ExtIEs_tags_237,
-	sizeof(asn_DEF_RadioResourceStatus_ExtIEs_tags_237)
-		/sizeof(asn_DEF_RadioResourceStatus_ExtIEs_tags_237[0]), /* 1 */
-	asn_DEF_RadioResourceStatus_ExtIEs_tags_237,	/* Same as above */
-	sizeof(asn_DEF_RadioResourceStatus_ExtIEs_tags_237)
-		/sizeof(asn_DEF_RadioResourceStatus_ExtIEs_tags_237[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RadioResourceStatus_ExtIEs_237,
-	3,	/* Elements count */
-	&asn_SPC_RadioResourceStatus_ExtIEs_specs_237	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_extensionValue_244[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RelativeNarrowbandTxPower_ExtIEs__extensionValue, choice.EnhancedRNTP),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_EnhancedRNTP,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"EnhancedRNTP"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_244[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* EnhancedRNTP */
-};
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_244 = {
-	sizeof(struct RelativeNarrowbandTxPower_ExtIEs__extensionValue),
-	offsetof(struct RelativeNarrowbandTxPower_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct RelativeNarrowbandTxPower_ExtIEs__extensionValue, present),
-	sizeof(((struct RelativeNarrowbandTxPower_ExtIEs__extensionValue *)0)->present),
-	asn_MAP_extensionValue_tag2el_244,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_244 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_extensionValue_244,
-	1,	/* Elements count */
-	&asn_SPC_extensionValue_specs_244	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RelativeNarrowbandTxPower_ExtIEs_241[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RelativeNarrowbandTxPower_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_242,  memb_id_constraint_241 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RelativeNarrowbandTxPower_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RelativeNarrowbandTxPower_ExtIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_243,  memb_criticality_constraint_241 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RelativeNarrowbandTxPower_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_244,
-		select_RelativeNarrowbandTxPower_ExtIEs_extensionValue_type,
-		{ 0, &asn_PER_memb_extensionValue_constr_244,  memb_extensionValue_constraint_241 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RelativeNarrowbandTxPower_ExtIEs_tags_241[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RelativeNarrowbandTxPower_ExtIEs_tag2el_241[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RelativeNarrowbandTxPower_ExtIEs_specs_241 = {
-	sizeof(struct RelativeNarrowbandTxPower_ExtIEs),
-	offsetof(struct RelativeNarrowbandTxPower_ExtIEs, _asn_ctx),
-	asn_MAP_RelativeNarrowbandTxPower_ExtIEs_tag2el_241,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RelativeNarrowbandTxPower_ExtIEs = {
-	"RelativeNarrowbandTxPower-ExtIEs",
-	"RelativeNarrowbandTxPower-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RelativeNarrowbandTxPower_ExtIEs_tags_241,
-	sizeof(asn_DEF_RelativeNarrowbandTxPower_ExtIEs_tags_241)
-		/sizeof(asn_DEF_RelativeNarrowbandTxPower_ExtIEs_tags_241[0]), /* 1 */
-	asn_DEF_RelativeNarrowbandTxPower_ExtIEs_tags_241,	/* Same as above */
-	sizeof(asn_DEF_RelativeNarrowbandTxPower_ExtIEs_tags_241)
-		/sizeof(asn_DEF_RelativeNarrowbandTxPower_ExtIEs_tags_241[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RelativeNarrowbandTxPower_ExtIEs_241,
-	3,	/* Elements count */
-	&asn_SPC_RelativeNarrowbandTxPower_ExtIEs_specs_241	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_248 = {
-	sizeof(struct RSRPMeasurementResult_ExtIEs__extensionValue),
-	offsetof(struct RSRPMeasurementResult_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct RSRPMeasurementResult_ExtIEs__extensionValue, present),
-	sizeof(((struct RSRPMeasurementResult_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_248 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_248	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RSRPMeasurementResult_ExtIEs_245[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RSRPMeasurementResult_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_246,  memb_id_constraint_245 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RSRPMeasurementResult_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_247,  memb_criticality_constraint_245 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RSRPMeasurementResult_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_248,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_248,  memb_extensionValue_constraint_245 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RSRPMeasurementResult_ExtIEs_tags_245[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RSRPMeasurementResult_ExtIEs_tag2el_245[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RSRPMeasurementResult_ExtIEs_specs_245 = {
-	sizeof(struct RSRPMeasurementResult_ExtIEs),
-	offsetof(struct RSRPMeasurementResult_ExtIEs, _asn_ctx),
-	asn_MAP_RSRPMeasurementResult_ExtIEs_tag2el_245,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RSRPMeasurementResult_ExtIEs = {
-	"RSRPMeasurementResult-ExtIEs",
-	"RSRPMeasurementResult-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RSRPMeasurementResult_ExtIEs_tags_245,
-	sizeof(asn_DEF_RSRPMeasurementResult_ExtIEs_tags_245)
-		/sizeof(asn_DEF_RSRPMeasurementResult_ExtIEs_tags_245[0]), /* 1 */
-	asn_DEF_RSRPMeasurementResult_ExtIEs_tags_245,	/* Same as above */
-	sizeof(asn_DEF_RSRPMeasurementResult_ExtIEs_tags_245)
-		/sizeof(asn_DEF_RSRPMeasurementResult_ExtIEs_tags_245[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RSRPMeasurementResult_ExtIEs_245,
-	3,	/* Elements count */
-	&asn_SPC_RSRPMeasurementResult_ExtIEs_specs_245	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_extensionValue_252[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RSRPMRList_ExtIEs__extensionValue, choice.UEID),
-		(ASN_TAG_CLASS_UNIVERSAL | (3 << 2)),
-		0,
-		&asn_DEF_UEID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"UEID"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_252[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 } /* UEID */
-};
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_252 = {
-	sizeof(struct RSRPMRList_ExtIEs__extensionValue),
-	offsetof(struct RSRPMRList_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct RSRPMRList_ExtIEs__extensionValue, present),
-	sizeof(((struct RSRPMRList_ExtIEs__extensionValue *)0)->present),
-	asn_MAP_extensionValue_tag2el_252,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_252 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_extensionValue_252,
-	1,	/* Elements count */
-	&asn_SPC_extensionValue_specs_252	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RSRPMRList_ExtIEs_249[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RSRPMRList_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_250,  memb_id_constraint_249 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RSRPMRList_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RSRPMRList_ExtIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_251,  memb_criticality_constraint_249 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RSRPMRList_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_252,
-		select_RSRPMRList_ExtIEs_extensionValue_type,
-		{ 0, &asn_PER_memb_extensionValue_constr_252,  memb_extensionValue_constraint_249 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RSRPMRList_ExtIEs_tags_249[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RSRPMRList_ExtIEs_tag2el_249[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RSRPMRList_ExtIEs_specs_249 = {
-	sizeof(struct RSRPMRList_ExtIEs),
-	offsetof(struct RSRPMRList_ExtIEs, _asn_ctx),
-	asn_MAP_RSRPMRList_ExtIEs_tag2el_249,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RSRPMRList_ExtIEs = {
-	"RSRPMRList-ExtIEs",
-	"RSRPMRList-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RSRPMRList_ExtIEs_tags_249,
-	sizeof(asn_DEF_RSRPMRList_ExtIEs_tags_249)
-		/sizeof(asn_DEF_RSRPMRList_ExtIEs_tags_249[0]), /* 1 */
-	asn_DEF_RSRPMRList_ExtIEs_tags_249,	/* Same as above */
-	sizeof(asn_DEF_RSRPMRList_ExtIEs_tags_249)
-		/sizeof(asn_DEF_RSRPMRList_ExtIEs_tags_249[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RSRPMRList_ExtIEs_249,
-	3,	/* Elements count */
-	&asn_SPC_RSRPMRList_ExtIEs_specs_249	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_256 = {
-	sizeof(struct S1TNLLoadIndicator_ExtIEs__extensionValue),
-	offsetof(struct S1TNLLoadIndicator_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct S1TNLLoadIndicator_ExtIEs__extensionValue, present),
-	sizeof(((struct S1TNLLoadIndicator_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_256 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_256	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_S1TNLLoadIndicator_ExtIEs_253[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct S1TNLLoadIndicator_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_254,  memb_id_constraint_253 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct S1TNLLoadIndicator_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_255,  memb_criticality_constraint_253 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct S1TNLLoadIndicator_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_256,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_256,  memb_extensionValue_constraint_253 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_S1TNLLoadIndicator_ExtIEs_tags_253[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_S1TNLLoadIndicator_ExtIEs_tag2el_253[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_S1TNLLoadIndicator_ExtIEs_specs_253 = {
-	sizeof(struct S1TNLLoadIndicator_ExtIEs),
-	offsetof(struct S1TNLLoadIndicator_ExtIEs, _asn_ctx),
-	asn_MAP_S1TNLLoadIndicator_ExtIEs_tag2el_253,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_S1TNLLoadIndicator_ExtIEs = {
-	"S1TNLLoadIndicator-ExtIEs",
-	"S1TNLLoadIndicator-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_S1TNLLoadIndicator_ExtIEs_tags_253,
-	sizeof(asn_DEF_S1TNLLoadIndicator_ExtIEs_tags_253)
-		/sizeof(asn_DEF_S1TNLLoadIndicator_ExtIEs_tags_253[0]), /* 1 */
-	asn_DEF_S1TNLLoadIndicator_ExtIEs_tags_253,	/* Same as above */
-	sizeof(asn_DEF_S1TNLLoadIndicator_ExtIEs_tags_253)
-		/sizeof(asn_DEF_S1TNLLoadIndicator_ExtIEs_tags_253[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_S1TNLLoadIndicator_ExtIEs_253,
-	3,	/* Elements count */
-	&asn_SPC_S1TNLLoadIndicator_ExtIEs_specs_253	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_260 = {
-	sizeof(struct ServedCell_ExtIEs__extensionValue),
-	offsetof(struct ServedCell_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ServedCell_ExtIEs__extensionValue, present),
-	sizeof(((struct ServedCell_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_260 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_260	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ServedCell_ExtIEs_257[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_258,  memb_id_constraint_257 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_259,  memb_criticality_constraint_257 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ServedCell_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_260,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_260,  memb_extensionValue_constraint_257 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ServedCell_ExtIEs_tags_257[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ServedCell_ExtIEs_tag2el_257[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ServedCell_ExtIEs_specs_257 = {
-	sizeof(struct ServedCell_ExtIEs),
-	offsetof(struct ServedCell_ExtIEs, _asn_ctx),
-	asn_MAP_ServedCell_ExtIEs_tag2el_257,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedCell_ExtIEs = {
-	"ServedCell-ExtIEs",
-	"ServedCell-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ServedCell_ExtIEs_tags_257,
-	sizeof(asn_DEF_ServedCell_ExtIEs_tags_257)
-		/sizeof(asn_DEF_ServedCell_ExtIEs_tags_257[0]), /* 1 */
-	asn_DEF_ServedCell_ExtIEs_tags_257,	/* Same as above */
-	sizeof(asn_DEF_ServedCell_ExtIEs_tags_257)
-		/sizeof(asn_DEF_ServedCell_ExtIEs_tags_257[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ServedCell_ExtIEs_257,
-	3,	/* Elements count */
-	&asn_SPC_ServedCell_ExtIEs_specs_257	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_extensionValue_264[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.Number_of_Antennaports),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_Number_of_Antennaports,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"Number-of-Antennaports"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.PRACH_Configuration),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_PRACH_Configuration,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"PRACH-Configuration"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.MBSFN_Subframe_Infolist),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_MBSFN_Subframe_Infolist,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"MBSFN-Subframe-Infolist"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.CSG_Id),
-		(ASN_TAG_CLASS_UNIVERSAL | (3 << 2)),
-		0,
-		&asn_DEF_CSG_Id,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CSG-Id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.MBMS_Service_Area_Identity_List),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_MBMS_Service_Area_Identity_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"MBMS-Service-Area-Identity-List"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.MultibandInfoList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_MultibandInfoList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"MultibandInfoList"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.FreqBandIndicatorPriority),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_FreqBandIndicatorPriority,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"FreqBandIndicatorPriority"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.BandwidthReducedSI),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_BandwidthReducedSI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"BandwidthReducedSI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.ProtectedEUTRAResourceIndication),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtectedEUTRAResourceIndication,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ProtectedEUTRAResourceIndication"
-		},
-};
-static const unsigned asn_MAP_extensionValue_to_canonical_264[] = { 3, 0, 6, 7, 1, 2, 4, 5, 8 };
-static const unsigned asn_MAP_extensionValue_from_canonical_264[] = { 1, 4, 5, 0, 6, 7, 2, 3, 8 };
-static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_264[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 3, 0, 0 }, /* CSG-Id */
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, 0, 2 }, /* Number-of-Antennaports */
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 6, -1, 1 }, /* FreqBandIndicatorPriority */
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 7, -2, 0 }, /* BandwidthReducedSI */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 4 }, /* PRACH-Configuration */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 3 }, /* MBSFN-Subframe-Infolist */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -2, 2 }, /* MBMS-Service-Area-Identity-List */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 5, -3, 1 }, /* MultibandInfoList */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 8, -4, 0 } /* ProtectedEUTRAResourceIndication */
-};
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_264 = {
-	sizeof(struct ServedCell_Information_ExtIEs__extensionValue),
-	offsetof(struct ServedCell_Information_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct ServedCell_Information_ExtIEs__extensionValue, present),
-	sizeof(((struct ServedCell_Information_ExtIEs__extensionValue *)0)->present),
-	asn_MAP_extensionValue_tag2el_264,
-	9,	/* Count of tags in the map */
-	asn_MAP_extensionValue_to_canonical_264,
-	asn_MAP_extensionValue_from_canonical_264,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_264 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_extensionValue_264,
-	9,	/* Elements count */
-	&asn_SPC_extensionValue_specs_264	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ServedCell_Information_ExtIEs_261[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_262,  memb_id_constraint_261 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ServedCell_Information_ExtIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_263,  memb_criticality_constraint_261 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_264,
-		select_ServedCell_Information_ExtIEs_extensionValue_type,
-		{ 0, &asn_PER_memb_extensionValue_constr_264,  memb_extensionValue_constraint_261 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ServedCell_Information_ExtIEs_tags_261[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ServedCell_Information_ExtIEs_tag2el_261[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ServedCell_Information_ExtIEs_specs_261 = {
-	sizeof(struct ServedCell_Information_ExtIEs),
-	offsetof(struct ServedCell_Information_ExtIEs, _asn_ctx),
-	asn_MAP_ServedCell_Information_ExtIEs_tag2el_261,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedCell_Information_ExtIEs = {
-	"ServedCell-Information-ExtIEs",
-	"ServedCell-Information-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ServedCell_Information_ExtIEs_tags_261,
-	sizeof(asn_DEF_ServedCell_Information_ExtIEs_tags_261)
-		/sizeof(asn_DEF_ServedCell_Information_ExtIEs_tags_261[0]), /* 1 */
-	asn_DEF_ServedCell_Information_ExtIEs_tags_261,	/* Same as above */
-	sizeof(asn_DEF_ServedCell_Information_ExtIEs_tags_261)
-		/sizeof(asn_DEF_ServedCell_Information_ExtIEs_tags_261[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ServedCell_Information_ExtIEs_261,
-	3,	/* Elements count */
-	&asn_SPC_ServedCell_Information_ExtIEs_specs_261	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_268 = {
-	sizeof(struct SpecialSubframe_Info_ExtIEs__extensionValue),
-	offsetof(struct SpecialSubframe_Info_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct SpecialSubframe_Info_ExtIEs__extensionValue, present),
-	sizeof(((struct SpecialSubframe_Info_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_268 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_268	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_SpecialSubframe_Info_ExtIEs_265[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SpecialSubframe_Info_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_266,  memb_id_constraint_265 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SpecialSubframe_Info_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_267,  memb_criticality_constraint_265 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct SpecialSubframe_Info_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_268,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_268,  memb_extensionValue_constraint_265 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_SpecialSubframe_Info_ExtIEs_tags_265[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_SpecialSubframe_Info_ExtIEs_tag2el_265[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_SpecialSubframe_Info_ExtIEs_specs_265 = {
-	sizeof(struct SpecialSubframe_Info_ExtIEs),
-	offsetof(struct SpecialSubframe_Info_ExtIEs, _asn_ctx),
-	asn_MAP_SpecialSubframe_Info_ExtIEs_tag2el_265,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_SpecialSubframe_Info_ExtIEs = {
-	"SpecialSubframe-Info-ExtIEs",
-	"SpecialSubframe-Info-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_SpecialSubframe_Info_ExtIEs_tags_265,
-	sizeof(asn_DEF_SpecialSubframe_Info_ExtIEs_tags_265)
-		/sizeof(asn_DEF_SpecialSubframe_Info_ExtIEs_tags_265[0]), /* 1 */
-	asn_DEF_SpecialSubframe_Info_ExtIEs_tags_265,	/* Same as above */
-	sizeof(asn_DEF_SpecialSubframe_Info_ExtIEs_tags_265)
-		/sizeof(asn_DEF_SpecialSubframe_Info_ExtIEs_tags_265[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_SpecialSubframe_Info_ExtIEs_265,
-	3,	/* Elements count */
-	&asn_SPC_SpecialSubframe_Info_ExtIEs_specs_265	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_272 = {
-	sizeof(struct SubbandCQI_ExtIEs__extensionValue),
-	offsetof(struct SubbandCQI_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct SubbandCQI_ExtIEs__extensionValue, present),
-	sizeof(((struct SubbandCQI_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_272 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_272	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_SubbandCQI_ExtIEs_269[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQI_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_270,  memb_id_constraint_269 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQI_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_271,  memb_criticality_constraint_269 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct SubbandCQI_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_272,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_272,  memb_extensionValue_constraint_269 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_SubbandCQI_ExtIEs_tags_269[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_SubbandCQI_ExtIEs_tag2el_269[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_SubbandCQI_ExtIEs_specs_269 = {
-	sizeof(struct SubbandCQI_ExtIEs),
-	offsetof(struct SubbandCQI_ExtIEs, _asn_ctx),
-	asn_MAP_SubbandCQI_ExtIEs_tag2el_269,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_SubbandCQI_ExtIEs = {
-	"SubbandCQI-ExtIEs",
-	"SubbandCQI-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_SubbandCQI_ExtIEs_tags_269,
-	sizeof(asn_DEF_SubbandCQI_ExtIEs_tags_269)
-		/sizeof(asn_DEF_SubbandCQI_ExtIEs_tags_269[0]), /* 1 */
-	asn_DEF_SubbandCQI_ExtIEs_tags_269,	/* Same as above */
-	sizeof(asn_DEF_SubbandCQI_ExtIEs_tags_269)
-		/sizeof(asn_DEF_SubbandCQI_ExtIEs_tags_269[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_SubbandCQI_ExtIEs_269,
-	3,	/* Elements count */
-	&asn_SPC_SubbandCQI_ExtIEs_specs_269	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_276 = {
-	sizeof(struct SubbandCQIItem_ExtIEs__extensionValue),
-	offsetof(struct SubbandCQIItem_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct SubbandCQIItem_ExtIEs__extensionValue, present),
-	sizeof(((struct SubbandCQIItem_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_276 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_276	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_SubbandCQIItem_ExtIEs_273[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQIItem_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_274,  memb_id_constraint_273 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQIItem_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_275,  memb_criticality_constraint_273 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct SubbandCQIItem_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_276,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_276,  memb_extensionValue_constraint_273 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_SubbandCQIItem_ExtIEs_tags_273[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_SubbandCQIItem_ExtIEs_tag2el_273[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_SubbandCQIItem_ExtIEs_specs_273 = {
-	sizeof(struct SubbandCQIItem_ExtIEs),
-	offsetof(struct SubbandCQIItem_ExtIEs, _asn_ctx),
-	asn_MAP_SubbandCQIItem_ExtIEs_tag2el_273,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_SubbandCQIItem_ExtIEs = {
-	"SubbandCQIItem-ExtIEs",
-	"SubbandCQIItem-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_SubbandCQIItem_ExtIEs_tags_273,
-	sizeof(asn_DEF_SubbandCQIItem_ExtIEs_tags_273)
-		/sizeof(asn_DEF_SubbandCQIItem_ExtIEs_tags_273[0]), /* 1 */
-	asn_DEF_SubbandCQIItem_ExtIEs_tags_273,	/* Same as above */
-	sizeof(asn_DEF_SubbandCQIItem_ExtIEs_tags_273)
-		/sizeof(asn_DEF_SubbandCQIItem_ExtIEs_tags_273[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_SubbandCQIItem_ExtIEs_273,
-	3,	/* Elements count */
-	&asn_SPC_SubbandCQIItem_ExtIEs_specs_273	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_280 = {
-	sizeof(struct SULInformation_ExtIEs__extensionValue),
-	offsetof(struct SULInformation_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct SULInformation_ExtIEs__extensionValue, present),
-	sizeof(((struct SULInformation_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_280 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_280	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_SULInformation_ExtIEs_277[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SULInformation_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_278,  memb_id_constraint_277 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SULInformation_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_279,  memb_criticality_constraint_277 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct SULInformation_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_280,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_280,  memb_extensionValue_constraint_277 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_SULInformation_ExtIEs_tags_277[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_SULInformation_ExtIEs_tag2el_277[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_SULInformation_ExtIEs_specs_277 = {
-	sizeof(struct SULInformation_ExtIEs),
-	offsetof(struct SULInformation_ExtIEs, _asn_ctx),
-	asn_MAP_SULInformation_ExtIEs_tag2el_277,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_SULInformation_ExtIEs = {
-	"SULInformation-ExtIEs",
-	"SULInformation-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_SULInformation_ExtIEs_tags_277,
-	sizeof(asn_DEF_SULInformation_ExtIEs_tags_277)
-		/sizeof(asn_DEF_SULInformation_ExtIEs_tags_277[0]), /* 1 */
-	asn_DEF_SULInformation_ExtIEs_tags_277,	/* Same as above */
-	sizeof(asn_DEF_SULInformation_ExtIEs_tags_277)
-		/sizeof(asn_DEF_SULInformation_ExtIEs_tags_277[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_SULInformation_ExtIEs_277,
-	3,	/* Elements count */
-	&asn_SPC_SULInformation_ExtIEs_specs_277	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_284 = {
-	sizeof(struct SupportedSULFreqBandItem_ExtIEs__extensionValue),
-	offsetof(struct SupportedSULFreqBandItem_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct SupportedSULFreqBandItem_ExtIEs__extensionValue, present),
-	sizeof(((struct SupportedSULFreqBandItem_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_284 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_284	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_SupportedSULFreqBandItem_ExtIEs_281[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SupportedSULFreqBandItem_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_282,  memb_id_constraint_281 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SupportedSULFreqBandItem_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_283,  memb_criticality_constraint_281 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct SupportedSULFreqBandItem_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_284,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_284,  memb_extensionValue_constraint_281 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_SupportedSULFreqBandItem_ExtIEs_tags_281[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_SupportedSULFreqBandItem_ExtIEs_tag2el_281[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_SupportedSULFreqBandItem_ExtIEs_specs_281 = {
-	sizeof(struct SupportedSULFreqBandItem_ExtIEs),
-	offsetof(struct SupportedSULFreqBandItem_ExtIEs, _asn_ctx),
-	asn_MAP_SupportedSULFreqBandItem_ExtIEs_tag2el_281,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_SupportedSULFreqBandItem_ExtIEs = {
-	"SupportedSULFreqBandItem-ExtIEs",
-	"SupportedSULFreqBandItem-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_SupportedSULFreqBandItem_ExtIEs_tags_281,
-	sizeof(asn_DEF_SupportedSULFreqBandItem_ExtIEs_tags_281)
-		/sizeof(asn_DEF_SupportedSULFreqBandItem_ExtIEs_tags_281[0]), /* 1 */
-	asn_DEF_SupportedSULFreqBandItem_ExtIEs_tags_281,	/* Same as above */
-	sizeof(asn_DEF_SupportedSULFreqBandItem_ExtIEs_tags_281)
-		/sizeof(asn_DEF_SupportedSULFreqBandItem_ExtIEs_tags_281[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_SupportedSULFreqBandItem_ExtIEs_281,
-	3,	/* Elements count */
-	&asn_SPC_SupportedSULFreqBandItem_ExtIEs_specs_281	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_extensionValue_288[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_Info_ExtIEs__extensionValue, choice.AdditionalSpecialSubframe_Info),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_AdditionalSpecialSubframe_Info,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"AdditionalSpecialSubframe-Info"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_Info_ExtIEs__extensionValue, choice.EARFCNExtension),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_EARFCNExtension,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"EARFCNExtension"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_Info_ExtIEs__extensionValue, choice.AdditionalSpecialSubframeExtension_Info),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_AdditionalSpecialSubframeExtension_Info,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"AdditionalSpecialSubframeExtension-Info"
-		},
-};
-static const unsigned asn_MAP_extensionValue_to_canonical_288[] = { 1, 0, 2 };
-static const unsigned asn_MAP_extensionValue_from_canonical_288[] = { 1, 0, 2 };
-static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_288[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* EARFCNExtension */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* AdditionalSpecialSubframe-Info */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 } /* AdditionalSpecialSubframeExtension-Info */
-};
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_288 = {
-	sizeof(struct TDD_Info_ExtIEs__extensionValue),
-	offsetof(struct TDD_Info_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct TDD_Info_ExtIEs__extensionValue, present),
-	sizeof(((struct TDD_Info_ExtIEs__extensionValue *)0)->present),
-	asn_MAP_extensionValue_tag2el_288,
-	3,	/* Count of tags in the map */
-	asn_MAP_extensionValue_to_canonical_288,
-	asn_MAP_extensionValue_from_canonical_288,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_288 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_extensionValue_288,
-	3,	/* Elements count */
-	&asn_SPC_extensionValue_specs_288	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_TDD_Info_ExtIEs_285[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_Info_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_286,  memb_id_constraint_285 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_Info_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_TDD_Info_ExtIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_287,  memb_criticality_constraint_285 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct TDD_Info_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_288,
-		select_TDD_Info_ExtIEs_extensionValue_type,
-		{ 0, &asn_PER_memb_extensionValue_constr_288,  memb_extensionValue_constraint_285 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_TDD_Info_ExtIEs_tags_285[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_TDD_Info_ExtIEs_tag2el_285[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_TDD_Info_ExtIEs_specs_285 = {
-	sizeof(struct TDD_Info_ExtIEs),
-	offsetof(struct TDD_Info_ExtIEs, _asn_ctx),
-	asn_MAP_TDD_Info_ExtIEs_tag2el_285,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_TDD_Info_ExtIEs = {
-	"TDD-Info-ExtIEs",
-	"TDD-Info-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_TDD_Info_ExtIEs_tags_285,
-	sizeof(asn_DEF_TDD_Info_ExtIEs_tags_285)
-		/sizeof(asn_DEF_TDD_Info_ExtIEs_tags_285[0]), /* 1 */
-	asn_DEF_TDD_Info_ExtIEs_tags_285,	/* Same as above */
-	sizeof(asn_DEF_TDD_Info_ExtIEs_tags_285)
-		/sizeof(asn_DEF_TDD_Info_ExtIEs_tags_285[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_TDD_Info_ExtIEs_285,
-	3,	/* Elements count */
-	&asn_SPC_TDD_Info_ExtIEs_specs_285	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_292 = {
-	sizeof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs__extensionValue),
-	offsetof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs__extensionValue, present),
-	sizeof(((struct UL_HighInterferenceIndicationInfo_Item_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_292 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_292	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_UL_HighInterferenceIndicationInfo_Item_ExtIEs_289[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_290,  memb_id_constraint_289 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_291,  memb_criticality_constraint_289 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_292,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_292,  memb_extensionValue_constraint_289 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tags_289[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tag2el_289[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_UL_HighInterferenceIndicationInfo_Item_ExtIEs_specs_289 = {
-	sizeof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs),
-	offsetof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs, _asn_ctx),
-	asn_MAP_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tag2el_289,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs = {
-	"UL-HighInterferenceIndicationInfo-Item-ExtIEs",
-	"UL-HighInterferenceIndicationInfo-Item-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tags_289,
-	sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tags_289)
-		/sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tags_289[0]), /* 1 */
-	asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tags_289,	/* Same as above */
-	sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tags_289)
-		/sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tags_289[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_UL_HighInterferenceIndicationInfo_Item_ExtIEs_289,
-	3,	/* Elements count */
-	&asn_SPC_UL_HighInterferenceIndicationInfo_Item_ExtIEs_specs_289	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_296 = {
-	sizeof(struct UsableABSInformationFDD_ExtIEs__extensionValue),
-	offsetof(struct UsableABSInformationFDD_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct UsableABSInformationFDD_ExtIEs__extensionValue, present),
-	sizeof(((struct UsableABSInformationFDD_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_296 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_296	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_UsableABSInformationFDD_ExtIEs_293[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct UsableABSInformationFDD_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_294,  memb_id_constraint_293 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct UsableABSInformationFDD_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_295,  memb_criticality_constraint_293 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct UsableABSInformationFDD_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_296,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_296,  memb_extensionValue_constraint_293 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_UsableABSInformationFDD_ExtIEs_tags_293[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_UsableABSInformationFDD_ExtIEs_tag2el_293[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_UsableABSInformationFDD_ExtIEs_specs_293 = {
-	sizeof(struct UsableABSInformationFDD_ExtIEs),
-	offsetof(struct UsableABSInformationFDD_ExtIEs, _asn_ctx),
-	asn_MAP_UsableABSInformationFDD_ExtIEs_tag2el_293,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_UsableABSInformationFDD_ExtIEs = {
-	"UsableABSInformationFDD-ExtIEs",
-	"UsableABSInformationFDD-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_UsableABSInformationFDD_ExtIEs_tags_293,
-	sizeof(asn_DEF_UsableABSInformationFDD_ExtIEs_tags_293)
-		/sizeof(asn_DEF_UsableABSInformationFDD_ExtIEs_tags_293[0]), /* 1 */
-	asn_DEF_UsableABSInformationFDD_ExtIEs_tags_293,	/* Same as above */
-	sizeof(asn_DEF_UsableABSInformationFDD_ExtIEs_tags_293)
-		/sizeof(asn_DEF_UsableABSInformationFDD_ExtIEs_tags_293[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_UsableABSInformationFDD_ExtIEs_293,
-	3,	/* Elements count */
-	&asn_SPC_UsableABSInformationFDD_ExtIEs_specs_293	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_300 = {
-	sizeof(struct UsableABSInformationTDD_ExtIEs__extensionValue),
-	offsetof(struct UsableABSInformationTDD_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct UsableABSInformationTDD_ExtIEs__extensionValue, present),
-	sizeof(((struct UsableABSInformationTDD_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_300 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_300	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_UsableABSInformationTDD_ExtIEs_297[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct UsableABSInformationTDD_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_298,  memb_id_constraint_297 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct UsableABSInformationTDD_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_299,  memb_criticality_constraint_297 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct UsableABSInformationTDD_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_300,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_300,  memb_extensionValue_constraint_297 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_UsableABSInformationTDD_ExtIEs_tags_297[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_UsableABSInformationTDD_ExtIEs_tag2el_297[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_UsableABSInformationTDD_ExtIEs_specs_297 = {
-	sizeof(struct UsableABSInformationTDD_ExtIEs),
-	offsetof(struct UsableABSInformationTDD_ExtIEs, _asn_ctx),
-	asn_MAP_UsableABSInformationTDD_ExtIEs_tag2el_297,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_UsableABSInformationTDD_ExtIEs = {
-	"UsableABSInformationTDD-ExtIEs",
-	"UsableABSInformationTDD-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_UsableABSInformationTDD_ExtIEs_tags_297,
-	sizeof(asn_DEF_UsableABSInformationTDD_ExtIEs_tags_297)
-		/sizeof(asn_DEF_UsableABSInformationTDD_ExtIEs_tags_297[0]), /* 1 */
-	asn_DEF_UsableABSInformationTDD_ExtIEs_tags_297,	/* Same as above */
-	sizeof(asn_DEF_UsableABSInformationTDD_ExtIEs_tags_297)
-		/sizeof(asn_DEF_UsableABSInformationTDD_ExtIEs_tags_297[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_UsableABSInformationTDD_ExtIEs_297,
-	3,	/* Elements count */
-	&asn_SPC_UsableABSInformationTDD_ExtIEs_specs_297	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_304 = {
-	sizeof(struct WidebandCQI_ExtIEs__extensionValue),
-	offsetof(struct WidebandCQI_ExtIEs__extensionValue, _asn_ctx),
-	offsetof(struct WidebandCQI_ExtIEs__extensionValue, present),
-	sizeof(((struct WidebandCQI_ExtIEs__extensionValue *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_extensionValue_304 = {
-	"extensionValue",
-	"extensionValue",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_extensionValue_specs_304	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_WidebandCQI_ExtIEs_301[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct WidebandCQI_ExtIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_302,  memb_id_constraint_301 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct WidebandCQI_ExtIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_303,  memb_criticality_constraint_301 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct WidebandCQI_ExtIEs, extensionValue),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_extensionValue_304,
-		0,
-		{ 0, &asn_PER_memb_extensionValue_constr_304,  memb_extensionValue_constraint_301 },
-		0, 0, /* No default value */
-		"extensionValue"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_WidebandCQI_ExtIEs_tags_301[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_WidebandCQI_ExtIEs_tag2el_301[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
-};
-asn_SEQUENCE_specifics_t asn_SPC_WidebandCQI_ExtIEs_specs_301 = {
-	sizeof(struct WidebandCQI_ExtIEs),
-	offsetof(struct WidebandCQI_ExtIEs, _asn_ctx),
-	asn_MAP_WidebandCQI_ExtIEs_tag2el_301,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_WidebandCQI_ExtIEs = {
-	"WidebandCQI-ExtIEs",
-	"WidebandCQI-ExtIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_WidebandCQI_ExtIEs_tags_301,
-	sizeof(asn_DEF_WidebandCQI_ExtIEs_tags_301)
-		/sizeof(asn_DEF_WidebandCQI_ExtIEs_tags_301[0]), /* 1 */
-	asn_DEF_WidebandCQI_ExtIEs_tags_301,	/* Same as above */
-	sizeof(asn_DEF_WidebandCQI_ExtIEs_tags_301)
-		/sizeof(asn_DEF_WidebandCQI_ExtIEs_tags_301[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_WidebandCQI_ExtIEs_301,
-	3,	/* Elements count */
-	&asn_SPC_WidebandCQI_ExtIEs_specs_301	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ProtocolExtensionField.h b/3rdparty/libe2ap/ProtocolExtensionField.h
deleted file mode 100644
index ef4b944..0000000
--- a/3rdparty/libe2ap/ProtocolExtensionField.h
+++ /dev/null
@@ -1,1801 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-Containers"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ProtocolExtensionField_H_
-#define	_ProtocolExtensionField_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-ID.h"
-#include "Criticality.h"
-#include "ANY.h"
-#include "asn_ioc.h"
-#include "ABSInformation.h"
-#include "Presence.h"
-#include "InvokeIndication.h"
-#include "SubframeAssignment.h"
-#include "ExtendedULInterferenceOverloadInfo.h"
-#include "CoMPInformation.h"
-#include "DynamicDLTransmissionInformation.h"
-#include "OPEN_TYPE.h"
-#include "constr_CHOICE.h"
-#include "constr_SEQUENCE.h"
-#include "DeactivationIndication.h"
-#include "CompositeAvailableCapacityGroup.h"
-#include "ABS-Status.h"
-#include "RSRPMRList.h"
-#include "CSIReportList.h"
-#include "CellReportingIndicator.h"
-#include "EARFCNExtension.h"
-#include "OffsetOfNbiotChannelNumberToEARFCN.h"
-#include "NRS-NSSS-PowerOffset.h"
-#include "NSSS-NumOccasionDifferentPrecoder.h"
-#include "TAC.h"
-#include "DL-scheduling-PDCCH-CCE-usage.h"
-#include "UL-scheduling-PDCCH-CCE-usage.h"
-#include "EnhancedRNTP.h"
-#include "UEID.h"
-#include "Number-of-Antennaports.h"
-#include "PRACH-Configuration.h"
-#include "MBSFN-Subframe-Infolist.h"
-#include "CSG-Id.h"
-#include "MBMS-Service-Area-Identity-List.h"
-#include "MultibandInfoList.h"
-#include "FreqBandIndicatorPriority.h"
-#include "BandwidthReducedSI.h"
-#include "ProtectedEUTRAResourceIndication.h"
-#include "AdditionalSpecialSubframe-Info.h"
-#include "AdditionalSpecialSubframeExtension-Info.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum CellInformation_Item_ExtIEs__extensionValue_PR {
-	CellInformation_Item_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
-	CellInformation_Item_ExtIEs__extensionValue_PR_ABSInformation,
-	CellInformation_Item_ExtIEs__extensionValue_PR_InvokeIndication,
-	CellInformation_Item_ExtIEs__extensionValue_PR_SubframeAssignment,
-	CellInformation_Item_ExtIEs__extensionValue_PR_ExtendedULInterferenceOverloadInfo,
-	CellInformation_Item_ExtIEs__extensionValue_PR_CoMPInformation,
-	CellInformation_Item_ExtIEs__extensionValue_PR_DynamicDLTransmissionInformation
-} CellInformation_Item_ExtIEs__extensionValue_PR;
-typedef enum ServedCellsToModify_Item_ExtIEs__extensionValue_PR {
-	ServedCellsToModify_Item_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
-	ServedCellsToModify_Item_ExtIEs__extensionValue_PR_DeactivationIndication
-} ServedCellsToModify_Item_ExtIEs__extensionValue_PR;
-typedef enum CellToReport_Item_ExtIEs__extensionValue_PR {
-	CellToReport_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} CellToReport_Item_ExtIEs__extensionValue_PR;
-typedef enum MeasurementInitiationResult_Item_ExtIEs__extensionValue_PR {
-	MeasurementInitiationResult_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} MeasurementInitiationResult_Item_ExtIEs__extensionValue_PR;
-typedef enum MeasurementFailureCause_Item_ExtIEs__extensionValue_PR {
-	MeasurementFailureCause_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} MeasurementFailureCause_Item_ExtIEs__extensionValue_PR;
-typedef enum CompleteFailureCauseInformation_Item_ExtIEs__extensionValue_PR {
-	CompleteFailureCauseInformation_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} CompleteFailureCauseInformation_Item_ExtIEs__extensionValue_PR;
-typedef enum CellMeasurementResult_Item_ExtIEs__extensionValue_PR {
-	CellMeasurementResult_Item_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
-	CellMeasurementResult_Item_ExtIEs__extensionValue_PR_CompositeAvailableCapacityGroup,
-	CellMeasurementResult_Item_ExtIEs__extensionValue_PR_ABS_Status,
-	CellMeasurementResult_Item_ExtIEs__extensionValue_PR_RSRPMRList,
-	CellMeasurementResult_Item_ExtIEs__extensionValue_PR_CSIReportList,
-	CellMeasurementResult_Item_ExtIEs__extensionValue_PR_CellReportingIndicator
-} CellMeasurementResult_Item_ExtIEs__extensionValue_PR;
-typedef enum ResponseInformationSeNBReconfComp_SuccessItemExtIEs__extensionValue_PR {
-	ResponseInformationSeNBReconfComp_SuccessItemExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} ResponseInformationSeNBReconfComp_SuccessItemExtIEs__extensionValue_PR;
-typedef enum ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs__extensionValue_PR {
-	ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs__extensionValue_PR;
-typedef enum ServedEUTRAcellsENDCX2Management_ExtIEs__extensionValue_PR {
-	ServedEUTRAcellsENDCX2Management_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} ServedEUTRAcellsENDCX2Management_ExtIEs__extensionValue_PR;
-typedef enum En_gNBServedCells_ExtIEs__extensionValue_PR {
-	En_gNBServedCells_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} En_gNBServedCells_ExtIEs__extensionValue_PR;
-typedef enum ServedNRCell_Information_ExtIEs__extensionValue_PR {
-	ServedNRCell_Information_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} ServedNRCell_Information_ExtIEs__extensionValue_PR;
-typedef enum FDD_InfoServedNRCell_Information_ExtIEs__extensionValue_PR {
-	FDD_InfoServedNRCell_Information_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} FDD_InfoServedNRCell_Information_ExtIEs__extensionValue_PR;
-typedef enum FDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue_PR {
-	FDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} FDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue_PR;
-typedef enum TDD_InfoServedNRCell_Information_ExtIEs__extensionValue_PR {
-	TDD_InfoServedNRCell_Information_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} TDD_InfoServedNRCell_Information_ExtIEs__extensionValue_PR;
-typedef enum TDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue_PR {
-	TDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} TDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue_PR;
-typedef enum NRNeighbour_Information_ExtIEs__extensionValue_PR {
-	NRNeighbour_Information_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} NRNeighbour_Information_ExtIEs__extensionValue_PR;
-typedef enum Limited_list_ExtIEs__extensionValue_PR {
-	Limited_list_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} Limited_list_ExtIEs__extensionValue_PR;
-typedef enum ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs__extensionValue_PR {
-	ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs__extensionValue_PR;
-typedef enum ServedNRCellsToModify_Item_ExtIEs__extensionValue_PR {
-	ServedNRCellsToModify_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} ServedNRCellsToModify_Item_ExtIEs__extensionValue_PR;
-typedef enum ABSInformationFDD_ExtIEs__extensionValue_PR {
-	ABSInformationFDD_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} ABSInformationFDD_ExtIEs__extensionValue_PR;
-typedef enum ABSInformationTDD_ExtIEs__extensionValue_PR {
-	ABSInformationTDD_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} ABSInformationTDD_ExtIEs__extensionValue_PR;
-typedef enum ABS_Status_ExtIEs__extensionValue_PR {
-	ABS_Status_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} ABS_Status_ExtIEs__extensionValue_PR;
-typedef enum AdditionalSpecialSubframe_Info_ExtIEs__extensionValue_PR {
-	AdditionalSpecialSubframe_Info_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} AdditionalSpecialSubframe_Info_ExtIEs__extensionValue_PR;
-typedef enum AdditionalSpecialSubframeExtension_Info_ExtIEs__extensionValue_PR {
-	AdditionalSpecialSubframeExtension_Info_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} AdditionalSpecialSubframeExtension_Info_ExtIEs__extensionValue_PR;
-typedef enum CellBasedQMC_ExtIEs__extensionValue_PR {
-	CellBasedQMC_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} CellBasedQMC_ExtIEs__extensionValue_PR;
-typedef enum CellReplacingInfo_ExtIEs__extensionValue_PR {
-	CellReplacingInfo_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} CellReplacingInfo_ExtIEs__extensionValue_PR;
-typedef enum CoMPHypothesisSetItem_ExtIEs__extensionValue_PR {
-	CoMPHypothesisSetItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} CoMPHypothesisSetItem_ExtIEs__extensionValue_PR;
-typedef enum CoMPInformation_ExtIEs__extensionValue_PR {
-	CoMPInformation_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} CoMPInformation_ExtIEs__extensionValue_PR;
-typedef enum CoMPInformationItem_ExtIEs__extensionValue_PR {
-	CoMPInformationItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} CoMPInformationItem_ExtIEs__extensionValue_PR;
-typedef enum CoMPInformationStartTime_ExtIEs__extensionValue_PR {
-	CoMPInformationStartTime_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} CoMPInformationStartTime_ExtIEs__extensionValue_PR;
-typedef enum CompositeAvailableCapacity_ExtIEs__extensionValue_PR {
-	CompositeAvailableCapacity_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} CompositeAvailableCapacity_ExtIEs__extensionValue_PR;
-typedef enum CompositeAvailableCapacityGroup_ExtIEs__extensionValue_PR {
-	CompositeAvailableCapacityGroup_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} CompositeAvailableCapacityGroup_ExtIEs__extensionValue_PR;
-typedef enum CriticalityDiagnostics_ExtIEs__extensionValue_PR {
-	CriticalityDiagnostics_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} CriticalityDiagnostics_ExtIEs__extensionValue_PR;
-typedef enum CriticalityDiagnostics_IE_List_ExtIEs__extensionValue_PR {
-	CriticalityDiagnostics_IE_List_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} CriticalityDiagnostics_IE_List_ExtIEs__extensionValue_PR;
-typedef enum CSIReportList_ExtIEs__extensionValue_PR {
-	CSIReportList_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} CSIReportList_ExtIEs__extensionValue_PR;
-typedef enum CSIReportPerCSIProcess_ExtIEs__extensionValue_PR {
-	CSIReportPerCSIProcess_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} CSIReportPerCSIProcess_ExtIEs__extensionValue_PR;
-typedef enum CSIReportPerCSIProcessItem_ExtIEs__extensionValue_PR {
-	CSIReportPerCSIProcessItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} CSIReportPerCSIProcessItem_ExtIEs__extensionValue_PR;
-typedef enum DynamicNAICSInformation_ExtIEs__extensionValue_PR {
-	DynamicNAICSInformation_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} DynamicNAICSInformation_ExtIEs__extensionValue_PR;
-typedef enum ECGI_ExtIEs__extensionValue_PR {
-	ECGI_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} ECGI_ExtIEs__extensionValue_PR;
-typedef enum EnhancedRNTP_ExtIEs__extensionValue_PR {
-	EnhancedRNTP_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} EnhancedRNTP_ExtIEs__extensionValue_PR;
-typedef enum EnhancedRNTPStartTime_ExtIEs__extensionValue_PR {
-	EnhancedRNTPStartTime_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} EnhancedRNTPStartTime_ExtIEs__extensionValue_PR;
-typedef enum ExtendedULInterferenceOverloadInfo_ExtIEs__extensionValue_PR {
-	ExtendedULInterferenceOverloadInfo_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} ExtendedULInterferenceOverloadInfo_ExtIEs__extensionValue_PR;
-typedef enum FDD_Info_ExtIEs__extensionValue_PR {
-	FDD_Info_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
-	FDD_Info_ExtIEs__extensionValue_PR_EARFCNExtension,
-	FDD_Info_ExtIEs__extensionValue_PR_OffsetOfNbiotChannelNumberToEARFCN,
-	FDD_Info_ExtIEs__extensionValue_PR_NRS_NSSS_PowerOffset,
-	FDD_Info_ExtIEs__extensionValue_PR_NSSS_NumOccasionDifferentPrecoder
-} FDD_Info_ExtIEs__extensionValue_PR;
-typedef enum FreqBandNrItem_ExtIEs__extensionValue_PR {
-	FreqBandNrItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} FreqBandNrItem_ExtIEs__extensionValue_PR;
-typedef enum GlobalENB_ID_ExtIEs__extensionValue_PR {
-	GlobalENB_ID_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} GlobalENB_ID_ExtIEs__extensionValue_PR;
-typedef enum GlobalGNB_ID_ExtIEs__extensionValue_PR {
-	GlobalGNB_ID_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} GlobalGNB_ID_ExtIEs__extensionValue_PR;
-typedef enum GU_Group_ID_ExtIEs__extensionValue_PR {
-	GU_Group_ID_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} GU_Group_ID_ExtIEs__extensionValue_PR;
-typedef enum HWLoadIndicator_ExtIEs__extensionValue_PR {
-	HWLoadIndicator_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} HWLoadIndicator_ExtIEs__extensionValue_PR;
-typedef enum MBSFN_Subframe_Info_ExtIEs__extensionValue_PR {
-	MBSFN_Subframe_Info_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} MBSFN_Subframe_Info_ExtIEs__extensionValue_PR;
-typedef enum BandInfo_ExtIEs__extensionValue_PR {
-	BandInfo_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} BandInfo_ExtIEs__extensionValue_PR;
-typedef enum Neighbour_Information_ExtIEs__extensionValue_PR {
-	Neighbour_Information_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
-	Neighbour_Information_ExtIEs__extensionValue_PR_TAC,
-	Neighbour_Information_ExtIEs__extensionValue_PR_EARFCNExtension
-} Neighbour_Information_ExtIEs__extensionValue_PR;
-typedef enum NRFreqInfo_ExtIEs__extensionValue_PR {
-	NRFreqInfo_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} NRFreqInfo_ExtIEs__extensionValue_PR;
-typedef enum NRCGI_ExtIEs__extensionValue_PR {
-	NRCGI_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} NRCGI_ExtIEs__extensionValue_PR;
-typedef enum NR_TxBW_ExtIEs__extensionValue_PR {
-	NR_TxBW_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} NR_TxBW_ExtIEs__extensionValue_PR;
-typedef enum PRACH_Configuration_ExtIEs__extensionValue_PR {
-	PRACH_Configuration_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} PRACH_Configuration_ExtIEs__extensionValue_PR;
-typedef enum ProtectedEUTRAResourceIndication_ExtIEs__extensionValue_PR {
-	ProtectedEUTRAResourceIndication_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} ProtectedEUTRAResourceIndication_ExtIEs__extensionValue_PR;
-typedef enum ProtectedFootprintTimePattern_ExtIEs__extensionValue_PR {
-	ProtectedFootprintTimePattern_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} ProtectedFootprintTimePattern_ExtIEs__extensionValue_PR;
-typedef enum ProtectedResourceList_Item_ExtIEs__extensionValue_PR {
-	ProtectedResourceList_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} ProtectedResourceList_Item_ExtIEs__extensionValue_PR;
-typedef enum RadioResourceStatus_ExtIEs__extensionValue_PR {
-	RadioResourceStatus_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
-	RadioResourceStatus_ExtIEs__extensionValue_PR_DL_scheduling_PDCCH_CCE_usage,
-	RadioResourceStatus_ExtIEs__extensionValue_PR_UL_scheduling_PDCCH_CCE_usage
-} RadioResourceStatus_ExtIEs__extensionValue_PR;
-typedef enum RelativeNarrowbandTxPower_ExtIEs__extensionValue_PR {
-	RelativeNarrowbandTxPower_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
-	RelativeNarrowbandTxPower_ExtIEs__extensionValue_PR_EnhancedRNTP
-} RelativeNarrowbandTxPower_ExtIEs__extensionValue_PR;
-typedef enum RSRPMeasurementResult_ExtIEs__extensionValue_PR {
-	RSRPMeasurementResult_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} RSRPMeasurementResult_ExtIEs__extensionValue_PR;
-typedef enum RSRPMRList_ExtIEs__extensionValue_PR {
-	RSRPMRList_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
-	RSRPMRList_ExtIEs__extensionValue_PR_UEID
-} RSRPMRList_ExtIEs__extensionValue_PR;
-typedef enum S1TNLLoadIndicator_ExtIEs__extensionValue_PR {
-	S1TNLLoadIndicator_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} S1TNLLoadIndicator_ExtIEs__extensionValue_PR;
-typedef enum ServedCell_ExtIEs__extensionValue_PR {
-	ServedCell_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} ServedCell_ExtIEs__extensionValue_PR;
-typedef enum ServedCell_Information_ExtIEs__extensionValue_PR {
-	ServedCell_Information_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
-	ServedCell_Information_ExtIEs__extensionValue_PR_Number_of_Antennaports,
-	ServedCell_Information_ExtIEs__extensionValue_PR_PRACH_Configuration,
-	ServedCell_Information_ExtIEs__extensionValue_PR_MBSFN_Subframe_Infolist,
-	ServedCell_Information_ExtIEs__extensionValue_PR_CSG_Id,
-	ServedCell_Information_ExtIEs__extensionValue_PR_MBMS_Service_Area_Identity_List,
-	ServedCell_Information_ExtIEs__extensionValue_PR_MultibandInfoList,
-	ServedCell_Information_ExtIEs__extensionValue_PR_FreqBandIndicatorPriority,
-	ServedCell_Information_ExtIEs__extensionValue_PR_BandwidthReducedSI,
-	ServedCell_Information_ExtIEs__extensionValue_PR_ProtectedEUTRAResourceIndication
-} ServedCell_Information_ExtIEs__extensionValue_PR;
-typedef enum SpecialSubframe_Info_ExtIEs__extensionValue_PR {
-	SpecialSubframe_Info_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} SpecialSubframe_Info_ExtIEs__extensionValue_PR;
-typedef enum SubbandCQI_ExtIEs__extensionValue_PR {
-	SubbandCQI_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} SubbandCQI_ExtIEs__extensionValue_PR;
-typedef enum SubbandCQIItem_ExtIEs__extensionValue_PR {
-	SubbandCQIItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} SubbandCQIItem_ExtIEs__extensionValue_PR;
-typedef enum SULInformation_ExtIEs__extensionValue_PR {
-	SULInformation_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} SULInformation_ExtIEs__extensionValue_PR;
-typedef enum SupportedSULFreqBandItem_ExtIEs__extensionValue_PR {
-	SupportedSULFreqBandItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} SupportedSULFreqBandItem_ExtIEs__extensionValue_PR;
-typedef enum TDD_Info_ExtIEs__extensionValue_PR {
-	TDD_Info_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
-	TDD_Info_ExtIEs__extensionValue_PR_AdditionalSpecialSubframe_Info,
-	TDD_Info_ExtIEs__extensionValue_PR_EARFCNExtension,
-	TDD_Info_ExtIEs__extensionValue_PR_AdditionalSpecialSubframeExtension_Info
-} TDD_Info_ExtIEs__extensionValue_PR;
-typedef enum UL_HighInterferenceIndicationInfo_Item_ExtIEs__extensionValue_PR {
-	UL_HighInterferenceIndicationInfo_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} UL_HighInterferenceIndicationInfo_Item_ExtIEs__extensionValue_PR;
-typedef enum UsableABSInformationFDD_ExtIEs__extensionValue_PR {
-	UsableABSInformationFDD_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} UsableABSInformationFDD_ExtIEs__extensionValue_PR;
-typedef enum UsableABSInformationTDD_ExtIEs__extensionValue_PR {
-	UsableABSInformationTDD_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} UsableABSInformationTDD_ExtIEs__extensionValue_PR;
-typedef enum WidebandCQI_ExtIEs__extensionValue_PR {
-	WidebandCQI_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
-	
-} WidebandCQI_ExtIEs__extensionValue_PR;
-
-/* ProtocolExtensionField */
-typedef struct CellInformation_Item_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CellInformation_Item_ExtIEs__extensionValue {
-		CellInformation_Item_ExtIEs__extensionValue_PR present;
-		union CellInformation_Item_ExtIEs__extensionValue_u {
-			ABSInformation_t	 ABSInformation;
-			InvokeIndication_t	 InvokeIndication;
-			SubframeAssignment_t	 SubframeAssignment;
-			ExtendedULInterferenceOverloadInfo_t	 ExtendedULInterferenceOverloadInfo;
-			CoMPInformation_t	 CoMPInformation;
-			DynamicDLTransmissionInformation_t	 DynamicDLTransmissionInformation;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellInformation_Item_ExtIEs_t;
-typedef struct ServedCellsToModify_Item_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ServedCellsToModify_Item_ExtIEs__extensionValue {
-		ServedCellsToModify_Item_ExtIEs__extensionValue_PR present;
-		union ServedCellsToModify_Item_ExtIEs__extensionValue_u {
-			DeactivationIndication_t	 DeactivationIndication;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedCellsToModify_Item_ExtIEs_t;
-typedef struct CellToReport_Item_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CellToReport_Item_ExtIEs__extensionValue {
-		CellToReport_Item_ExtIEs__extensionValue_PR present;
-		union CellToReport_Item_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellToReport_Item_ExtIEs_t;
-typedef struct MeasurementInitiationResult_Item_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct MeasurementInitiationResult_Item_ExtIEs__extensionValue {
-		MeasurementInitiationResult_Item_ExtIEs__extensionValue_PR present;
-		union MeasurementInitiationResult_Item_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} MeasurementInitiationResult_Item_ExtIEs_t;
-typedef struct MeasurementFailureCause_Item_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct MeasurementFailureCause_Item_ExtIEs__extensionValue {
-		MeasurementFailureCause_Item_ExtIEs__extensionValue_PR present;
-		union MeasurementFailureCause_Item_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} MeasurementFailureCause_Item_ExtIEs_t;
-typedef struct CompleteFailureCauseInformation_Item_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CompleteFailureCauseInformation_Item_ExtIEs__extensionValue {
-		CompleteFailureCauseInformation_Item_ExtIEs__extensionValue_PR present;
-		union CompleteFailureCauseInformation_Item_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CompleteFailureCauseInformation_Item_ExtIEs_t;
-typedef struct CellMeasurementResult_Item_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CellMeasurementResult_Item_ExtIEs__extensionValue {
-		CellMeasurementResult_Item_ExtIEs__extensionValue_PR present;
-		union CellMeasurementResult_Item_ExtIEs__extensionValue_u {
-			CompositeAvailableCapacityGroup_t	 CompositeAvailableCapacityGroup;
-			ABS_Status_t	 ABS_Status;
-			RSRPMRList_t	 RSRPMRList;
-			CSIReportList_t	 CSIReportList;
-			CellReportingIndicator_t	 CellReportingIndicator;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellMeasurementResult_Item_ExtIEs_t;
-typedef struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs__extensionValue {
-		ResponseInformationSeNBReconfComp_SuccessItemExtIEs__extensionValue_PR present;
-		union ResponseInformationSeNBReconfComp_SuccessItemExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResponseInformationSeNBReconfComp_SuccessItemExtIEs_t;
-typedef struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs__extensionValue {
-		ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs__extensionValue_PR present;
-		union ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_t;
-typedef struct ServedEUTRAcellsENDCX2Management_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ServedEUTRAcellsENDCX2Management_ExtIEs__extensionValue {
-		ServedEUTRAcellsENDCX2Management_ExtIEs__extensionValue_PR present;
-		union ServedEUTRAcellsENDCX2Management_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedEUTRAcellsENDCX2Management_ExtIEs_t;
-typedef struct En_gNBServedCells_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct En_gNBServedCells_ExtIEs__extensionValue {
-		En_gNBServedCells_ExtIEs__extensionValue_PR present;
-		union En_gNBServedCells_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} En_gNBServedCells_ExtIEs_t;
-typedef struct ServedNRCell_Information_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ServedNRCell_Information_ExtIEs__extensionValue {
-		ServedNRCell_Information_ExtIEs__extensionValue_PR present;
-		union ServedNRCell_Information_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedNRCell_Information_ExtIEs_t;
-typedef struct FDD_InfoServedNRCell_Information_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct FDD_InfoServedNRCell_Information_ExtIEs__extensionValue {
-		FDD_InfoServedNRCell_Information_ExtIEs__extensionValue_PR present;
-		union FDD_InfoServedNRCell_Information_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} FDD_InfoServedNRCell_Information_ExtIEs_t;
-typedef struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue {
-		FDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue_PR present;
-		union FDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} FDD_InfoNeighbourServedNRCell_Information_ExtIEs_t;
-typedef struct TDD_InfoServedNRCell_Information_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct TDD_InfoServedNRCell_Information_ExtIEs__extensionValue {
-		TDD_InfoServedNRCell_Information_ExtIEs__extensionValue_PR present;
-		union TDD_InfoServedNRCell_Information_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} TDD_InfoServedNRCell_Information_ExtIEs_t;
-typedef struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue {
-		TDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue_PR present;
-		union TDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} TDD_InfoNeighbourServedNRCell_Information_ExtIEs_t;
-typedef struct NRNeighbour_Information_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct NRNeighbour_Information_ExtIEs__extensionValue {
-		NRNeighbour_Information_ExtIEs__extensionValue_PR present;
-		union NRNeighbour_Information_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} NRNeighbour_Information_ExtIEs_t;
-typedef struct Limited_list_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct Limited_list_ExtIEs__extensionValue {
-		Limited_list_ExtIEs__extensionValue_PR present;
-		union Limited_list_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} Limited_list_ExtIEs_t;
-typedef struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs__extensionValue {
-		ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs__extensionValue_PR present;
-		union ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_t;
-typedef struct ServedNRCellsToModify_Item_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ServedNRCellsToModify_Item_ExtIEs__extensionValue {
-		ServedNRCellsToModify_Item_ExtIEs__extensionValue_PR present;
-		union ServedNRCellsToModify_Item_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedNRCellsToModify_Item_ExtIEs_t;
-typedef struct ABSInformationFDD_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ABSInformationFDD_ExtIEs__extensionValue {
-		ABSInformationFDD_ExtIEs__extensionValue_PR present;
-		union ABSInformationFDD_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ABSInformationFDD_ExtIEs_t;
-typedef struct ABSInformationTDD_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ABSInformationTDD_ExtIEs__extensionValue {
-		ABSInformationTDD_ExtIEs__extensionValue_PR present;
-		union ABSInformationTDD_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ABSInformationTDD_ExtIEs_t;
-typedef struct ABS_Status_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ABS_Status_ExtIEs__extensionValue {
-		ABS_Status_ExtIEs__extensionValue_PR present;
-		union ABS_Status_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ABS_Status_ExtIEs_t;
-typedef struct AdditionalSpecialSubframe_Info_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct AdditionalSpecialSubframe_Info_ExtIEs__extensionValue {
-		AdditionalSpecialSubframe_Info_ExtIEs__extensionValue_PR present;
-		union AdditionalSpecialSubframe_Info_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} AdditionalSpecialSubframe_Info_ExtIEs_t;
-typedef struct AdditionalSpecialSubframeExtension_Info_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct AdditionalSpecialSubframeExtension_Info_ExtIEs__extensionValue {
-		AdditionalSpecialSubframeExtension_Info_ExtIEs__extensionValue_PR present;
-		union AdditionalSpecialSubframeExtension_Info_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} AdditionalSpecialSubframeExtension_Info_ExtIEs_t;
-typedef struct CellBasedQMC_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CellBasedQMC_ExtIEs__extensionValue {
-		CellBasedQMC_ExtIEs__extensionValue_PR present;
-		union CellBasedQMC_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellBasedQMC_ExtIEs_t;
-typedef struct CellReplacingInfo_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CellReplacingInfo_ExtIEs__extensionValue {
-		CellReplacingInfo_ExtIEs__extensionValue_PR present;
-		union CellReplacingInfo_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellReplacingInfo_ExtIEs_t;
-typedef struct CoMPHypothesisSetItem_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CoMPHypothesisSetItem_ExtIEs__extensionValue {
-		CoMPHypothesisSetItem_ExtIEs__extensionValue_PR present;
-		union CoMPHypothesisSetItem_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CoMPHypothesisSetItem_ExtIEs_t;
-typedef struct CoMPInformation_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CoMPInformation_ExtIEs__extensionValue {
-		CoMPInformation_ExtIEs__extensionValue_PR present;
-		union CoMPInformation_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CoMPInformation_ExtIEs_t;
-typedef struct CoMPInformationItem_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CoMPInformationItem_ExtIEs__extensionValue {
-		CoMPInformationItem_ExtIEs__extensionValue_PR present;
-		union CoMPInformationItem_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CoMPInformationItem_ExtIEs_t;
-typedef struct CoMPInformationStartTime_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CoMPInformationStartTime_ExtIEs__extensionValue {
-		CoMPInformationStartTime_ExtIEs__extensionValue_PR present;
-		union CoMPInformationStartTime_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CoMPInformationStartTime_ExtIEs_t;
-typedef struct CompositeAvailableCapacity_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CompositeAvailableCapacity_ExtIEs__extensionValue {
-		CompositeAvailableCapacity_ExtIEs__extensionValue_PR present;
-		union CompositeAvailableCapacity_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CompositeAvailableCapacity_ExtIEs_t;
-typedef struct CompositeAvailableCapacityGroup_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CompositeAvailableCapacityGroup_ExtIEs__extensionValue {
-		CompositeAvailableCapacityGroup_ExtIEs__extensionValue_PR present;
-		union CompositeAvailableCapacityGroup_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CompositeAvailableCapacityGroup_ExtIEs_t;
-typedef struct CriticalityDiagnostics_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CriticalityDiagnostics_ExtIEs__extensionValue {
-		CriticalityDiagnostics_ExtIEs__extensionValue_PR present;
-		union CriticalityDiagnostics_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CriticalityDiagnostics_ExtIEs_t;
-typedef struct CriticalityDiagnostics_IE_List_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CriticalityDiagnostics_IE_List_ExtIEs__extensionValue {
-		CriticalityDiagnostics_IE_List_ExtIEs__extensionValue_PR present;
-		union CriticalityDiagnostics_IE_List_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CriticalityDiagnostics_IE_List_ExtIEs_t;
-typedef struct CSIReportList_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CSIReportList_ExtIEs__extensionValue {
-		CSIReportList_ExtIEs__extensionValue_PR present;
-		union CSIReportList_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CSIReportList_ExtIEs_t;
-typedef struct CSIReportPerCSIProcess_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CSIReportPerCSIProcess_ExtIEs__extensionValue {
-		CSIReportPerCSIProcess_ExtIEs__extensionValue_PR present;
-		union CSIReportPerCSIProcess_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CSIReportPerCSIProcess_ExtIEs_t;
-typedef struct CSIReportPerCSIProcessItem_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CSIReportPerCSIProcessItem_ExtIEs__extensionValue {
-		CSIReportPerCSIProcessItem_ExtIEs__extensionValue_PR present;
-		union CSIReportPerCSIProcessItem_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CSIReportPerCSIProcessItem_ExtIEs_t;
-typedef struct DynamicNAICSInformation_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct DynamicNAICSInformation_ExtIEs__extensionValue {
-		DynamicNAICSInformation_ExtIEs__extensionValue_PR present;
-		union DynamicNAICSInformation_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} DynamicNAICSInformation_ExtIEs_t;
-typedef struct ECGI_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ECGI_ExtIEs__extensionValue {
-		ECGI_ExtIEs__extensionValue_PR present;
-		union ECGI_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ECGI_ExtIEs_t;
-typedef struct EnhancedRNTP_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct EnhancedRNTP_ExtIEs__extensionValue {
-		EnhancedRNTP_ExtIEs__extensionValue_PR present;
-		union EnhancedRNTP_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} EnhancedRNTP_ExtIEs_t;
-typedef struct EnhancedRNTPStartTime_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct EnhancedRNTPStartTime_ExtIEs__extensionValue {
-		EnhancedRNTPStartTime_ExtIEs__extensionValue_PR present;
-		union EnhancedRNTPStartTime_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} EnhancedRNTPStartTime_ExtIEs_t;
-typedef struct ExtendedULInterferenceOverloadInfo_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ExtendedULInterferenceOverloadInfo_ExtIEs__extensionValue {
-		ExtendedULInterferenceOverloadInfo_ExtIEs__extensionValue_PR present;
-		union ExtendedULInterferenceOverloadInfo_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ExtendedULInterferenceOverloadInfo_ExtIEs_t;
-typedef struct FDD_Info_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct FDD_Info_ExtIEs__extensionValue {
-		FDD_Info_ExtIEs__extensionValue_PR present;
-		union FDD_Info_ExtIEs__extensionValue_u {
-			EARFCNExtension_t	 EARFCNExtension;
-			OffsetOfNbiotChannelNumberToEARFCN_t	 OffsetOfNbiotChannelNumberToEARFCN;
-			NRS_NSSS_PowerOffset_t	 NRS_NSSS_PowerOffset;
-			NSSS_NumOccasionDifferentPrecoder_t	 NSSS_NumOccasionDifferentPrecoder;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} FDD_Info_ExtIEs_t;
-typedef struct FreqBandNrItem_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct FreqBandNrItem_ExtIEs__extensionValue {
-		FreqBandNrItem_ExtIEs__extensionValue_PR present;
-		union FreqBandNrItem_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} FreqBandNrItem_ExtIEs_t;
-typedef struct GlobalENB_ID_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct GlobalENB_ID_ExtIEs__extensionValue {
-		GlobalENB_ID_ExtIEs__extensionValue_PR present;
-		union GlobalENB_ID_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} GlobalENB_ID_ExtIEs_t;
-typedef struct GlobalGNB_ID_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct GlobalGNB_ID_ExtIEs__extensionValue {
-		GlobalGNB_ID_ExtIEs__extensionValue_PR present;
-		union GlobalGNB_ID_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} GlobalGNB_ID_ExtIEs_t;
-typedef struct GU_Group_ID_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct GU_Group_ID_ExtIEs__extensionValue {
-		GU_Group_ID_ExtIEs__extensionValue_PR present;
-		union GU_Group_ID_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} GU_Group_ID_ExtIEs_t;
-typedef struct HWLoadIndicator_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct HWLoadIndicator_ExtIEs__extensionValue {
-		HWLoadIndicator_ExtIEs__extensionValue_PR present;
-		union HWLoadIndicator_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} HWLoadIndicator_ExtIEs_t;
-typedef struct MBSFN_Subframe_Info_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct MBSFN_Subframe_Info_ExtIEs__extensionValue {
-		MBSFN_Subframe_Info_ExtIEs__extensionValue_PR present;
-		union MBSFN_Subframe_Info_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} MBSFN_Subframe_Info_ExtIEs_t;
-typedef struct BandInfo_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct BandInfo_ExtIEs__extensionValue {
-		BandInfo_ExtIEs__extensionValue_PR present;
-		union BandInfo_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} BandInfo_ExtIEs_t;
-typedef struct Neighbour_Information_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct Neighbour_Information_ExtIEs__extensionValue {
-		Neighbour_Information_ExtIEs__extensionValue_PR present;
-		union Neighbour_Information_ExtIEs__extensionValue_u {
-			TAC_t	 TAC;
-			EARFCNExtension_t	 EARFCNExtension;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} Neighbour_Information_ExtIEs_t;
-typedef struct NRFreqInfo_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct NRFreqInfo_ExtIEs__extensionValue {
-		NRFreqInfo_ExtIEs__extensionValue_PR present;
-		union NRFreqInfo_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} NRFreqInfo_ExtIEs_t;
-typedef struct NRCGI_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct NRCGI_ExtIEs__extensionValue {
-		NRCGI_ExtIEs__extensionValue_PR present;
-		union NRCGI_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} NRCGI_ExtIEs_t;
-typedef struct NR_TxBW_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct NR_TxBW_ExtIEs__extensionValue {
-		NR_TxBW_ExtIEs__extensionValue_PR present;
-		union NR_TxBW_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} NR_TxBW_ExtIEs_t;
-typedef struct PRACH_Configuration_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct PRACH_Configuration_ExtIEs__extensionValue {
-		PRACH_Configuration_ExtIEs__extensionValue_PR present;
-		union PRACH_Configuration_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} PRACH_Configuration_ExtIEs_t;
-typedef struct ProtectedEUTRAResourceIndication_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ProtectedEUTRAResourceIndication_ExtIEs__extensionValue {
-		ProtectedEUTRAResourceIndication_ExtIEs__extensionValue_PR present;
-		union ProtectedEUTRAResourceIndication_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtectedEUTRAResourceIndication_ExtIEs_t;
-typedef struct ProtectedFootprintTimePattern_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ProtectedFootprintTimePattern_ExtIEs__extensionValue {
-		ProtectedFootprintTimePattern_ExtIEs__extensionValue_PR present;
-		union ProtectedFootprintTimePattern_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtectedFootprintTimePattern_ExtIEs_t;
-typedef struct ProtectedResourceList_Item_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ProtectedResourceList_Item_ExtIEs__extensionValue {
-		ProtectedResourceList_Item_ExtIEs__extensionValue_PR present;
-		union ProtectedResourceList_Item_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtectedResourceList_Item_ExtIEs_t;
-typedef struct RadioResourceStatus_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RadioResourceStatus_ExtIEs__extensionValue {
-		RadioResourceStatus_ExtIEs__extensionValue_PR present;
-		union RadioResourceStatus_ExtIEs__extensionValue_u {
-			DL_scheduling_PDCCH_CCE_usage_t	 DL_scheduling_PDCCH_CCE_usage;
-			UL_scheduling_PDCCH_CCE_usage_t	 UL_scheduling_PDCCH_CCE_usage;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RadioResourceStatus_ExtIEs_t;
-typedef struct RelativeNarrowbandTxPower_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RelativeNarrowbandTxPower_ExtIEs__extensionValue {
-		RelativeNarrowbandTxPower_ExtIEs__extensionValue_PR present;
-		union RelativeNarrowbandTxPower_ExtIEs__extensionValue_u {
-			EnhancedRNTP_t	 EnhancedRNTP;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RelativeNarrowbandTxPower_ExtIEs_t;
-typedef struct RSRPMeasurementResult_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RSRPMeasurementResult_ExtIEs__extensionValue {
-		RSRPMeasurementResult_ExtIEs__extensionValue_PR present;
-		union RSRPMeasurementResult_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RSRPMeasurementResult_ExtIEs_t;
-typedef struct RSRPMRList_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RSRPMRList_ExtIEs__extensionValue {
-		RSRPMRList_ExtIEs__extensionValue_PR present;
-		union RSRPMRList_ExtIEs__extensionValue_u {
-			UEID_t	 UEID;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RSRPMRList_ExtIEs_t;
-typedef struct S1TNLLoadIndicator_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct S1TNLLoadIndicator_ExtIEs__extensionValue {
-		S1TNLLoadIndicator_ExtIEs__extensionValue_PR present;
-		union S1TNLLoadIndicator_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} S1TNLLoadIndicator_ExtIEs_t;
-typedef struct ServedCell_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ServedCell_ExtIEs__extensionValue {
-		ServedCell_ExtIEs__extensionValue_PR present;
-		union ServedCell_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedCell_ExtIEs_t;
-typedef struct ServedCell_Information_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ServedCell_Information_ExtIEs__extensionValue {
-		ServedCell_Information_ExtIEs__extensionValue_PR present;
-		union ServedCell_Information_ExtIEs__extensionValue_u {
-			Number_of_Antennaports_t	 Number_of_Antennaports;
-			PRACH_Configuration_t	 PRACH_Configuration;
-			MBSFN_Subframe_Infolist_t	 MBSFN_Subframe_Infolist;
-			CSG_Id_t	 CSG_Id;
-			MBMS_Service_Area_Identity_List_t	 MBMS_Service_Area_Identity_List;
-			MultibandInfoList_t	 MultibandInfoList;
-			FreqBandIndicatorPriority_t	 FreqBandIndicatorPriority;
-			BandwidthReducedSI_t	 BandwidthReducedSI;
-			ProtectedEUTRAResourceIndication_t	 ProtectedEUTRAResourceIndication;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedCell_Information_ExtIEs_t;
-typedef struct SpecialSubframe_Info_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct SpecialSubframe_Info_ExtIEs__extensionValue {
-		SpecialSubframe_Info_ExtIEs__extensionValue_PR present;
-		union SpecialSubframe_Info_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SpecialSubframe_Info_ExtIEs_t;
-typedef struct SubbandCQI_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct SubbandCQI_ExtIEs__extensionValue {
-		SubbandCQI_ExtIEs__extensionValue_PR present;
-		union SubbandCQI_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SubbandCQI_ExtIEs_t;
-typedef struct SubbandCQIItem_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct SubbandCQIItem_ExtIEs__extensionValue {
-		SubbandCQIItem_ExtIEs__extensionValue_PR present;
-		union SubbandCQIItem_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SubbandCQIItem_ExtIEs_t;
-typedef struct SULInformation_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct SULInformation_ExtIEs__extensionValue {
-		SULInformation_ExtIEs__extensionValue_PR present;
-		union SULInformation_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SULInformation_ExtIEs_t;
-typedef struct SupportedSULFreqBandItem_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct SupportedSULFreqBandItem_ExtIEs__extensionValue {
-		SupportedSULFreqBandItem_ExtIEs__extensionValue_PR present;
-		union SupportedSULFreqBandItem_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SupportedSULFreqBandItem_ExtIEs_t;
-typedef struct TDD_Info_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct TDD_Info_ExtIEs__extensionValue {
-		TDD_Info_ExtIEs__extensionValue_PR present;
-		union TDD_Info_ExtIEs__extensionValue_u {
-			AdditionalSpecialSubframe_Info_t	 AdditionalSpecialSubframe_Info;
-			EARFCNExtension_t	 EARFCNExtension;
-			AdditionalSpecialSubframeExtension_Info_t	 AdditionalSpecialSubframeExtension_Info;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} TDD_Info_ExtIEs_t;
-typedef struct UL_HighInterferenceIndicationInfo_Item_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct UL_HighInterferenceIndicationInfo_Item_ExtIEs__extensionValue {
-		UL_HighInterferenceIndicationInfo_Item_ExtIEs__extensionValue_PR present;
-		union UL_HighInterferenceIndicationInfo_Item_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} UL_HighInterferenceIndicationInfo_Item_ExtIEs_t;
-typedef struct UsableABSInformationFDD_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct UsableABSInformationFDD_ExtIEs__extensionValue {
-		UsableABSInformationFDD_ExtIEs__extensionValue_PR present;
-		union UsableABSInformationFDD_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} UsableABSInformationFDD_ExtIEs_t;
-typedef struct UsableABSInformationTDD_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct UsableABSInformationTDD_ExtIEs__extensionValue {
-		UsableABSInformationTDD_ExtIEs__extensionValue_PR present;
-		union UsableABSInformationTDD_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} UsableABSInformationTDD_ExtIEs_t;
-typedef struct WidebandCQI_ExtIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct WidebandCQI_ExtIEs__extensionValue {
-		WidebandCQI_ExtIEs__extensionValue_PR present;
-		union WidebandCQI_ExtIEs__extensionValue_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} extensionValue;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} WidebandCQI_ExtIEs_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_CellInformation_Item_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CellInformation_Item_ExtIEs_specs_1;
-extern asn_TYPE_member_t asn_MBR_CellInformation_Item_ExtIEs_1[3];
-extern asn_TYPE_descriptor_t asn_DEF_ServedCellsToModify_Item_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ServedCellsToModify_Item_ExtIEs_specs_5;
-extern asn_TYPE_member_t asn_MBR_ServedCellsToModify_Item_ExtIEs_5[3];
-extern asn_TYPE_descriptor_t asn_DEF_CellToReport_Item_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CellToReport_Item_ExtIEs_specs_9;
-extern asn_TYPE_member_t asn_MBR_CellToReport_Item_ExtIEs_9[3];
-extern asn_TYPE_descriptor_t asn_DEF_MeasurementInitiationResult_Item_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_MeasurementInitiationResult_Item_ExtIEs_specs_13;
-extern asn_TYPE_member_t asn_MBR_MeasurementInitiationResult_Item_ExtIEs_13[3];
-extern asn_TYPE_descriptor_t asn_DEF_MeasurementFailureCause_Item_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_MeasurementFailureCause_Item_ExtIEs_specs_17;
-extern asn_TYPE_member_t asn_MBR_MeasurementFailureCause_Item_ExtIEs_17[3];
-extern asn_TYPE_descriptor_t asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CompleteFailureCauseInformation_Item_ExtIEs_specs_21;
-extern asn_TYPE_member_t asn_MBR_CompleteFailureCauseInformation_Item_ExtIEs_21[3];
-extern asn_TYPE_descriptor_t asn_DEF_CellMeasurementResult_Item_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CellMeasurementResult_Item_ExtIEs_specs_25;
-extern asn_TYPE_member_t asn_MBR_CellMeasurementResult_Item_ExtIEs_25[3];
-extern asn_TYPE_descriptor_t asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_specs_29;
-extern asn_TYPE_member_t asn_MBR_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_29[3];
-extern asn_TYPE_descriptor_t asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_specs_33;
-extern asn_TYPE_member_t asn_MBR_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_33[3];
-extern asn_TYPE_descriptor_t asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ServedEUTRAcellsENDCX2Management_ExtIEs_specs_37;
-extern asn_TYPE_member_t asn_MBR_ServedEUTRAcellsENDCX2Management_ExtIEs_37[3];
-extern asn_TYPE_descriptor_t asn_DEF_En_gNBServedCells_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_En_gNBServedCells_ExtIEs_specs_41;
-extern asn_TYPE_member_t asn_MBR_En_gNBServedCells_ExtIEs_41[3];
-extern asn_TYPE_descriptor_t asn_DEF_ServedNRCell_Information_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ServedNRCell_Information_ExtIEs_specs_45;
-extern asn_TYPE_member_t asn_MBR_ServedNRCell_Information_ExtIEs_45[3];
-extern asn_TYPE_descriptor_t asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_FDD_InfoServedNRCell_Information_ExtIEs_specs_49;
-extern asn_TYPE_member_t asn_MBR_FDD_InfoServedNRCell_Information_ExtIEs_49[3];
-extern asn_TYPE_descriptor_t asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_specs_53;
-extern asn_TYPE_member_t asn_MBR_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_53[3];
-extern asn_TYPE_descriptor_t asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_TDD_InfoServedNRCell_Information_ExtIEs_specs_57;
-extern asn_TYPE_member_t asn_MBR_TDD_InfoServedNRCell_Information_ExtIEs_57[3];
-extern asn_TYPE_descriptor_t asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_specs_61;
-extern asn_TYPE_member_t asn_MBR_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_61[3];
-extern asn_TYPE_descriptor_t asn_DEF_NRNeighbour_Information_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_NRNeighbour_Information_ExtIEs_specs_65;
-extern asn_TYPE_member_t asn_MBR_NRNeighbour_Information_ExtIEs_65[3];
-extern asn_TYPE_descriptor_t asn_DEF_Limited_list_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_Limited_list_ExtIEs_specs_69;
-extern asn_TYPE_member_t asn_MBR_Limited_list_ExtIEs_69[3];
-extern asn_TYPE_descriptor_t asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_specs_73;
-extern asn_TYPE_member_t asn_MBR_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_73[3];
-extern asn_TYPE_descriptor_t asn_DEF_ServedNRCellsToModify_Item_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ServedNRCellsToModify_Item_ExtIEs_specs_77;
-extern asn_TYPE_member_t asn_MBR_ServedNRCellsToModify_Item_ExtIEs_77[3];
-extern asn_TYPE_descriptor_t asn_DEF_ABSInformationFDD_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ABSInformationFDD_ExtIEs_specs_81;
-extern asn_TYPE_member_t asn_MBR_ABSInformationFDD_ExtIEs_81[3];
-extern asn_TYPE_descriptor_t asn_DEF_ABSInformationTDD_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ABSInformationTDD_ExtIEs_specs_85;
-extern asn_TYPE_member_t asn_MBR_ABSInformationTDD_ExtIEs_85[3];
-extern asn_TYPE_descriptor_t asn_DEF_ABS_Status_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ABS_Status_ExtIEs_specs_89;
-extern asn_TYPE_member_t asn_MBR_ABS_Status_ExtIEs_89[3];
-extern asn_TYPE_descriptor_t asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_AdditionalSpecialSubframe_Info_ExtIEs_specs_93;
-extern asn_TYPE_member_t asn_MBR_AdditionalSpecialSubframe_Info_ExtIEs_93[3];
-extern asn_TYPE_descriptor_t asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_AdditionalSpecialSubframeExtension_Info_ExtIEs_specs_97;
-extern asn_TYPE_member_t asn_MBR_AdditionalSpecialSubframeExtension_Info_ExtIEs_97[3];
-extern asn_TYPE_descriptor_t asn_DEF_CellBasedQMC_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CellBasedQMC_ExtIEs_specs_101;
-extern asn_TYPE_member_t asn_MBR_CellBasedQMC_ExtIEs_101[3];
-extern asn_TYPE_descriptor_t asn_DEF_CellReplacingInfo_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CellReplacingInfo_ExtIEs_specs_105;
-extern asn_TYPE_member_t asn_MBR_CellReplacingInfo_ExtIEs_105[3];
-extern asn_TYPE_descriptor_t asn_DEF_CoMPHypothesisSetItem_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CoMPHypothesisSetItem_ExtIEs_specs_109;
-extern asn_TYPE_member_t asn_MBR_CoMPHypothesisSetItem_ExtIEs_109[3];
-extern asn_TYPE_descriptor_t asn_DEF_CoMPInformation_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CoMPInformation_ExtIEs_specs_113;
-extern asn_TYPE_member_t asn_MBR_CoMPInformation_ExtIEs_113[3];
-extern asn_TYPE_descriptor_t asn_DEF_CoMPInformationItem_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CoMPInformationItem_ExtIEs_specs_117;
-extern asn_TYPE_member_t asn_MBR_CoMPInformationItem_ExtIEs_117[3];
-extern asn_TYPE_descriptor_t asn_DEF_CoMPInformationStartTime_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CoMPInformationStartTime_ExtIEs_specs_121;
-extern asn_TYPE_member_t asn_MBR_CoMPInformationStartTime_ExtIEs_121[3];
-extern asn_TYPE_descriptor_t asn_DEF_CompositeAvailableCapacity_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CompositeAvailableCapacity_ExtIEs_specs_125;
-extern asn_TYPE_member_t asn_MBR_CompositeAvailableCapacity_ExtIEs_125[3];
-extern asn_TYPE_descriptor_t asn_DEF_CompositeAvailableCapacityGroup_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CompositeAvailableCapacityGroup_ExtIEs_specs_129;
-extern asn_TYPE_member_t asn_MBR_CompositeAvailableCapacityGroup_ExtIEs_129[3];
-extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_ExtIEs_specs_133;
-extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_ExtIEs_133[3];
-extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_IE_List_ExtIEs_specs_137;
-extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_List_ExtIEs_137[3];
-extern asn_TYPE_descriptor_t asn_DEF_CSIReportList_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CSIReportList_ExtIEs_specs_141;
-extern asn_TYPE_member_t asn_MBR_CSIReportList_ExtIEs_141[3];
-extern asn_TYPE_descriptor_t asn_DEF_CSIReportPerCSIProcess_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CSIReportPerCSIProcess_ExtIEs_specs_145;
-extern asn_TYPE_member_t asn_MBR_CSIReportPerCSIProcess_ExtIEs_145[3];
-extern asn_TYPE_descriptor_t asn_DEF_CSIReportPerCSIProcessItem_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CSIReportPerCSIProcessItem_ExtIEs_specs_149;
-extern asn_TYPE_member_t asn_MBR_CSIReportPerCSIProcessItem_ExtIEs_149[3];
-extern asn_TYPE_descriptor_t asn_DEF_DynamicNAICSInformation_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_DynamicNAICSInformation_ExtIEs_specs_153;
-extern asn_TYPE_member_t asn_MBR_DynamicNAICSInformation_ExtIEs_153[3];
-extern asn_TYPE_descriptor_t asn_DEF_ECGI_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ECGI_ExtIEs_specs_157;
-extern asn_TYPE_member_t asn_MBR_ECGI_ExtIEs_157[3];
-extern asn_TYPE_descriptor_t asn_DEF_EnhancedRNTP_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_EnhancedRNTP_ExtIEs_specs_161;
-extern asn_TYPE_member_t asn_MBR_EnhancedRNTP_ExtIEs_161[3];
-extern asn_TYPE_descriptor_t asn_DEF_EnhancedRNTPStartTime_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_EnhancedRNTPStartTime_ExtIEs_specs_165;
-extern asn_TYPE_member_t asn_MBR_EnhancedRNTPStartTime_ExtIEs_165[3];
-extern asn_TYPE_descriptor_t asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ExtendedULInterferenceOverloadInfo_ExtIEs_specs_169;
-extern asn_TYPE_member_t asn_MBR_ExtendedULInterferenceOverloadInfo_ExtIEs_169[3];
-extern asn_TYPE_descriptor_t asn_DEF_FDD_Info_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_FDD_Info_ExtIEs_specs_173;
-extern asn_TYPE_member_t asn_MBR_FDD_Info_ExtIEs_173[3];
-extern asn_TYPE_descriptor_t asn_DEF_FreqBandNrItem_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_FreqBandNrItem_ExtIEs_specs_177;
-extern asn_TYPE_member_t asn_MBR_FreqBandNrItem_ExtIEs_177[3];
-extern asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_GlobalENB_ID_ExtIEs_specs_181;
-extern asn_TYPE_member_t asn_MBR_GlobalENB_ID_ExtIEs_181[3];
-extern asn_TYPE_descriptor_t asn_DEF_GlobalGNB_ID_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_GlobalGNB_ID_ExtIEs_specs_185;
-extern asn_TYPE_member_t asn_MBR_GlobalGNB_ID_ExtIEs_185[3];
-extern asn_TYPE_descriptor_t asn_DEF_GU_Group_ID_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_GU_Group_ID_ExtIEs_specs_189;
-extern asn_TYPE_member_t asn_MBR_GU_Group_ID_ExtIEs_189[3];
-extern asn_TYPE_descriptor_t asn_DEF_HWLoadIndicator_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_HWLoadIndicator_ExtIEs_specs_193;
-extern asn_TYPE_member_t asn_MBR_HWLoadIndicator_ExtIEs_193[3];
-extern asn_TYPE_descriptor_t asn_DEF_MBSFN_Subframe_Info_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_MBSFN_Subframe_Info_ExtIEs_specs_197;
-extern asn_TYPE_member_t asn_MBR_MBSFN_Subframe_Info_ExtIEs_197[3];
-extern asn_TYPE_descriptor_t asn_DEF_BandInfo_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_BandInfo_ExtIEs_specs_201;
-extern asn_TYPE_member_t asn_MBR_BandInfo_ExtIEs_201[3];
-extern asn_TYPE_descriptor_t asn_DEF_Neighbour_Information_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_Neighbour_Information_ExtIEs_specs_205;
-extern asn_TYPE_member_t asn_MBR_Neighbour_Information_ExtIEs_205[3];
-extern asn_TYPE_descriptor_t asn_DEF_NRFreqInfo_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_NRFreqInfo_ExtIEs_specs_209;
-extern asn_TYPE_member_t asn_MBR_NRFreqInfo_ExtIEs_209[3];
-extern asn_TYPE_descriptor_t asn_DEF_NRCGI_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_NRCGI_ExtIEs_specs_213;
-extern asn_TYPE_member_t asn_MBR_NRCGI_ExtIEs_213[3];
-extern asn_TYPE_descriptor_t asn_DEF_NR_TxBW_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_NR_TxBW_ExtIEs_specs_217;
-extern asn_TYPE_member_t asn_MBR_NR_TxBW_ExtIEs_217[3];
-extern asn_TYPE_descriptor_t asn_DEF_PRACH_Configuration_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_PRACH_Configuration_ExtIEs_specs_221;
-extern asn_TYPE_member_t asn_MBR_PRACH_Configuration_ExtIEs_221[3];
-extern asn_TYPE_descriptor_t asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ProtectedEUTRAResourceIndication_ExtIEs_specs_225;
-extern asn_TYPE_member_t asn_MBR_ProtectedEUTRAResourceIndication_ExtIEs_225[3];
-extern asn_TYPE_descriptor_t asn_DEF_ProtectedFootprintTimePattern_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ProtectedFootprintTimePattern_ExtIEs_specs_229;
-extern asn_TYPE_member_t asn_MBR_ProtectedFootprintTimePattern_ExtIEs_229[3];
-extern asn_TYPE_descriptor_t asn_DEF_ProtectedResourceList_Item_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ProtectedResourceList_Item_ExtIEs_specs_233;
-extern asn_TYPE_member_t asn_MBR_ProtectedResourceList_Item_ExtIEs_233[3];
-extern asn_TYPE_descriptor_t asn_DEF_RadioResourceStatus_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RadioResourceStatus_ExtIEs_specs_237;
-extern asn_TYPE_member_t asn_MBR_RadioResourceStatus_ExtIEs_237[3];
-extern asn_TYPE_descriptor_t asn_DEF_RelativeNarrowbandTxPower_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RelativeNarrowbandTxPower_ExtIEs_specs_241;
-extern asn_TYPE_member_t asn_MBR_RelativeNarrowbandTxPower_ExtIEs_241[3];
-extern asn_TYPE_descriptor_t asn_DEF_RSRPMeasurementResult_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RSRPMeasurementResult_ExtIEs_specs_245;
-extern asn_TYPE_member_t asn_MBR_RSRPMeasurementResult_ExtIEs_245[3];
-extern asn_TYPE_descriptor_t asn_DEF_RSRPMRList_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RSRPMRList_ExtIEs_specs_249;
-extern asn_TYPE_member_t asn_MBR_RSRPMRList_ExtIEs_249[3];
-extern asn_TYPE_descriptor_t asn_DEF_S1TNLLoadIndicator_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_S1TNLLoadIndicator_ExtIEs_specs_253;
-extern asn_TYPE_member_t asn_MBR_S1TNLLoadIndicator_ExtIEs_253[3];
-extern asn_TYPE_descriptor_t asn_DEF_ServedCell_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ServedCell_ExtIEs_specs_257;
-extern asn_TYPE_member_t asn_MBR_ServedCell_ExtIEs_257[3];
-extern asn_TYPE_descriptor_t asn_DEF_ServedCell_Information_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ServedCell_Information_ExtIEs_specs_261;
-extern asn_TYPE_member_t asn_MBR_ServedCell_Information_ExtIEs_261[3];
-extern asn_TYPE_descriptor_t asn_DEF_SpecialSubframe_Info_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_SpecialSubframe_Info_ExtIEs_specs_265;
-extern asn_TYPE_member_t asn_MBR_SpecialSubframe_Info_ExtIEs_265[3];
-extern asn_TYPE_descriptor_t asn_DEF_SubbandCQI_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_SubbandCQI_ExtIEs_specs_269;
-extern asn_TYPE_member_t asn_MBR_SubbandCQI_ExtIEs_269[3];
-extern asn_TYPE_descriptor_t asn_DEF_SubbandCQIItem_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_SubbandCQIItem_ExtIEs_specs_273;
-extern asn_TYPE_member_t asn_MBR_SubbandCQIItem_ExtIEs_273[3];
-extern asn_TYPE_descriptor_t asn_DEF_SULInformation_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_SULInformation_ExtIEs_specs_277;
-extern asn_TYPE_member_t asn_MBR_SULInformation_ExtIEs_277[3];
-extern asn_TYPE_descriptor_t asn_DEF_SupportedSULFreqBandItem_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_SupportedSULFreqBandItem_ExtIEs_specs_281;
-extern asn_TYPE_member_t asn_MBR_SupportedSULFreqBandItem_ExtIEs_281[3];
-extern asn_TYPE_descriptor_t asn_DEF_TDD_Info_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_TDD_Info_ExtIEs_specs_285;
-extern asn_TYPE_member_t asn_MBR_TDD_Info_ExtIEs_285[3];
-extern asn_TYPE_descriptor_t asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_UL_HighInterferenceIndicationInfo_Item_ExtIEs_specs_289;
-extern asn_TYPE_member_t asn_MBR_UL_HighInterferenceIndicationInfo_Item_ExtIEs_289[3];
-extern asn_TYPE_descriptor_t asn_DEF_UsableABSInformationFDD_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_UsableABSInformationFDD_ExtIEs_specs_293;
-extern asn_TYPE_member_t asn_MBR_UsableABSInformationFDD_ExtIEs_293[3];
-extern asn_TYPE_descriptor_t asn_DEF_UsableABSInformationTDD_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_UsableABSInformationTDD_ExtIEs_specs_297;
-extern asn_TYPE_member_t asn_MBR_UsableABSInformationTDD_ExtIEs_297[3];
-extern asn_TYPE_descriptor_t asn_DEF_WidebandCQI_ExtIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_WidebandCQI_ExtIEs_specs_301;
-extern asn_TYPE_member_t asn_MBR_WidebandCQI_ExtIEs_301[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ProtocolExtensionField_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ProtocolIE-Container.c b/3rdparty/libe2ap/ProtocolIE-Container.c
deleted file mode 100644
index 2392664..0000000
--- a/3rdparty/libe2ap/ProtocolIE-Container.c
+++ /dev/null
@@ -1,1770 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-Containers"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ProtocolIE-Container.h"
-
-#include "ProtocolIE-Field.h"
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P0_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P1_constr_3 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P2_constr_5 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P3_constr_7 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P4_constr_9 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P5_constr_11 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P6_constr_13 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P7_constr_15 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P8_constr_17 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P9_constr_19 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P10_constr_21 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P11_constr_23 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P12_constr_25 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P13_constr_27 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P14_constr_29 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P15_constr_31 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P16_constr_33 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P17_constr_35 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P18_constr_37 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P19_constr_39 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P20_constr_41 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P21_constr_43 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P22_constr_45 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P23_constr_47 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P24_constr_49 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P25_constr_51 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P26_constr_53 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P27_constr_55 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P28_constr_57 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P29_constr_59 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P30_constr_61 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P31_constr_63 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P32_constr_65 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P33_constr_67 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P34_constr_69 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P35_constr_71 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P36_constr_73 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P37_constr_75 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P38_constr_77 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P39_constr_79 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P40_constr_81 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P41_constr_83 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P42_constr_85 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P43_constr_87 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (SIZE(0..65535)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P0_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICsubscriptionRequest_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P0_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P0_specs_1 = {
-	sizeof(struct ProtocolIE_Container_8807P0),
-	offsetof(struct ProtocolIE_Container_8807P0, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P0 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P0_tags_1,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P0_tags_1)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P0_tags_1[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P0_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P0_tags_1)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P0_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P0_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P0_1,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P0_specs_1	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P1_3[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICsubscriptionResponse_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P1_tags_3[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P1_specs_3 = {
-	sizeof(struct ProtocolIE_Container_8807P1),
-	offsetof(struct ProtocolIE_Container_8807P1, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P1 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P1_tags_3,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P1_tags_3)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P1_tags_3[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P1_tags_3,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P1_tags_3)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P1_tags_3[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P1_constr_3, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P1_3,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P1_specs_3	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P2_5[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICsubscriptionFailure_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P2_tags_5[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P2_specs_5 = {
-	sizeof(struct ProtocolIE_Container_8807P2),
-	offsetof(struct ProtocolIE_Container_8807P2, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P2 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P2_tags_5,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P2_tags_5)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P2_tags_5[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P2_tags_5,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P2_tags_5)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P2_tags_5[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P2_constr_5, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P2_5,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P2_specs_5	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P3_7[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICsubscriptionDeleteRequest_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P3_tags_7[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P3_specs_7 = {
-	sizeof(struct ProtocolIE_Container_8807P3),
-	offsetof(struct ProtocolIE_Container_8807P3, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P3 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P3_tags_7,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P3_tags_7)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P3_tags_7[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P3_tags_7,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P3_tags_7)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P3_tags_7[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P3_constr_7, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P3_7,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P3_specs_7	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P4_9[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICsubscriptionDeleteResponse_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P4_tags_9[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P4_specs_9 = {
-	sizeof(struct ProtocolIE_Container_8807P4),
-	offsetof(struct ProtocolIE_Container_8807P4, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P4 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P4_tags_9,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P4_tags_9)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P4_tags_9[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P4_tags_9,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P4_tags_9)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P4_tags_9[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P4_constr_9, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P4_9,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P4_specs_9	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P5_11[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICsubscriptionDeleteFailure_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P5_tags_11[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P5_specs_11 = {
-	sizeof(struct ProtocolIE_Container_8807P5),
-	offsetof(struct ProtocolIE_Container_8807P5, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P5 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P5_tags_11,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P5_tags_11)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P5_tags_11[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P5_tags_11,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P5_tags_11)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P5_tags_11[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P5_constr_11, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P5_11,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P5_specs_11	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P6_13[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICindication_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P6_tags_13[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P6_specs_13 = {
-	sizeof(struct ProtocolIE_Container_8807P6),
-	offsetof(struct ProtocolIE_Container_8807P6, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P6 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P6_tags_13,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P6_tags_13)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P6_tags_13[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P6_tags_13,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P6_tags_13)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P6_tags_13[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P6_constr_13, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P6_13,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P6_specs_13	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P7_15[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICcontrolRequest_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P7_tags_15[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P7_specs_15 = {
-	sizeof(struct ProtocolIE_Container_8807P7),
-	offsetof(struct ProtocolIE_Container_8807P7, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P7 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P7_tags_15,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P7_tags_15)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P7_tags_15[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P7_tags_15,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P7_tags_15)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P7_tags_15[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P7_constr_15, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P7_15,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P7_specs_15	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P8_17[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICcontrolAcknowledge_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P8_tags_17[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P8_specs_17 = {
-	sizeof(struct ProtocolIE_Container_8807P8),
-	offsetof(struct ProtocolIE_Container_8807P8, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P8 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P8_tags_17,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P8_tags_17)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P8_tags_17[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P8_tags_17,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P8_tags_17)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P8_tags_17[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P8_constr_17, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P8_17,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P8_specs_17	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P9_19[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICcontrolFailure_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P9_tags_19[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P9_specs_19 = {
-	sizeof(struct ProtocolIE_Container_8807P9),
-	offsetof(struct ProtocolIE_Container_8807P9, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P9 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P9_tags_19,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P9_tags_19)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P9_tags_19[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P9_tags_19,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P9_tags_19)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P9_tags_19[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P9_constr_19, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P9_19,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P9_specs_19	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P10_21[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICserviceUpdate_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P10_tags_21[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P10_specs_21 = {
-	sizeof(struct ProtocolIE_Container_8807P10),
-	offsetof(struct ProtocolIE_Container_8807P10, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P10 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P10_tags_21,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P10_tags_21)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P10_tags_21[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P10_tags_21,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P10_tags_21)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P10_tags_21[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P10_constr_21, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P10_21,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P10_specs_21	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P11_23[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICserviceUpdateAcknowledge_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P11_tags_23[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P11_specs_23 = {
-	sizeof(struct ProtocolIE_Container_8807P11),
-	offsetof(struct ProtocolIE_Container_8807P11, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P11 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P11_tags_23,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P11_tags_23)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P11_tags_23[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P11_tags_23,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P11_tags_23)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P11_tags_23[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P11_constr_23, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P11_23,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P11_specs_23	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P12_25[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICserviceUpdateFailure_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P12_tags_25[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P12_specs_25 = {
-	sizeof(struct ProtocolIE_Container_8807P12),
-	offsetof(struct ProtocolIE_Container_8807P12, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P12 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P12_tags_25,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P12_tags_25)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P12_tags_25[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P12_tags_25,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P12_tags_25)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P12_tags_25[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P12_constr_25, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P12_25,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P12_specs_25	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P13_27[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICserviceQuery_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P13_tags_27[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P13_specs_27 = {
-	sizeof(struct ProtocolIE_Container_8807P13),
-	offsetof(struct ProtocolIE_Container_8807P13, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P13 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P13_tags_27,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P13_tags_27)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P13_tags_27[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P13_tags_27,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P13_tags_27)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P13_tags_27[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P13_constr_27, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P13_27,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P13_specs_27	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P14_29[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ErrorIndication_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P14_tags_29[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P14_specs_29 = {
-	sizeof(struct ProtocolIE_Container_8807P14),
-	offsetof(struct ProtocolIE_Container_8807P14, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P14 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P14_tags_29,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P14_tags_29)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P14_tags_29[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P14_tags_29,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P14_tags_29)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P14_tags_29[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P14_constr_29, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P14_29,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P14_specs_29	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P15_31[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ResetRequest_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P15_tags_31[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P15_specs_31 = {
-	sizeof(struct ProtocolIE_Container_8807P15),
-	offsetof(struct ProtocolIE_Container_8807P15, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P15 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P15_tags_31,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P15_tags_31)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P15_tags_31[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P15_tags_31,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P15_tags_31)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P15_tags_31[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P15_constr_31, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P15_31,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P15_specs_31	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P16_33[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ResetResponse_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P16_tags_33[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P16_specs_33 = {
-	sizeof(struct ProtocolIE_Container_8807P16),
-	offsetof(struct ProtocolIE_Container_8807P16, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P16 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P16_tags_33,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P16_tags_33)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P16_tags_33[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P16_tags_33,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P16_tags_33)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P16_tags_33[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P16_constr_33, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P16_33,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P16_specs_33	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P17_35[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_X2SetupRequest_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P17_tags_35[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P17_specs_35 = {
-	sizeof(struct ProtocolIE_Container_8807P17),
-	offsetof(struct ProtocolIE_Container_8807P17, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P17 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P17_tags_35,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P17_tags_35)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P17_tags_35[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P17_tags_35,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P17_tags_35)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P17_tags_35[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P17_constr_35, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P17_35,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P17_specs_35	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P18_37[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_X2SetupResponse_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P18_tags_37[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P18_specs_37 = {
-	sizeof(struct ProtocolIE_Container_8807P18),
-	offsetof(struct ProtocolIE_Container_8807P18, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P18 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P18_tags_37,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P18_tags_37)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P18_tags_37[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P18_tags_37,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P18_tags_37)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P18_tags_37[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P18_constr_37, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P18_37,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P18_specs_37	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P19_39[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_X2SetupFailure_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P19_tags_39[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P19_specs_39 = {
-	sizeof(struct ProtocolIE_Container_8807P19),
-	offsetof(struct ProtocolIE_Container_8807P19, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P19 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P19_tags_39,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P19_tags_39)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P19_tags_39[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P19_tags_39,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P19_tags_39)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P19_tags_39[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P19_constr_39, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P19_39,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P19_specs_39	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P20_41[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_LoadInformation_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P20_tags_41[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P20_specs_41 = {
-	sizeof(struct ProtocolIE_Container_8807P20),
-	offsetof(struct ProtocolIE_Container_8807P20, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P20 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P20_tags_41,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P20_tags_41)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P20_tags_41[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P20_tags_41,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P20_tags_41)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P20_tags_41[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P20_constr_41, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P20_41,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P20_specs_41	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P21_43[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENBConfigurationUpdate_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P21_tags_43[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P21_specs_43 = {
-	sizeof(struct ProtocolIE_Container_8807P21),
-	offsetof(struct ProtocolIE_Container_8807P21, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P21 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P21_tags_43,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P21_tags_43)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P21_tags_43[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P21_tags_43,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P21_tags_43)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P21_tags_43[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P21_constr_43, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P21_43,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P21_specs_43	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P22_45[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENBConfigurationUpdateAcknowledge_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P22_tags_45[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P22_specs_45 = {
-	sizeof(struct ProtocolIE_Container_8807P22),
-	offsetof(struct ProtocolIE_Container_8807P22, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P22 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P22_tags_45,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P22_tags_45)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P22_tags_45[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P22_tags_45,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P22_tags_45)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P22_tags_45[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P22_constr_45, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P22_45,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P22_specs_45	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P23_47[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENBConfigurationUpdateFailure_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P23_tags_47[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P23_specs_47 = {
-	sizeof(struct ProtocolIE_Container_8807P23),
-	offsetof(struct ProtocolIE_Container_8807P23, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P23 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P23_tags_47,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P23_tags_47)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P23_tags_47[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P23_tags_47,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P23_tags_47)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P23_tags_47[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P23_constr_47, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P23_47,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P23_specs_47	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P24_49[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ResourceStatusRequest_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P24_tags_49[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P24_specs_49 = {
-	sizeof(struct ProtocolIE_Container_8807P24),
-	offsetof(struct ProtocolIE_Container_8807P24, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P24 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P24_tags_49,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P24_tags_49)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P24_tags_49[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P24_tags_49,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P24_tags_49)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P24_tags_49[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P24_constr_49, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P24_49,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P24_specs_49	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P25_51[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ResourceStatusResponse_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P25_tags_51[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P25_specs_51 = {
-	sizeof(struct ProtocolIE_Container_8807P25),
-	offsetof(struct ProtocolIE_Container_8807P25, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P25 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P25_tags_51,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P25_tags_51)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P25_tags_51[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P25_tags_51,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P25_tags_51)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P25_tags_51[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P25_constr_51, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P25_51,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P25_specs_51	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P26_53[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ResourceStatusFailure_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P26_tags_53[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P26_specs_53 = {
-	sizeof(struct ProtocolIE_Container_8807P26),
-	offsetof(struct ProtocolIE_Container_8807P26, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P26 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P26_tags_53,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P26_tags_53)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P26_tags_53[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P26_tags_53,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P26_tags_53)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P26_tags_53[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P26_constr_53, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P26_53,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P26_specs_53	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P27_55[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ResourceStatusUpdate_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P27_tags_55[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P27_specs_55 = {
-	sizeof(struct ProtocolIE_Container_8807P27),
-	offsetof(struct ProtocolIE_Container_8807P27, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P27 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P27_tags_55,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P27_tags_55)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P27_tags_55[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P27_tags_55,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P27_tags_55)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P27_tags_55[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P27_constr_55, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P27_55,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P27_specs_55	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P28_57[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_SeNBReconfigurationComplete_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P28_tags_57[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P28_specs_57 = {
-	sizeof(struct ProtocolIE_Container_8807P28),
-	offsetof(struct ProtocolIE_Container_8807P28, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P28 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P28_tags_57,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P28_tags_57)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P28_tags_57[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P28_tags_57,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P28_tags_57)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P28_tags_57[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P28_constr_57, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P28_57,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P28_specs_57	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P29_59[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENDCX2SetupRequest_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P29_tags_59[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P29_specs_59 = {
-	sizeof(struct ProtocolIE_Container_8807P29),
-	offsetof(struct ProtocolIE_Container_8807P29, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P29 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P29_tags_59,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P29_tags_59)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P29_tags_59[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P29_tags_59,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P29_tags_59)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P29_tags_59[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P29_constr_59, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P29_59,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P29_specs_59	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P30_61[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENB_ENDCX2SetupReqIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P30_tags_61[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P30_specs_61 = {
-	sizeof(struct ProtocolIE_Container_8807P30),
-	offsetof(struct ProtocolIE_Container_8807P30, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P30 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P30_tags_61,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P30_tags_61)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P30_tags_61[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P30_tags_61,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P30_tags_61)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P30_tags_61[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P30_constr_61, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P30_61,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P30_specs_61	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P31_63[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_En_gNB_ENDCX2SetupReqIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P31_tags_63[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P31_specs_63 = {
-	sizeof(struct ProtocolIE_Container_8807P31),
-	offsetof(struct ProtocolIE_Container_8807P31, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P31 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P31_tags_63,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P31_tags_63)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P31_tags_63[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P31_tags_63,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P31_tags_63)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P31_tags_63[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P31_constr_63, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P31_63,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P31_specs_63	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P32_65[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENDCX2SetupResponse_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P32_tags_65[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P32_specs_65 = {
-	sizeof(struct ProtocolIE_Container_8807P32),
-	offsetof(struct ProtocolIE_Container_8807P32, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P32 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P32_tags_65,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P32_tags_65)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P32_tags_65[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P32_tags_65,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P32_tags_65)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P32_tags_65[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P32_constr_65, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P32_65,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P32_specs_65	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P33_67[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENB_ENDCX2SetupReqAckIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P33_tags_67[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P33_specs_67 = {
-	sizeof(struct ProtocolIE_Container_8807P33),
-	offsetof(struct ProtocolIE_Container_8807P33, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P33 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P33_tags_67,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P33_tags_67)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P33_tags_67[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P33_tags_67,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P33_tags_67)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P33_tags_67[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P33_constr_67, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P33_67,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P33_specs_67	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P34_69[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_En_gNB_ENDCX2SetupReqAckIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P34_tags_69[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P34_specs_69 = {
-	sizeof(struct ProtocolIE_Container_8807P34),
-	offsetof(struct ProtocolIE_Container_8807P34, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P34 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P34_tags_69,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P34_tags_69)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P34_tags_69[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P34_tags_69,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P34_tags_69)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P34_tags_69[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P34_constr_69, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P34_69,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P34_specs_69	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P35_71[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENDCX2SetupFailure_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P35_tags_71[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P35_specs_71 = {
-	sizeof(struct ProtocolIE_Container_8807P35),
-	offsetof(struct ProtocolIE_Container_8807P35, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P35 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P35_tags_71,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P35_tags_71)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P35_tags_71[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P35_tags_71,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P35_tags_71)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P35_tags_71[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P35_constr_71, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P35_71,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P35_specs_71	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P36_73[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENDCConfigurationUpdate_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P36_tags_73[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P36_specs_73 = {
-	sizeof(struct ProtocolIE_Container_8807P36),
-	offsetof(struct ProtocolIE_Container_8807P36, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P36 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P36_tags_73,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P36_tags_73)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P36_tags_73[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P36_tags_73,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P36_tags_73)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P36_tags_73[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P36_constr_73, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P36_73,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P36_specs_73	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P37_75[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENB_ENDCConfigUpdateIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P37_tags_75[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P37_specs_75 = {
-	sizeof(struct ProtocolIE_Container_8807P37),
-	offsetof(struct ProtocolIE_Container_8807P37, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P37 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P37_tags_75,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P37_tags_75)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P37_tags_75[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P37_tags_75,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P37_tags_75)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P37_tags_75[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P37_constr_75, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P37_75,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P37_specs_75	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P38_77[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_En_gNB_ENDCConfigUpdateIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P38_tags_77[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P38_specs_77 = {
-	sizeof(struct ProtocolIE_Container_8807P38),
-	offsetof(struct ProtocolIE_Container_8807P38, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P38 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P38_tags_77,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P38_tags_77)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P38_tags_77[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P38_tags_77,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P38_tags_77)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P38_tags_77[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P38_constr_77, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P38_77,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P38_specs_77	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P39_79[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENDCConfigurationUpdateAcknowledge_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P39_tags_79[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P39_specs_79 = {
-	sizeof(struct ProtocolIE_Container_8807P39),
-	offsetof(struct ProtocolIE_Container_8807P39, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P39 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P39_tags_79,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P39_tags_79)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P39_tags_79[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P39_tags_79,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P39_tags_79)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P39_tags_79[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P39_constr_79, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P39_79,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P39_specs_79	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P40_81[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENB_ENDCConfigUpdateAckIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P40_tags_81[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P40_specs_81 = {
-	sizeof(struct ProtocolIE_Container_8807P40),
-	offsetof(struct ProtocolIE_Container_8807P40, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P40 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P40_tags_81,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P40_tags_81)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P40_tags_81[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P40_tags_81,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P40_tags_81)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P40_tags_81[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P40_constr_81, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P40_81,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P40_specs_81	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P41_83[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_En_gNB_ENDCConfigUpdateAckIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P41_tags_83[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P41_specs_83 = {
-	sizeof(struct ProtocolIE_Container_8807P41),
-	offsetof(struct ProtocolIE_Container_8807P41, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P41 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P41_tags_83,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P41_tags_83)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P41_tags_83[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P41_tags_83,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P41_tags_83)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P41_tags_83[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P41_constr_83, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P41_83,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P41_specs_83	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P42_85[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENDCConfigurationUpdateFailure_IEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P42_tags_85[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P42_specs_85 = {
-	sizeof(struct ProtocolIE_Container_8807P42),
-	offsetof(struct ProtocolIE_Container_8807P42, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P42 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P42_tags_85,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P42_tags_85)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P42_tags_85[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P42_tags_85,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P42_tags_85)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P42_tags_85[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P42_constr_85, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P42_85,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P42_specs_85	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P43_87[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_GNBStatusIndicationIEs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Container_8807P43_tags_87[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P43_specs_87 = {
-	sizeof(struct ProtocolIE_Container_8807P43),
-	offsetof(struct ProtocolIE_Container_8807P43, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P43 = {
-	"ProtocolIE-Container",
-	"ProtocolIE-Container",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ProtocolIE_Container_8807P43_tags_87,
-	sizeof(asn_DEF_ProtocolIE_Container_8807P43_tags_87)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P43_tags_87[0]), /* 1 */
-	asn_DEF_ProtocolIE_Container_8807P43_tags_87,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Container_8807P43_tags_87)
-		/sizeof(asn_DEF_ProtocolIE_Container_8807P43_tags_87[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_Container_8807P43_constr_87, SEQUENCE_OF_constraint },
-	asn_MBR_ProtocolIE_Container_8807P43_87,
-	1,	/* Single element */
-	&asn_SPC_ProtocolIE_Container_8807P43_specs_87	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ProtocolIE-Container.h b/3rdparty/libe2ap/ProtocolIE-Container.h
deleted file mode 100644
index 9dfca17..0000000
--- a/3rdparty/libe2ap/ProtocolIE-Container.h
+++ /dev/null
@@ -1,517 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-Containers"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ProtocolIE_Container_H_
-#define	_ProtocolIE_Container_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct RICsubscriptionRequest_IEs;
-struct RICsubscriptionResponse_IEs;
-struct RICsubscriptionFailure_IEs;
-struct RICsubscriptionDeleteRequest_IEs;
-struct RICsubscriptionDeleteResponse_IEs;
-struct RICsubscriptionDeleteFailure_IEs;
-struct RICindication_IEs;
-struct RICcontrolRequest_IEs;
-struct RICcontrolAcknowledge_IEs;
-struct RICcontrolFailure_IEs;
-struct RICserviceUpdate_IEs;
-struct RICserviceUpdateAcknowledge_IEs;
-struct RICserviceUpdateFailure_IEs;
-struct RICserviceQuery_IEs;
-struct ErrorIndication_IEs;
-struct ResetRequest_IEs;
-struct ResetResponse_IEs;
-struct X2SetupRequest_IEs;
-struct X2SetupResponse_IEs;
-struct X2SetupFailure_IEs;
-struct LoadInformation_IEs;
-struct ENBConfigurationUpdate_IEs;
-struct ENBConfigurationUpdateAcknowledge_IEs;
-struct ENBConfigurationUpdateFailure_IEs;
-struct ResourceStatusRequest_IEs;
-struct ResourceStatusResponse_IEs;
-struct ResourceStatusFailure_IEs;
-struct ResourceStatusUpdate_IEs;
-struct SeNBReconfigurationComplete_IEs;
-struct ENDCX2SetupRequest_IEs;
-struct ENB_ENDCX2SetupReqIEs;
-struct En_gNB_ENDCX2SetupReqIEs;
-struct ENDCX2SetupResponse_IEs;
-struct ENB_ENDCX2SetupReqAckIEs;
-struct En_gNB_ENDCX2SetupReqAckIEs;
-struct ENDCX2SetupFailure_IEs;
-struct ENDCConfigurationUpdate_IEs;
-struct ENB_ENDCConfigUpdateIEs;
-struct En_gNB_ENDCConfigUpdateIEs;
-struct ENDCConfigurationUpdateAcknowledge_IEs;
-struct ENB_ENDCConfigUpdateAckIEs;
-struct En_gNB_ENDCConfigUpdateAckIEs;
-struct ENDCConfigurationUpdateFailure_IEs;
-struct GNBStatusIndicationIEs;
-
-/* ProtocolIE-Container */
-typedef struct ProtocolIE_Container_8807P0 {
-	A_SEQUENCE_OF(struct RICsubscriptionRequest_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P0_t;
-typedef struct ProtocolIE_Container_8807P1 {
-	A_SEQUENCE_OF(struct RICsubscriptionResponse_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P1_t;
-typedef struct ProtocolIE_Container_8807P2 {
-	A_SEQUENCE_OF(struct RICsubscriptionFailure_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P2_t;
-typedef struct ProtocolIE_Container_8807P3 {
-	A_SEQUENCE_OF(struct RICsubscriptionDeleteRequest_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P3_t;
-typedef struct ProtocolIE_Container_8807P4 {
-	A_SEQUENCE_OF(struct RICsubscriptionDeleteResponse_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P4_t;
-typedef struct ProtocolIE_Container_8807P5 {
-	A_SEQUENCE_OF(struct RICsubscriptionDeleteFailure_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P5_t;
-typedef struct ProtocolIE_Container_8807P6 {
-	A_SEQUENCE_OF(struct RICindication_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P6_t;
-typedef struct ProtocolIE_Container_8807P7 {
-	A_SEQUENCE_OF(struct RICcontrolRequest_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P7_t;
-typedef struct ProtocolIE_Container_8807P8 {
-	A_SEQUENCE_OF(struct RICcontrolAcknowledge_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P8_t;
-typedef struct ProtocolIE_Container_8807P9 {
-	A_SEQUENCE_OF(struct RICcontrolFailure_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P9_t;
-typedef struct ProtocolIE_Container_8807P10 {
-	A_SEQUENCE_OF(struct RICserviceUpdate_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P10_t;
-typedef struct ProtocolIE_Container_8807P11 {
-	A_SEQUENCE_OF(struct RICserviceUpdateAcknowledge_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P11_t;
-typedef struct ProtocolIE_Container_8807P12 {
-	A_SEQUENCE_OF(struct RICserviceUpdateFailure_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P12_t;
-typedef struct ProtocolIE_Container_8807P13 {
-	A_SEQUENCE_OF(struct RICserviceQuery_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P13_t;
-typedef struct ProtocolIE_Container_8807P14 {
-	A_SEQUENCE_OF(struct ErrorIndication_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P14_t;
-typedef struct ProtocolIE_Container_8807P15 {
-	A_SEQUENCE_OF(struct ResetRequest_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P15_t;
-typedef struct ProtocolIE_Container_8807P16 {
-	A_SEQUENCE_OF(struct ResetResponse_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P16_t;
-typedef struct ProtocolIE_Container_8807P17 {
-	A_SEQUENCE_OF(struct X2SetupRequest_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P17_t;
-typedef struct ProtocolIE_Container_8807P18 {
-	A_SEQUENCE_OF(struct X2SetupResponse_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P18_t;
-typedef struct ProtocolIE_Container_8807P19 {
-	A_SEQUENCE_OF(struct X2SetupFailure_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P19_t;
-typedef struct ProtocolIE_Container_8807P20 {
-	A_SEQUENCE_OF(struct LoadInformation_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P20_t;
-typedef struct ProtocolIE_Container_8807P21 {
-	A_SEQUENCE_OF(struct ENBConfigurationUpdate_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P21_t;
-typedef struct ProtocolIE_Container_8807P22 {
-	A_SEQUENCE_OF(struct ENBConfigurationUpdateAcknowledge_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P22_t;
-typedef struct ProtocolIE_Container_8807P23 {
-	A_SEQUENCE_OF(struct ENBConfigurationUpdateFailure_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P23_t;
-typedef struct ProtocolIE_Container_8807P24 {
-	A_SEQUENCE_OF(struct ResourceStatusRequest_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P24_t;
-typedef struct ProtocolIE_Container_8807P25 {
-	A_SEQUENCE_OF(struct ResourceStatusResponse_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P25_t;
-typedef struct ProtocolIE_Container_8807P26 {
-	A_SEQUENCE_OF(struct ResourceStatusFailure_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P26_t;
-typedef struct ProtocolIE_Container_8807P27 {
-	A_SEQUENCE_OF(struct ResourceStatusUpdate_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P27_t;
-typedef struct ProtocolIE_Container_8807P28 {
-	A_SEQUENCE_OF(struct SeNBReconfigurationComplete_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P28_t;
-typedef struct ProtocolIE_Container_8807P29 {
-	A_SEQUENCE_OF(struct ENDCX2SetupRequest_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P29_t;
-typedef struct ProtocolIE_Container_8807P30 {
-	A_SEQUENCE_OF(struct ENB_ENDCX2SetupReqIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P30_t;
-typedef struct ProtocolIE_Container_8807P31 {
-	A_SEQUENCE_OF(struct En_gNB_ENDCX2SetupReqIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P31_t;
-typedef struct ProtocolIE_Container_8807P32 {
-	A_SEQUENCE_OF(struct ENDCX2SetupResponse_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P32_t;
-typedef struct ProtocolIE_Container_8807P33 {
-	A_SEQUENCE_OF(struct ENB_ENDCX2SetupReqAckIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P33_t;
-typedef struct ProtocolIE_Container_8807P34 {
-	A_SEQUENCE_OF(struct En_gNB_ENDCX2SetupReqAckIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P34_t;
-typedef struct ProtocolIE_Container_8807P35 {
-	A_SEQUENCE_OF(struct ENDCX2SetupFailure_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P35_t;
-typedef struct ProtocolIE_Container_8807P36 {
-	A_SEQUENCE_OF(struct ENDCConfigurationUpdate_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P36_t;
-typedef struct ProtocolIE_Container_8807P37 {
-	A_SEQUENCE_OF(struct ENB_ENDCConfigUpdateIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P37_t;
-typedef struct ProtocolIE_Container_8807P38 {
-	A_SEQUENCE_OF(struct En_gNB_ENDCConfigUpdateIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P38_t;
-typedef struct ProtocolIE_Container_8807P39 {
-	A_SEQUENCE_OF(struct ENDCConfigurationUpdateAcknowledge_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P39_t;
-typedef struct ProtocolIE_Container_8807P40 {
-	A_SEQUENCE_OF(struct ENB_ENDCConfigUpdateAckIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P40_t;
-typedef struct ProtocolIE_Container_8807P41 {
-	A_SEQUENCE_OF(struct En_gNB_ENDCConfigUpdateAckIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P41_t;
-typedef struct ProtocolIE_Container_8807P42 {
-	A_SEQUENCE_OF(struct ENDCConfigurationUpdateFailure_IEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P42_t;
-typedef struct ProtocolIE_Container_8807P43 {
-	A_SEQUENCE_OF(struct GNBStatusIndicationIEs) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ProtocolIE_Container_8807P43_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P0;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P0_specs_1;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P0_1[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P0_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P1;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P1_specs_3;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P1_3[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P1_constr_3;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P2;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P2_specs_5;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P2_5[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P2_constr_5;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P3;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P3_specs_7;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P3_7[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P3_constr_7;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P4;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P4_specs_9;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P4_9[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P4_constr_9;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P5;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P5_specs_11;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P5_11[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P5_constr_11;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P6;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P6_specs_13;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P6_13[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P6_constr_13;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P7;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P7_specs_15;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P7_15[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P7_constr_15;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P8;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P8_specs_17;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P8_17[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P8_constr_17;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P9;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P9_specs_19;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P9_19[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P9_constr_19;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P10;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P10_specs_21;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P10_21[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P10_constr_21;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P11;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P11_specs_23;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P11_23[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P11_constr_23;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P12;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P12_specs_25;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P12_25[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P12_constr_25;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P13;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P13_specs_27;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P13_27[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P13_constr_27;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P14;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P14_specs_29;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P14_29[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P14_constr_29;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P15;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P15_specs_31;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P15_31[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P15_constr_31;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P16;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P16_specs_33;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P16_33[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P16_constr_33;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P17;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P17_specs_35;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P17_35[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P17_constr_35;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P18;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P18_specs_37;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P18_37[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P18_constr_37;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P19;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P19_specs_39;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P19_39[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P19_constr_39;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P20;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P20_specs_41;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P20_41[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P20_constr_41;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P21;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P21_specs_43;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P21_43[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P21_constr_43;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P22;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P22_specs_45;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P22_45[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P22_constr_45;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P23;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P23_specs_47;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P23_47[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P23_constr_47;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P24;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P24_specs_49;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P24_49[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P24_constr_49;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P25;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P25_specs_51;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P25_51[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P25_constr_51;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P26;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P26_specs_53;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P26_53[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P26_constr_53;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P27;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P27_specs_55;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P27_55[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P27_constr_55;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P28;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P28_specs_57;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P28_57[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P28_constr_57;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P29;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P29_specs_59;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P29_59[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P29_constr_59;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P30;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P30_specs_61;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P30_61[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P30_constr_61;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P31;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P31_specs_63;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P31_63[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P31_constr_63;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P32;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P32_specs_65;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P32_65[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P32_constr_65;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P33;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P33_specs_67;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P33_67[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P33_constr_67;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P34;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P34_specs_69;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P34_69[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P34_constr_69;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P35;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P35_specs_71;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P35_71[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P35_constr_71;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P36;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P36_specs_73;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P36_73[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P36_constr_73;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P37;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P37_specs_75;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P37_75[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P37_constr_75;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P38;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P38_specs_77;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P38_77[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P38_constr_77;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P39;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P39_specs_79;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P39_79[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P39_constr_79;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P40;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P40_specs_81;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P40_81[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P40_constr_81;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P41;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P41_specs_83;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P41_83[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P41_constr_83;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P42;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P42_specs_85;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P42_85[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P42_constr_85;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_8807P43;
-extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_8807P43_specs_87;
-extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_8807P43_87[1];
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_8807P43_constr_87;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ProtocolIE_Container_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ProtocolIE-ContainerList.c b/3rdparty/libe2ap/ProtocolIE-ContainerList.c
deleted file mode 100644
index f064771..0000000
--- a/3rdparty/libe2ap/ProtocolIE-ContainerList.c
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-Containers"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ProtocolIE-ContainerList.h"
-
diff --git a/3rdparty/libe2ap/ProtocolIE-ContainerList.h b/3rdparty/libe2ap/ProtocolIE-ContainerList.h
deleted file mode 100644
index 2ec5cf7..0000000
--- a/3rdparty/libe2ap/ProtocolIE-ContainerList.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-Containers"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ProtocolIE_ContainerList_H_
-#define	_ProtocolIE_ContainerList_H_
-
-
-#include "asn_application.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ProtocolIE_ContainerList_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ProtocolIE-Field.c b/3rdparty/libe2ap/ProtocolIE-Field.c
deleted file mode 100644
index 0f9334a..0000000
--- a/3rdparty/libe2ap/ProtocolIE-Field.c
+++ /dev/null
@@ -1,15157 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-Containers"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ProtocolIE-Field.h"
-
-static const long asn_VAL_4_id_RICaction_ToBeSetup_Item = 60011;
-static const long asn_VAL_4_ignore = 1;
-static const long asn_VAL_4_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_RICaction_ToBeSetup_ItemIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_4_id_RICaction_ToBeSetup_Item },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_4_ignore },
-	{ "&Value", aioc__type, &asn_DEF_RICaction_ToBeSetup_Item },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_4_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_RICaction_ToBeSetup_ItemIEs_1[] = {
-	{ 1, 4, asn_IOS_RICaction_ToBeSetup_ItemIEs_1_rows }
-};
-static const long asn_VAL_9_id_RICaction_Admitted_Item = 60013;
-static const long asn_VAL_9_ignore = 1;
-static const long asn_VAL_9_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_RICaction_Admitted_ItemIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_9_id_RICaction_Admitted_Item },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_ignore },
-	{ "&Value", aioc__type, &asn_DEF_RICaction_Admitted_Item },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_9_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_RICaction_Admitted_ItemIEs_1[] = {
-	{ 1, 4, asn_IOS_RICaction_Admitted_ItemIEs_1_rows }
-};
-static const long asn_VAL_10_id_RICaction_NotAdmitted_Item = 60015;
-static const long asn_VAL_10_ignore = 1;
-static const long asn_VAL_10_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_RICaction_NotAdmitted_ItemIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_10_id_RICaction_NotAdmitted_Item },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_10_ignore },
-	{ "&Value", aioc__type, &asn_DEF_RICaction_NotAdmitted_Item },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_10_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_RICaction_NotAdmitted_ItemIEs_1[] = {
-	{ 1, 4, asn_IOS_RICaction_NotAdmitted_ItemIEs_1_rows }
-};
-static const long asn_VAL_48_id_RANfunction_Item = 60001;
-static const long asn_VAL_48_ignore = 1;
-static const long asn_VAL_48_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_RANfunction_ItemIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_48_id_RANfunction_Item },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_48_ignore },
-	{ "&Value", aioc__type, &asn_DEF_RANfunction_Item },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_48_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_RANfunction_ItemIEs_1[] = {
-	{ 1, 4, asn_IOS_RANfunction_ItemIEs_1_rows }
-};
-static const long asn_VAL_49_id_RANfunctionID_Item = 60004;
-static const long asn_VAL_49_ignore = 1;
-static const long asn_VAL_49_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_RANfunctionID_ItemIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_49_id_RANfunctionID_Item },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_49_ignore },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionID_Item },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_49_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_RANfunctionID_ItemIEs_1[] = {
-	{ 1, 4, asn_IOS_RANfunctionID_ItemIEs_1_rows }
-};
-static const long asn_VAL_52_id_RANfunctionIEcause_Item = 60005;
-static const long asn_VAL_52_ignore = 1;
-static const long asn_VAL_52_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_RANfunctionIDcause_ItemIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_52_id_RANfunctionIEcause_Item },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_52_ignore },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionIDcause_Item },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_52_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_RANfunctionIDcause_ItemIEs_1[] = {
-	{ 1, 4, asn_IOS_RANfunctionIDcause_ItemIEs_1_rows }
-};
-static const long asn_VAL_79_id_CellInformation_Item = 7;
-static const long asn_VAL_79_ignore = 1;
-static const long asn_VAL_79_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_CellInformation_ItemIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_79_id_CellInformation_Item },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_79_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CellInformation_Item },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_79_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_CellInformation_ItemIEs_1[] = {
-	{ 1, 4, asn_IOS_CellInformation_ItemIEs_1_rows }
-};
-static const long asn_VAL_99_id_CellToReport_Item = 31;
-static const long asn_VAL_99_ignore = 1;
-static const long asn_VAL_99_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_CellToReport_ItemIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_99_id_CellToReport_Item },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_99_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CellToReport_Item },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_99_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_CellToReport_ItemIEs_1[] = {
-	{ 1, 4, asn_IOS_CellToReport_ItemIEs_1_rows }
-};
-static const long asn_VAL_104_id_MeasurementInitiationResult_Item = 66;
-static const long asn_VAL_104_ignore = 1;
-static const long asn_VAL_104_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_MeasurementInitiationResult_ItemIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_104_id_MeasurementInitiationResult_Item },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_104_ignore },
-	{ "&Value", aioc__type, &asn_DEF_MeasurementInitiationResult_Item },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_104_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_MeasurementInitiationResult_ItemIEs_1[] = {
-	{ 1, 4, asn_IOS_MeasurementInitiationResult_ItemIEs_1_rows }
-};
-static const long asn_VAL_105_id_MeasurementFailureCause_Item = 67;
-static const long asn_VAL_105_ignore = 1;
-static const long asn_VAL_105_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_MeasurementFailureCause_ItemIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_105_id_MeasurementFailureCause_Item },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_105_ignore },
-	{ "&Value", aioc__type, &asn_DEF_MeasurementFailureCause_Item },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_105_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_MeasurementFailureCause_ItemIEs_1[] = {
-	{ 1, 4, asn_IOS_MeasurementFailureCause_ItemIEs_1_rows }
-};
-static const long asn_VAL_111_id_CompleteFailureCauseInformation_Item = 69;
-static const long asn_VAL_111_ignore = 1;
-static const long asn_VAL_111_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_CompleteFailureCauseInformation_ItemIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_111_id_CompleteFailureCauseInformation_Item },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_111_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CompleteFailureCauseInformation_Item },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_111_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_CompleteFailureCauseInformation_ItemIEs_1[] = {
-	{ 1, 4, asn_IOS_CompleteFailureCauseInformation_ItemIEs_1_rows }
-};
-static const long asn_VAL_115_id_CellMeasurementResult_Item = 33;
-static const long asn_VAL_115_ignore = 1;
-static const long asn_VAL_115_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_CellMeasurementResult_ItemIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_115_id_CellMeasurementResult_Item },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_115_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CellMeasurementResult_Item },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_115_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_CellMeasurementResult_ItemIEs_1[] = {
-	{ 1, 4, asn_IOS_CellMeasurementResult_ItemIEs_1_rows }
-};
-static const long asn_VAL_1_id_RICrequestID = 60030;
-static const long asn_VAL_1_reject = 0;
-static const long asn_VAL_1_mandatory = 2;
-static const long asn_VAL_2_id_RANfunctionID = 60003;
-static const long asn_VAL_2_reject = 0;
-static const long asn_VAL_2_mandatory = 2;
-static const long asn_VAL_3_id_RICsubscription = 60033;
-static const long asn_VAL_3_reject = 0;
-static const long asn_VAL_3_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_RICsubscriptionRequest_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_1_id_RICrequestID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_1_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_1_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_2_id_RANfunctionID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_2_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_2_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_3_id_RICsubscription },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_3_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICsubscription },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_3_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_RICsubscriptionRequest_IEs_1[] = {
-	{ 3, 4, asn_IOS_RICsubscriptionRequest_IEs_1_rows }
-};
-static const long asn_VAL_5_id_RICrequestID = 60030;
-static const long asn_VAL_5_reject = 0;
-static const long asn_VAL_5_mandatory = 2;
-static const long asn_VAL_6_id_RANfunctionID = 60003;
-static const long asn_VAL_6_reject = 0;
-static const long asn_VAL_6_mandatory = 2;
-static const long asn_VAL_7_id_RICactions_Admitted = 60012;
-static const long asn_VAL_7_reject = 0;
-static const long asn_VAL_7_mandatory = 2;
-static const long asn_VAL_8_id_RICactions_NotAdmitted = 60014;
-static const long asn_VAL_8_reject = 0;
-static const long asn_VAL_8_optional = 0;
-static const asn_ioc_cell_t asn_IOS_RICsubscriptionResponse_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_5_id_RICrequestID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_5_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_5_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_6_id_RANfunctionID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_6_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_7_id_RICactions_Admitted },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICaction_Admitted_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_7_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_8_id_RICactions_NotAdmitted },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICaction_NotAdmitted_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_8_optional }
-};
-static const asn_ioc_set_t asn_IOS_RICsubscriptionResponse_IEs_1[] = {
-	{ 4, 4, asn_IOS_RICsubscriptionResponse_IEs_1_rows }
-};
-static const long asn_VAL_11_id_RICrequestID = 60030;
-static const long asn_VAL_11_reject = 0;
-static const long asn_VAL_11_mandatory = 2;
-static const long asn_VAL_12_id_RANfunctionID = 60003;
-static const long asn_VAL_12_reject = 0;
-static const long asn_VAL_12_mandatory = 2;
-static const long asn_VAL_13_id_RICactions_NotAdmitted = 60014;
-static const long asn_VAL_13_reject = 0;
-static const long asn_VAL_13_mandatory = 2;
-static const long asn_VAL_14_id_CriticalityDiagnostics = 17;
-static const long asn_VAL_14_ignore = 1;
-static const long asn_VAL_14_optional = 0;
-static const asn_ioc_cell_t asn_IOS_RICsubscriptionFailure_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_11_id_RICrequestID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_11_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_11_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_12_id_RANfunctionID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_12_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_12_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_13_id_RICactions_NotAdmitted },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_13_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICaction_NotAdmitted_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_13_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_14_id_CriticalityDiagnostics },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_14_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_14_optional }
-};
-static const asn_ioc_set_t asn_IOS_RICsubscriptionFailure_IEs_1[] = {
-	{ 4, 4, asn_IOS_RICsubscriptionFailure_IEs_1_rows }
-};
-static const long asn_VAL_15_id_RICrequestID = 60030;
-static const long asn_VAL_15_reject = 0;
-static const long asn_VAL_15_mandatory = 2;
-static const long asn_VAL_16_id_RANfunctionID = 60003;
-static const long asn_VAL_16_reject = 0;
-static const long asn_VAL_16_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_RICsubscriptionDeleteRequest_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_15_id_RICrequestID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_15_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_15_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_16_id_RANfunctionID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_16_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_16_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_RICsubscriptionDeleteRequest_IEs_1[] = {
-	{ 2, 4, asn_IOS_RICsubscriptionDeleteRequest_IEs_1_rows }
-};
-static const long asn_VAL_17_id_RICrequestID = 60030;
-static const long asn_VAL_17_reject = 0;
-static const long asn_VAL_17_mandatory = 2;
-static const long asn_VAL_18_id_RANfunctionID = 60003;
-static const long asn_VAL_18_reject = 0;
-static const long asn_VAL_18_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_RICsubscriptionDeleteResponse_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_17_id_RICrequestID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_17_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_17_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_18_id_RANfunctionID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_18_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_18_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_RICsubscriptionDeleteResponse_IEs_1[] = {
-	{ 2, 4, asn_IOS_RICsubscriptionDeleteResponse_IEs_1_rows }
-};
-static const long asn_VAL_19_id_RICrequestID = 60030;
-static const long asn_VAL_19_reject = 0;
-static const long asn_VAL_19_mandatory = 2;
-static const long asn_VAL_20_id_RANfunctionID = 60003;
-static const long asn_VAL_20_reject = 0;
-static const long asn_VAL_20_mandatory = 2;
-static const long asn_VAL_21_id_RICcause = 60020;
-static const long asn_VAL_21_ignore = 1;
-static const long asn_VAL_21_mandatory = 2;
-static const long asn_VAL_22_id_CriticalityDiagnostics = 17;
-static const long asn_VAL_22_ignore = 1;
-static const long asn_VAL_22_optional = 0;
-static const asn_ioc_cell_t asn_IOS_RICsubscriptionDeleteFailure_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_19_id_RICrequestID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_19_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_19_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_20_id_RANfunctionID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_20_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_20_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_21_id_RICcause },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_21_ignore },
-	{ "&Value", aioc__type, &asn_DEF_RICcause },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_21_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_22_id_CriticalityDiagnostics },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_22_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_22_optional }
-};
-static const asn_ioc_set_t asn_IOS_RICsubscriptionDeleteFailure_IEs_1[] = {
-	{ 4, 4, asn_IOS_RICsubscriptionDeleteFailure_IEs_1_rows }
-};
-static const long asn_VAL_23_id_RICrequestID = 60030;
-static const long asn_VAL_23_reject = 0;
-static const long asn_VAL_23_mandatory = 2;
-static const long asn_VAL_24_id_RANfunctionID = 60003;
-static const long asn_VAL_24_reject = 0;
-static const long asn_VAL_24_mandatory = 2;
-static const long asn_VAL_25_id_RICactionID = 60017;
-static const long asn_VAL_25_reject = 0;
-static const long asn_VAL_25_mandatory = 2;
-static const long asn_VAL_26_id_RICindicationSN = 60028;
-static const long asn_VAL_26_reject = 0;
-static const long asn_VAL_26_mandatory = 2;
-static const long asn_VAL_27_id_RICindicationType = 60029;
-static const long asn_VAL_27_reject = 0;
-static const long asn_VAL_27_mandatory = 2;
-static const long asn_VAL_28_id_RICindicationHeader = 60026;
-static const long asn_VAL_28_reject = 0;
-static const long asn_VAL_28_mandatory = 2;
-static const long asn_VAL_29_id_RICindicationMessage = 60027;
-static const long asn_VAL_29_reject = 0;
-static const long asn_VAL_29_mandatory = 2;
-static const long asn_VAL_30_id_RICcallProcessID = 60019;
-static const long asn_VAL_30_reject = 0;
-static const long asn_VAL_30_optional = 0;
-static const asn_ioc_cell_t asn_IOS_RICindication_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_23_id_RICrequestID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_23_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_23_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_24_id_RANfunctionID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_24_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_24_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_25_id_RICactionID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_25_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICactionID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_25_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_26_id_RICindicationSN },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_26_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICindicationSN },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_26_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_27_id_RICindicationType },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_27_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICindicationType },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_27_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_28_id_RICindicationHeader },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_28_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICindicationHeader },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_28_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_29_id_RICindicationMessage },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_29_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICindicationMessage },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_29_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_30_id_RICcallProcessID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_30_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICcallProcessID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_30_optional }
-};
-static const asn_ioc_set_t asn_IOS_RICindication_IEs_1[] = {
-	{ 8, 4, asn_IOS_RICindication_IEs_1_rows }
-};
-static const long asn_VAL_31_id_RICrequestID = 60030;
-static const long asn_VAL_31_reject = 0;
-static const long asn_VAL_31_mandatory = 2;
-static const long asn_VAL_32_id_RANfunctionID = 60003;
-static const long asn_VAL_32_reject = 0;
-static const long asn_VAL_32_mandatory = 2;
-static const long asn_VAL_33_id_RICcallProcessID = 60019;
-static const long asn_VAL_33_reject = 0;
-static const long asn_VAL_33_optional = 0;
-static const long asn_VAL_34_id_RICcontrolHeader = 60022;
-static const long asn_VAL_34_reject = 0;
-static const long asn_VAL_34_mandatory = 2;
-static const long asn_VAL_35_id_RICcontrolMessage = 60023;
-static const long asn_VAL_35_reject = 0;
-static const long asn_VAL_35_mandatory = 2;
-static const long asn_VAL_36_id_RICcontrolAckRequest = 60021;
-static const long asn_VAL_36_reject = 0;
-static const long asn_VAL_36_optional = 0;
-static const asn_ioc_cell_t asn_IOS_RICcontrolRequest_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_31_id_RICrequestID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_31_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_31_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_32_id_RANfunctionID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_32_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_32_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_33_id_RICcallProcessID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_33_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICcallProcessID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_33_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_34_id_RICcontrolHeader },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_34_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICcontrolHeader },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_34_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_35_id_RICcontrolMessage },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_35_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICcontrolMessage },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_35_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_36_id_RICcontrolAckRequest },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_36_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICcontrolAckRequest },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_36_optional }
-};
-static const asn_ioc_set_t asn_IOS_RICcontrolRequest_IEs_1[] = {
-	{ 6, 4, asn_IOS_RICcontrolRequest_IEs_1_rows }
-};
-static const long asn_VAL_37_id_RICrequestID = 60030;
-static const long asn_VAL_37_reject = 0;
-static const long asn_VAL_37_mandatory = 2;
-static const long asn_VAL_38_id_RANfunctionID = 60003;
-static const long asn_VAL_38_reject = 0;
-static const long asn_VAL_38_mandatory = 2;
-static const long asn_VAL_39_id_RICcallProcessID = 60019;
-static const long asn_VAL_39_reject = 0;
-static const long asn_VAL_39_optional = 0;
-static const long asn_VAL_40_id_RICcontrolStatus = 60024;
-static const long asn_VAL_40_reject = 0;
-static const long asn_VAL_40_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_RICcontrolAcknowledge_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_37_id_RICrequestID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_37_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_37_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_38_id_RANfunctionID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_38_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_38_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_39_id_RICcallProcessID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_39_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICcallProcessID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_39_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_40_id_RICcontrolStatus },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_40_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICcontrolStatus },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_40_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_RICcontrolAcknowledge_IEs_1[] = {
-	{ 4, 4, asn_IOS_RICcontrolAcknowledge_IEs_1_rows }
-};
-static const long asn_VAL_41_id_RICrequestID = 60030;
-static const long asn_VAL_41_reject = 0;
-static const long asn_VAL_41_mandatory = 2;
-static const long asn_VAL_42_id_RANfunctionID = 60003;
-static const long asn_VAL_42_reject = 0;
-static const long asn_VAL_42_mandatory = 2;
-static const long asn_VAL_43_id_RICcallProcessID = 60019;
-static const long asn_VAL_43_reject = 0;
-static const long asn_VAL_43_optional = 0;
-static const long asn_VAL_44_id_RICcause = 60020;
-static const long asn_VAL_44_ignore = 1;
-static const long asn_VAL_44_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_RICcontrolFailure_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_41_id_RICrequestID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_41_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICrequestID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_41_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_42_id_RANfunctionID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_42_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_42_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_43_id_RICcallProcessID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_43_reject },
-	{ "&Value", aioc__type, &asn_DEF_RICcallProcessID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_43_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_44_id_RICcause },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_44_ignore },
-	{ "&Value", aioc__type, &asn_DEF_RICcause },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_44_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_RICcontrolFailure_IEs_1[] = {
-	{ 4, 4, asn_IOS_RICcontrolFailure_IEs_1_rows }
-};
-static const long asn_VAL_45_id_RANfunctionsAdded = 60007;
-static const long asn_VAL_45_reject = 0;
-static const long asn_VAL_45_optional = 0;
-static const long asn_VAL_46_id_RANfunctionsModified = 60009;
-static const long asn_VAL_46_reject = 0;
-static const long asn_VAL_46_optional = 0;
-static const long asn_VAL_47_id_RANfunctionsDeleted = 60008;
-static const long asn_VAL_47_reject = 0;
-static const long asn_VAL_47_optional = 0;
-static const asn_ioc_cell_t asn_IOS_RICserviceUpdate_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_45_id_RANfunctionsAdded },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_45_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctions_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_45_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_46_id_RANfunctionsModified },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_46_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctions_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_46_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_47_id_RANfunctionsDeleted },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_47_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionsID_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_47_optional }
-};
-static const asn_ioc_set_t asn_IOS_RICserviceUpdate_IEs_1[] = {
-	{ 3, 4, asn_IOS_RICserviceUpdate_IEs_1_rows }
-};
-static const long asn_VAL_50_id_RANfunctionsAccepted = 60006;
-static const long asn_VAL_50_reject = 0;
-static const long asn_VAL_50_optional = 0;
-static const long asn_VAL_51_id_RANfunctionsRejected = 60010;
-static const long asn_VAL_51_reject = 0;
-static const long asn_VAL_51_optional = 0;
-static const asn_ioc_cell_t asn_IOS_RICserviceUpdateAcknowledge_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_50_id_RANfunctionsAccepted },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_50_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionsID_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_50_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_51_id_RANfunctionsRejected },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_51_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionsIDcause_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_51_optional }
-};
-static const asn_ioc_set_t asn_IOS_RICserviceUpdateAcknowledge_IEs_1[] = {
-	{ 2, 4, asn_IOS_RICserviceUpdateAcknowledge_IEs_1_rows }
-};
-static const long asn_VAL_53_id_RANfunctionsRejected = 60010;
-static const long asn_VAL_53_ignore = 1;
-static const long asn_VAL_53_optional = 0;
-static const long asn_VAL_54_id_TimeToWait = 22;
-static const long asn_VAL_54_ignore = 1;
-static const long asn_VAL_54_optional = 0;
-static const long asn_VAL_55_id_CriticalityDiagnostics = 17;
-static const long asn_VAL_55_ignore = 1;
-static const long asn_VAL_55_optional = 0;
-static const asn_ioc_cell_t asn_IOS_RICserviceUpdateFailure_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_53_id_RANfunctionsRejected },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_53_ignore },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionsIDcause_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_53_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_54_id_TimeToWait },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_54_ignore },
-	{ "&Value", aioc__type, &asn_DEF_TimeToWait },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_54_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_55_id_CriticalityDiagnostics },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_55_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_55_optional }
-};
-static const asn_ioc_set_t asn_IOS_RICserviceUpdateFailure_IEs_1[] = {
-	{ 3, 4, asn_IOS_RICserviceUpdateFailure_IEs_1_rows }
-};
-static const long asn_VAL_56_id_RANfunctionsAccepted = 60006;
-static const long asn_VAL_56_reject = 0;
-static const long asn_VAL_56_optional = 0;
-static const asn_ioc_cell_t asn_IOS_RICserviceQuery_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_56_id_RANfunctionsAccepted },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_56_reject },
-	{ "&Value", aioc__type, &asn_DEF_RANfunctionsID_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_56_optional }
-};
-static const asn_ioc_set_t asn_IOS_RICserviceQuery_IEs_1[] = {
-	{ 1, 4, asn_IOS_RICserviceQuery_IEs_1_rows }
-};
-static const long asn_VAL_57_id_Old_eNB_UE_X2AP_ID = 10;
-static const long asn_VAL_57_ignore = 1;
-static const long asn_VAL_57_optional = 0;
-static const long asn_VAL_58_id_New_eNB_UE_X2AP_ID = 9;
-static const long asn_VAL_58_ignore = 1;
-static const long asn_VAL_58_optional = 0;
-static const long asn_VAL_59_id_Cause = 5;
-static const long asn_VAL_59_ignore = 1;
-static const long asn_VAL_59_optional = 0;
-static const long asn_VAL_60_id_CriticalityDiagnostics = 17;
-static const long asn_VAL_60_ignore = 1;
-static const long asn_VAL_60_optional = 0;
-static const long asn_VAL_61_id_Old_eNB_UE_X2AP_ID_Extension = 156;
-static const long asn_VAL_61_ignore = 1;
-static const long asn_VAL_61_optional = 0;
-static const long asn_VAL_62_id_New_eNB_UE_X2AP_ID_Extension = 155;
-static const long asn_VAL_62_ignore = 1;
-static const long asn_VAL_62_optional = 0;
-static const long asn_VAL_63_id_Old_SgNB_UE_X2AP_ID = 264;
-static const long asn_VAL_63_ignore = 1;
-static const long asn_VAL_63_optional = 0;
-static const asn_ioc_cell_t asn_IOS_ErrorIndication_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_57_id_Old_eNB_UE_X2AP_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_57_ignore },
-	{ "&Value", aioc__type, &asn_DEF_UE_X2AP_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_57_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_58_id_New_eNB_UE_X2AP_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_58_ignore },
-	{ "&Value", aioc__type, &asn_DEF_UE_X2AP_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_58_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_59_id_Cause },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_59_ignore },
-	{ "&Value", aioc__type, &asn_DEF_Cause },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_59_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_60_id_CriticalityDiagnostics },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_60_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_60_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_61_id_Old_eNB_UE_X2AP_ID_Extension },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_61_ignore },
-	{ "&Value", aioc__type, &asn_DEF_UE_X2AP_ID_Extension },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_61_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_62_id_New_eNB_UE_X2AP_ID_Extension },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_62_ignore },
-	{ "&Value", aioc__type, &asn_DEF_UE_X2AP_ID_Extension },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_62_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_63_id_Old_SgNB_UE_X2AP_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_63_ignore },
-	{ "&Value", aioc__type, &asn_DEF_SgNB_UE_X2AP_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_63_optional }
-};
-static const asn_ioc_set_t asn_IOS_ErrorIndication_IEs_1[] = {
-	{ 7, 4, asn_IOS_ErrorIndication_IEs_1_rows }
-};
-static const long asn_VAL_64_id_Cause = 5;
-static const long asn_VAL_64_ignore = 1;
-static const long asn_VAL_64_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_ResetRequest_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_64_id_Cause },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_64_ignore },
-	{ "&Value", aioc__type, &asn_DEF_Cause },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_64_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_ResetRequest_IEs_1[] = {
-	{ 1, 4, asn_IOS_ResetRequest_IEs_1_rows }
-};
-static const long asn_VAL_65_id_CriticalityDiagnostics = 17;
-static const long asn_VAL_65_ignore = 1;
-static const long asn_VAL_65_optional = 0;
-static const asn_ioc_cell_t asn_IOS_ResetResponse_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_65_id_CriticalityDiagnostics },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_65_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_65_optional }
-};
-static const asn_ioc_set_t asn_IOS_ResetResponse_IEs_1[] = {
-	{ 1, 4, asn_IOS_ResetResponse_IEs_1_rows }
-};
-static const long asn_VAL_66_id_GlobalENB_ID = 21;
-static const long asn_VAL_66_reject = 0;
-static const long asn_VAL_66_mandatory = 2;
-static const long asn_VAL_67_id_ServedCells = 20;
-static const long asn_VAL_67_reject = 0;
-static const long asn_VAL_67_mandatory = 2;
-static const long asn_VAL_68_id_GUGroupIDList = 24;
-static const long asn_VAL_68_reject = 0;
-static const long asn_VAL_68_optional = 0;
-static const long asn_VAL_69_id_LHN_ID = 159;
-static const long asn_VAL_69_ignore = 1;
-static const long asn_VAL_69_optional = 0;
-static const asn_ioc_cell_t asn_IOS_X2SetupRequest_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_66_id_GlobalENB_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_66_reject },
-	{ "&Value", aioc__type, &asn_DEF_GlobalENB_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_66_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_67_id_ServedCells },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_67_reject },
-	{ "&Value", aioc__type, &asn_DEF_ServedCells },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_67_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_68_id_GUGroupIDList },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_68_reject },
-	{ "&Value", aioc__type, &asn_DEF_GUGroupIDList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_68_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_69_id_LHN_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_69_ignore },
-	{ "&Value", aioc__type, &asn_DEF_LHN_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_69_optional }
-};
-static const asn_ioc_set_t asn_IOS_X2SetupRequest_IEs_1[] = {
-	{ 4, 4, asn_IOS_X2SetupRequest_IEs_1_rows }
-};
-static const long asn_VAL_70_id_GlobalENB_ID = 21;
-static const long asn_VAL_70_reject = 0;
-static const long asn_VAL_70_mandatory = 2;
-static const long asn_VAL_71_id_ServedCells = 20;
-static const long asn_VAL_71_reject = 0;
-static const long asn_VAL_71_mandatory = 2;
-static const long asn_VAL_72_id_GUGroupIDList = 24;
-static const long asn_VAL_72_reject = 0;
-static const long asn_VAL_72_optional = 0;
-static const long asn_VAL_73_id_CriticalityDiagnostics = 17;
-static const long asn_VAL_73_ignore = 1;
-static const long asn_VAL_73_optional = 0;
-static const long asn_VAL_74_id_LHN_ID = 159;
-static const long asn_VAL_74_ignore = 1;
-static const long asn_VAL_74_optional = 0;
-static const asn_ioc_cell_t asn_IOS_X2SetupResponse_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_70_id_GlobalENB_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_70_reject },
-	{ "&Value", aioc__type, &asn_DEF_GlobalENB_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_70_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_71_id_ServedCells },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_71_reject },
-	{ "&Value", aioc__type, &asn_DEF_ServedCells },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_71_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_72_id_GUGroupIDList },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_72_reject },
-	{ "&Value", aioc__type, &asn_DEF_GUGroupIDList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_72_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_73_id_CriticalityDiagnostics },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_73_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_73_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_74_id_LHN_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_74_ignore },
-	{ "&Value", aioc__type, &asn_DEF_LHN_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_74_optional }
-};
-static const asn_ioc_set_t asn_IOS_X2SetupResponse_IEs_1[] = {
-	{ 5, 4, asn_IOS_X2SetupResponse_IEs_1_rows }
-};
-static const long asn_VAL_75_id_Cause = 5;
-static const long asn_VAL_75_ignore = 1;
-static const long asn_VAL_75_mandatory = 2;
-static const long asn_VAL_76_id_TimeToWait = 22;
-static const long asn_VAL_76_ignore = 1;
-static const long asn_VAL_76_optional = 0;
-static const long asn_VAL_77_id_CriticalityDiagnostics = 17;
-static const long asn_VAL_77_ignore = 1;
-static const long asn_VAL_77_optional = 0;
-static const asn_ioc_cell_t asn_IOS_X2SetupFailure_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_75_id_Cause },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_75_ignore },
-	{ "&Value", aioc__type, &asn_DEF_Cause },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_75_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_76_id_TimeToWait },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_76_ignore },
-	{ "&Value", aioc__type, &asn_DEF_TimeToWait },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_76_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_77_id_CriticalityDiagnostics },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_77_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_77_optional }
-};
-static const asn_ioc_set_t asn_IOS_X2SetupFailure_IEs_1[] = {
-	{ 3, 4, asn_IOS_X2SetupFailure_IEs_1_rows }
-};
-static const long asn_VAL_78_id_CellInformation = 6;
-static const long asn_VAL_78_ignore = 1;
-static const long asn_VAL_78_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_LoadInformation_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_78_id_CellInformation },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_78_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CellInformation_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_78_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_LoadInformation_IEs_1[] = {
-	{ 1, 4, asn_IOS_LoadInformation_IEs_1_rows }
-};
-static const long asn_VAL_80_id_ServedCellsToAdd = 25;
-static const long asn_VAL_80_reject = 0;
-static const long asn_VAL_80_optional = 0;
-static const long asn_VAL_81_id_ServedCellsToModify = 26;
-static const long asn_VAL_81_reject = 0;
-static const long asn_VAL_81_optional = 0;
-static const long asn_VAL_82_id_ServedCellsToDelete = 27;
-static const long asn_VAL_82_reject = 0;
-static const long asn_VAL_82_optional = 0;
-static const long asn_VAL_83_id_GUGroupIDToAddList = 34;
-static const long asn_VAL_83_reject = 0;
-static const long asn_VAL_83_optional = 0;
-static const long asn_VAL_84_id_GUGroupIDToDeleteList = 35;
-static const long asn_VAL_84_reject = 0;
-static const long asn_VAL_84_optional = 0;
-static const long asn_VAL_85_id_CoverageModificationList = 143;
-static const long asn_VAL_85_reject = 0;
-static const long asn_VAL_85_optional = 0;
-static const asn_ioc_cell_t asn_IOS_ENBConfigurationUpdate_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_80_id_ServedCellsToAdd },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_80_reject },
-	{ "&Value", aioc__type, &asn_DEF_ServedCells },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_80_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_81_id_ServedCellsToModify },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_81_reject },
-	{ "&Value", aioc__type, &asn_DEF_ServedCellsToModify },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_81_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_82_id_ServedCellsToDelete },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_82_reject },
-	{ "&Value", aioc__type, &asn_DEF_Old_ECGIs },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_82_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_83_id_GUGroupIDToAddList },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_83_reject },
-	{ "&Value", aioc__type, &asn_DEF_GUGroupIDList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_83_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_84_id_GUGroupIDToDeleteList },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_84_reject },
-	{ "&Value", aioc__type, &asn_DEF_GUGroupIDList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_84_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_85_id_CoverageModificationList },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_85_reject },
-	{ "&Value", aioc__type, &asn_DEF_CoverageModificationList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_85_optional }
-};
-static const asn_ioc_set_t asn_IOS_ENBConfigurationUpdate_IEs_1[] = {
-	{ 6, 4, asn_IOS_ENBConfigurationUpdate_IEs_1_rows }
-};
-static const long asn_VAL_86_id_CriticalityDiagnostics = 17;
-static const long asn_VAL_86_ignore = 1;
-static const long asn_VAL_86_optional = 0;
-static const asn_ioc_cell_t asn_IOS_ENBConfigurationUpdateAcknowledge_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_86_id_CriticalityDiagnostics },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_86_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_86_optional }
-};
-static const asn_ioc_set_t asn_IOS_ENBConfigurationUpdateAcknowledge_IEs_1[] = {
-	{ 1, 4, asn_IOS_ENBConfigurationUpdateAcknowledge_IEs_1_rows }
-};
-static const long asn_VAL_87_id_Cause = 5;
-static const long asn_VAL_87_ignore = 1;
-static const long asn_VAL_87_mandatory = 2;
-static const long asn_VAL_88_id_TimeToWait = 22;
-static const long asn_VAL_88_ignore = 1;
-static const long asn_VAL_88_optional = 0;
-static const long asn_VAL_89_id_CriticalityDiagnostics = 17;
-static const long asn_VAL_89_ignore = 1;
-static const long asn_VAL_89_optional = 0;
-static const asn_ioc_cell_t asn_IOS_ENBConfigurationUpdateFailure_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_87_id_Cause },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_87_ignore },
-	{ "&Value", aioc__type, &asn_DEF_Cause },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_87_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_88_id_TimeToWait },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_88_ignore },
-	{ "&Value", aioc__type, &asn_DEF_TimeToWait },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_88_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_89_id_CriticalityDiagnostics },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_89_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_89_optional }
-};
-static const asn_ioc_set_t asn_IOS_ENBConfigurationUpdateFailure_IEs_1[] = {
-	{ 3, 4, asn_IOS_ENBConfigurationUpdateFailure_IEs_1_rows }
-};
-static const long asn_VAL_90_id_ENB1_Measurement_ID = 39;
-static const long asn_VAL_90_reject = 0;
-static const long asn_VAL_90_mandatory = 2;
-static const long asn_VAL_91_id_ENB2_Measurement_ID = 40;
-static const long asn_VAL_91_ignore = 1;
-static const long asn_VAL_91_conditional = 1;
-static const long asn_VAL_92_id_Registration_Request = 28;
-static const long asn_VAL_92_reject = 0;
-static const long asn_VAL_92_mandatory = 2;
-static const long asn_VAL_93_id_ReportCharacteristics = 38;
-static const long asn_VAL_93_reject = 0;
-static const long asn_VAL_93_optional = 0;
-static const long asn_VAL_94_id_CellToReport = 29;
-static const long asn_VAL_94_ignore = 1;
-static const long asn_VAL_94_mandatory = 2;
-static const long asn_VAL_95_id_ReportingPeriodicity = 30;
-static const long asn_VAL_95_ignore = 1;
-static const long asn_VAL_95_optional = 0;
-static const long asn_VAL_96_id_PartialSuccessIndicator = 64;
-static const long asn_VAL_96_ignore = 1;
-static const long asn_VAL_96_optional = 0;
-static const long asn_VAL_97_id_ReportingPeriodicityRSRPMR = 109;
-static const long asn_VAL_97_ignore = 1;
-static const long asn_VAL_97_optional = 0;
-static const long asn_VAL_98_id_ReportingPeriodicityCSIR = 145;
-static const long asn_VAL_98_ignore = 1;
-static const long asn_VAL_98_optional = 0;
-static const asn_ioc_cell_t asn_IOS_ResourceStatusRequest_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_90_id_ENB1_Measurement_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_90_reject },
-	{ "&Value", aioc__type, &asn_DEF_Measurement_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_90_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_91_id_ENB2_Measurement_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_91_ignore },
-	{ "&Value", aioc__type, &asn_DEF_Measurement_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_91_conditional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_92_id_Registration_Request },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_92_reject },
-	{ "&Value", aioc__type, &asn_DEF_Registration_Request },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_92_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_93_id_ReportCharacteristics },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_93_reject },
-	{ "&Value", aioc__type, &asn_DEF_ReportCharacteristics },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_93_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_94_id_CellToReport },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_94_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CellToReport_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_94_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_95_id_ReportingPeriodicity },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_95_ignore },
-	{ "&Value", aioc__type, &asn_DEF_ReportingPeriodicity },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_95_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_96_id_PartialSuccessIndicator },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_96_ignore },
-	{ "&Value", aioc__type, &asn_DEF_PartialSuccessIndicator },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_96_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_97_id_ReportingPeriodicityRSRPMR },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_97_ignore },
-	{ "&Value", aioc__type, &asn_DEF_ReportingPeriodicityRSRPMR },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_97_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_98_id_ReportingPeriodicityCSIR },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_98_ignore },
-	{ "&Value", aioc__type, &asn_DEF_ReportingPeriodicityCSIR },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_98_optional }
-};
-static const asn_ioc_set_t asn_IOS_ResourceStatusRequest_IEs_1[] = {
-	{ 9, 4, asn_IOS_ResourceStatusRequest_IEs_1_rows }
-};
-static const long asn_VAL_100_id_ENB1_Measurement_ID = 39;
-static const long asn_VAL_100_reject = 0;
-static const long asn_VAL_100_mandatory = 2;
-static const long asn_VAL_101_id_ENB2_Measurement_ID = 40;
-static const long asn_VAL_101_reject = 0;
-static const long asn_VAL_101_mandatory = 2;
-static const long asn_VAL_102_id_CriticalityDiagnostics = 17;
-static const long asn_VAL_102_ignore = 1;
-static const long asn_VAL_102_optional = 0;
-static const long asn_VAL_103_id_MeasurementInitiationResult_List = 65;
-static const long asn_VAL_103_ignore = 1;
-static const long asn_VAL_103_optional = 0;
-static const asn_ioc_cell_t asn_IOS_ResourceStatusResponse_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_100_id_ENB1_Measurement_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_100_reject },
-	{ "&Value", aioc__type, &asn_DEF_Measurement_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_100_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_101_id_ENB2_Measurement_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_101_reject },
-	{ "&Value", aioc__type, &asn_DEF_Measurement_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_101_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_102_id_CriticalityDiagnostics },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_102_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_102_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_103_id_MeasurementInitiationResult_List },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_103_ignore },
-	{ "&Value", aioc__type, &asn_DEF_MeasurementInitiationResult_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_103_optional }
-};
-static const asn_ioc_set_t asn_IOS_ResourceStatusResponse_IEs_1[] = {
-	{ 4, 4, asn_IOS_ResourceStatusResponse_IEs_1_rows }
-};
-static const long asn_VAL_106_id_ENB1_Measurement_ID = 39;
-static const long asn_VAL_106_reject = 0;
-static const long asn_VAL_106_mandatory = 2;
-static const long asn_VAL_107_id_ENB2_Measurement_ID = 40;
-static const long asn_VAL_107_reject = 0;
-static const long asn_VAL_107_mandatory = 2;
-static const long asn_VAL_108_id_Cause = 5;
-static const long asn_VAL_108_ignore = 1;
-static const long asn_VAL_108_mandatory = 2;
-static const long asn_VAL_109_id_CriticalityDiagnostics = 17;
-static const long asn_VAL_109_ignore = 1;
-static const long asn_VAL_109_optional = 0;
-static const long asn_VAL_110_id_CompleteFailureCauseInformation_List = 68;
-static const long asn_VAL_110_ignore = 1;
-static const long asn_VAL_110_optional = 0;
-static const asn_ioc_cell_t asn_IOS_ResourceStatusFailure_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_106_id_ENB1_Measurement_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_106_reject },
-	{ "&Value", aioc__type, &asn_DEF_Measurement_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_106_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_107_id_ENB2_Measurement_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_107_reject },
-	{ "&Value", aioc__type, &asn_DEF_Measurement_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_107_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_108_id_Cause },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_108_ignore },
-	{ "&Value", aioc__type, &asn_DEF_Cause },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_108_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_109_id_CriticalityDiagnostics },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_109_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_109_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_110_id_CompleteFailureCauseInformation_List },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_110_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CompleteFailureCauseInformation_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_110_optional }
-};
-static const asn_ioc_set_t asn_IOS_ResourceStatusFailure_IEs_1[] = {
-	{ 5, 4, asn_IOS_ResourceStatusFailure_IEs_1_rows }
-};
-static const long asn_VAL_112_id_ENB1_Measurement_ID = 39;
-static const long asn_VAL_112_reject = 0;
-static const long asn_VAL_112_mandatory = 2;
-static const long asn_VAL_113_id_ENB2_Measurement_ID = 40;
-static const long asn_VAL_113_reject = 0;
-static const long asn_VAL_113_mandatory = 2;
-static const long asn_VAL_114_id_CellMeasurementResult = 32;
-static const long asn_VAL_114_ignore = 1;
-static const long asn_VAL_114_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_ResourceStatusUpdate_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_112_id_ENB1_Measurement_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_112_reject },
-	{ "&Value", aioc__type, &asn_DEF_Measurement_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_112_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_113_id_ENB2_Measurement_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_113_reject },
-	{ "&Value", aioc__type, &asn_DEF_Measurement_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_113_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_114_id_CellMeasurementResult },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_114_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CellMeasurementResult_List },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_114_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_ResourceStatusUpdate_IEs_1[] = {
-	{ 3, 4, asn_IOS_ResourceStatusUpdate_IEs_1_rows }
-};
-static const long asn_VAL_116_id_MeNB_UE_X2AP_ID = 111;
-static const long asn_VAL_116_reject = 0;
-static const long asn_VAL_116_mandatory = 2;
-static const long asn_VAL_117_id_SeNB_UE_X2AP_ID = 112;
-static const long asn_VAL_117_reject = 0;
-static const long asn_VAL_117_mandatory = 2;
-static const long asn_VAL_118_id_ResponseInformationSeNBReconfComp = 123;
-static const long asn_VAL_118_ignore = 1;
-static const long asn_VAL_118_mandatory = 2;
-static const long asn_VAL_119_id_MeNB_UE_X2AP_ID_Extension = 157;
-static const long asn_VAL_119_reject = 0;
-static const long asn_VAL_119_optional = 0;
-static const long asn_VAL_120_id_SeNB_UE_X2AP_ID_Extension = 158;
-static const long asn_VAL_120_reject = 0;
-static const long asn_VAL_120_optional = 0;
-static const asn_ioc_cell_t asn_IOS_SeNBReconfigurationComplete_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_116_id_MeNB_UE_X2AP_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_116_reject },
-	{ "&Value", aioc__type, &asn_DEF_UE_X2AP_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_116_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_117_id_SeNB_UE_X2AP_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_117_reject },
-	{ "&Value", aioc__type, &asn_DEF_UE_X2AP_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_117_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_118_id_ResponseInformationSeNBReconfComp },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_118_ignore },
-	{ "&Value", aioc__type, &asn_DEF_ResponseInformationSeNBReconfComp },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_118_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_119_id_MeNB_UE_X2AP_ID_Extension },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_119_reject },
-	{ "&Value", aioc__type, &asn_DEF_UE_X2AP_ID_Extension },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_119_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_120_id_SeNB_UE_X2AP_ID_Extension },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_120_reject },
-	{ "&Value", aioc__type, &asn_DEF_UE_X2AP_ID_Extension },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_120_optional }
-};
-static const asn_ioc_set_t asn_IOS_SeNBReconfigurationComplete_IEs_1[] = {
-	{ 5, 4, asn_IOS_SeNBReconfigurationComplete_IEs_1_rows }
-};
-static const long asn_VAL_121_id_InitiatingNodeType_EndcX2Setup = 244;
-static const long asn_VAL_121_reject = 0;
-static const long asn_VAL_121_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_ENDCX2SetupRequest_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_121_id_InitiatingNodeType_EndcX2Setup },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_121_reject },
-	{ "&Value", aioc__type, &asn_DEF_InitiatingNodeType_EndcX2Setup },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_121_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_ENDCX2SetupRequest_IEs_1[] = {
-	{ 1, 4, asn_IOS_ENDCX2SetupRequest_IEs_1_rows }
-};
-static const long asn_VAL_122_id_GlobalENB_ID = 21;
-static const long asn_VAL_122_reject = 0;
-static const long asn_VAL_122_mandatory = 2;
-static const long asn_VAL_123_id_ServedEUTRAcellsENDCX2ManagementList = 250;
-static const long asn_VAL_123_reject = 0;
-static const long asn_VAL_123_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_ENB_ENDCX2SetupReqIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_122_id_GlobalENB_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_122_reject },
-	{ "&Value", aioc__type, &asn_DEF_GlobalENB_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_122_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_123_id_ServedEUTRAcellsENDCX2ManagementList },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_123_reject },
-	{ "&Value", aioc__type, &asn_DEF_ServedEUTRAcellsENDCX2ManagementList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_123_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_ENB_ENDCX2SetupReqIEs_1[] = {
-	{ 2, 4, asn_IOS_ENB_ENDCX2SetupReqIEs_1_rows }
-};
-static const long asn_VAL_124_id_Globalen_gNB_ID = 252;
-static const long asn_VAL_124_reject = 0;
-static const long asn_VAL_124_mandatory = 2;
-static const long asn_VAL_125_id_ServedNRcellsENDCX2ManagementList = 253;
-static const long asn_VAL_125_reject = 0;
-static const long asn_VAL_125_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_En_gNB_ENDCX2SetupReqIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_124_id_Globalen_gNB_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_124_reject },
-	{ "&Value", aioc__type, &asn_DEF_GlobalGNB_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_124_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_125_id_ServedNRcellsENDCX2ManagementList },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_125_reject },
-	{ "&Value", aioc__type, &asn_DEF_ServedNRcellsENDCX2ManagementList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_125_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_En_gNB_ENDCX2SetupReqIEs_1[] = {
-	{ 2, 4, asn_IOS_En_gNB_ENDCX2SetupReqIEs_1_rows }
-};
-static const long asn_VAL_126_id_RespondingNodeType_EndcX2Setup = 246;
-static const long asn_VAL_126_reject = 0;
-static const long asn_VAL_126_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_ENDCX2SetupResponse_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_126_id_RespondingNodeType_EndcX2Setup },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_126_reject },
-	{ "&Value", aioc__type, &asn_DEF_RespondingNodeType_EndcX2Setup },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_126_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_ENDCX2SetupResponse_IEs_1[] = {
-	{ 1, 4, asn_IOS_ENDCX2SetupResponse_IEs_1_rows }
-};
-static const long asn_VAL_127_id_GlobalENB_ID = 21;
-static const long asn_VAL_127_reject = 0;
-static const long asn_VAL_127_mandatory = 2;
-static const long asn_VAL_128_id_ServedEUTRAcellsENDCX2ManagementList = 250;
-static const long asn_VAL_128_reject = 0;
-static const long asn_VAL_128_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_ENB_ENDCX2SetupReqAckIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_127_id_GlobalENB_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_127_reject },
-	{ "&Value", aioc__type, &asn_DEF_GlobalENB_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_127_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_128_id_ServedEUTRAcellsENDCX2ManagementList },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_128_reject },
-	{ "&Value", aioc__type, &asn_DEF_ServedEUTRAcellsENDCX2ManagementList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_128_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_ENB_ENDCX2SetupReqAckIEs_1[] = {
-	{ 2, 4, asn_IOS_ENB_ENDCX2SetupReqAckIEs_1_rows }
-};
-static const long asn_VAL_129_id_Globalen_gNB_ID = 252;
-static const long asn_VAL_129_reject = 0;
-static const long asn_VAL_129_mandatory = 2;
-static const long asn_VAL_130_id_ServedNRcellsENDCX2ManagementList = 253;
-static const long asn_VAL_130_reject = 0;
-static const long asn_VAL_130_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_En_gNB_ENDCX2SetupReqAckIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_129_id_Globalen_gNB_ID },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_129_reject },
-	{ "&Value", aioc__type, &asn_DEF_GlobalGNB_ID },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_129_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_130_id_ServedNRcellsENDCX2ManagementList },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_130_reject },
-	{ "&Value", aioc__type, &asn_DEF_ServedNRcellsENDCX2ManagementList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_130_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_En_gNB_ENDCX2SetupReqAckIEs_1[] = {
-	{ 2, 4, asn_IOS_En_gNB_ENDCX2SetupReqAckIEs_1_rows }
-};
-static const long asn_VAL_131_id_Cause = 5;
-static const long asn_VAL_131_ignore = 1;
-static const long asn_VAL_131_mandatory = 2;
-static const long asn_VAL_132_id_CriticalityDiagnostics = 17;
-static const long asn_VAL_132_ignore = 1;
-static const long asn_VAL_132_optional = 0;
-static const long asn_VAL_133_id_TimeToWait = 22;
-static const long asn_VAL_133_ignore = 1;
-static const long asn_VAL_133_optional = 0;
-static const asn_ioc_cell_t asn_IOS_ENDCX2SetupFailure_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_131_id_Cause },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_131_ignore },
-	{ "&Value", aioc__type, &asn_DEF_Cause },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_131_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_132_id_CriticalityDiagnostics },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_132_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_132_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_133_id_TimeToWait },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_133_ignore },
-	{ "&Value", aioc__type, &asn_DEF_TimeToWait },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_133_optional }
-};
-static const asn_ioc_set_t asn_IOS_ENDCX2SetupFailure_IEs_1[] = {
-	{ 3, 4, asn_IOS_ENDCX2SetupFailure_IEs_1_rows }
-};
-static const long asn_VAL_134_id_InitiatingNodeType_EndcConfigUpdate = 245;
-static const long asn_VAL_134_reject = 0;
-static const long asn_VAL_134_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_ENDCConfigurationUpdate_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_134_id_InitiatingNodeType_EndcConfigUpdate },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_134_reject },
-	{ "&Value", aioc__type, &asn_DEF_InitiatingNodeType_EndcConfigUpdate },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_134_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_ENDCConfigurationUpdate_IEs_1[] = {
-	{ 1, 4, asn_IOS_ENDCConfigurationUpdate_IEs_1_rows }
-};
-static const long asn_VAL_135_id_CellAssistanceInformation = 251;
-static const long asn_VAL_135_reject = 0;
-static const long asn_VAL_135_optional = 0;
-static const long asn_VAL_136_id_ServedEUTRAcellsENDCX2ManagementList = 250;
-static const long asn_VAL_136_reject = 0;
-static const long asn_VAL_136_optional = 0;
-static const long asn_VAL_137_id_ServedEUTRAcellsToModifyListENDCConfUpd = 259;
-static const long asn_VAL_137_reject = 0;
-static const long asn_VAL_137_optional = 0;
-static const long asn_VAL_138_id_ServedEUTRAcellsToDeleteListENDCConfUpd = 260;
-static const long asn_VAL_138_reject = 0;
-static const long asn_VAL_138_optional = 0;
-static const asn_ioc_cell_t asn_IOS_ENB_ENDCConfigUpdateIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_135_id_CellAssistanceInformation },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_135_reject },
-	{ "&Value", aioc__type, &asn_DEF_CellAssistanceInformation },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_135_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_136_id_ServedEUTRAcellsENDCX2ManagementList },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_136_reject },
-	{ "&Value", aioc__type, &asn_DEF_ServedEUTRAcellsENDCX2ManagementList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_136_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_137_id_ServedEUTRAcellsToModifyListENDCConfUpd },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_137_reject },
-	{ "&Value", aioc__type, &asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_137_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_138_id_ServedEUTRAcellsToDeleteListENDCConfUpd },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_138_reject },
-	{ "&Value", aioc__type, &asn_DEF_ServedEUTRAcellsToDeleteListENDCConfUpd },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_138_optional }
-};
-static const asn_ioc_set_t asn_IOS_ENB_ENDCConfigUpdateIEs_1[] = {
-	{ 4, 4, asn_IOS_ENB_ENDCConfigUpdateIEs_1_rows }
-};
-static const long asn_VAL_139_id_ServedNRcellsENDCX2ManagementList = 253;
-static const long asn_VAL_139_reject = 0;
-static const long asn_VAL_139_optional = 0;
-static const long asn_VAL_140_id_ServedNRcellsToModifyListENDCConfUpd = 261;
-static const long asn_VAL_140_reject = 0;
-static const long asn_VAL_140_optional = 0;
-static const long asn_VAL_141_id_ServedNRcellsToDeleteListENDCConfUpd = 262;
-static const long asn_VAL_141_reject = 0;
-static const long asn_VAL_141_optional = 0;
-static const asn_ioc_cell_t asn_IOS_En_gNB_ENDCConfigUpdateIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_139_id_ServedNRcellsENDCX2ManagementList },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_139_reject },
-	{ "&Value", aioc__type, &asn_DEF_ServedNRcellsENDCX2ManagementList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_139_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_140_id_ServedNRcellsToModifyListENDCConfUpd },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_140_reject },
-	{ "&Value", aioc__type, &asn_DEF_ServedNRcellsToModifyENDCConfUpdList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_140_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_141_id_ServedNRcellsToDeleteListENDCConfUpd },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_141_reject },
-	{ "&Value", aioc__type, &asn_DEF_ServedNRcellsToDeleteENDCConfUpdList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_141_optional }
-};
-static const asn_ioc_set_t asn_IOS_En_gNB_ENDCConfigUpdateIEs_1[] = {
-	{ 3, 4, asn_IOS_En_gNB_ENDCConfigUpdateIEs_1_rows }
-};
-static const long asn_VAL_142_id_RespondingNodeType_EndcConfigUpdate = 247;
-static const long asn_VAL_142_reject = 0;
-static const long asn_VAL_142_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_ENDCConfigurationUpdateAcknowledge_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_142_id_RespondingNodeType_EndcConfigUpdate },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_142_reject },
-	{ "&Value", aioc__type, &asn_DEF_RespondingNodeType_EndcConfigUpdate },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_142_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_ENDCConfigurationUpdateAcknowledge_IEs_1[] = {
-	{ 1, 4, asn_IOS_ENDCConfigurationUpdateAcknowledge_IEs_1_rows }
-};
-static const long asn_VAL_143_id_ServedNRcellsENDCX2ManagementList = 253;
-static const long asn_VAL_143_reject = 0;
-static const long asn_VAL_143_optional = 0;
-static const asn_ioc_cell_t asn_IOS_En_gNB_ENDCConfigUpdateAckIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_143_id_ServedNRcellsENDCX2ManagementList },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_143_reject },
-	{ "&Value", aioc__type, &asn_DEF_ServedNRcellsENDCX2ManagementList },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_143_optional }
-};
-static const asn_ioc_set_t asn_IOS_En_gNB_ENDCConfigUpdateAckIEs_1[] = {
-	{ 1, 4, asn_IOS_En_gNB_ENDCConfigUpdateAckIEs_1_rows }
-};
-static const long asn_VAL_144_id_Cause = 5;
-static const long asn_VAL_144_ignore = 1;
-static const long asn_VAL_144_mandatory = 2;
-static const long asn_VAL_145_id_CriticalityDiagnostics = 17;
-static const long asn_VAL_145_ignore = 1;
-static const long asn_VAL_145_optional = 0;
-static const long asn_VAL_146_id_TimeToWait = 22;
-static const long asn_VAL_146_ignore = 1;
-static const long asn_VAL_146_optional = 0;
-static const asn_ioc_cell_t asn_IOS_ENDCConfigurationUpdateFailure_IEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_144_id_Cause },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_144_ignore },
-	{ "&Value", aioc__type, &asn_DEF_Cause },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_144_mandatory },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_145_id_CriticalityDiagnostics },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_145_ignore },
-	{ "&Value", aioc__type, &asn_DEF_CriticalityDiagnostics },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_145_optional },
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_146_id_TimeToWait },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_146_ignore },
-	{ "&Value", aioc__type, &asn_DEF_TimeToWait },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_146_optional }
-};
-static const asn_ioc_set_t asn_IOS_ENDCConfigurationUpdateFailure_IEs_1[] = {
-	{ 3, 4, asn_IOS_ENDCConfigurationUpdateFailure_IEs_1_rows }
-};
-static const long asn_VAL_147_id_GNBOverloadInformation = 310;
-static const long asn_VAL_147_ignore = 1;
-static const long asn_VAL_147_mandatory = 2;
-static const asn_ioc_cell_t asn_IOS_GNBStatusIndicationIEs_1_rows[] = {
-	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_147_id_GNBOverloadInformation },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_147_ignore },
-	{ "&Value", aioc__type, &asn_DEF_GNBOverloadInformation },
-	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_147_mandatory }
-};
-static const asn_ioc_set_t asn_IOS_GNBStatusIndicationIEs_1[] = {
-	{ 1, 4, asn_IOS_GNBStatusIndicationIEs_1_rows }
-};
-static int
-memb_id_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICaction_ToBeSetup_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICaction_ToBeSetup_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_ToBeSetup_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICaction_ToBeSetup_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICaction_ToBeSetup_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_ToBeSetup_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICaction_Admitted_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICaction_Admitted_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_Admitted_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICaction_Admitted_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICaction_Admitted_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_Admitted_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICaction_NotAdmitted_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICaction_NotAdmitted_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_NotAdmitted_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICaction_NotAdmitted_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICaction_NotAdmitted_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_NotAdmitted_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RANfunction_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RANfunction_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunction_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RANfunction_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RANfunction_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunction_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RANfunctionID_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RANfunctionID_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionID_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RANfunctionID_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RANfunctionID_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionID_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RANfunctionIDcause_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RANfunctionIDcause_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionIDcause_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RANfunctionIDcause_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RANfunctionIDcause_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionIDcause_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_CellInformation_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_CellInformation_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CellInformation_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_CellInformation_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_CellInformation_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CellInformation_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_CellToReport_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_CellToReport_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CellToReport_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_CellToReport_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_CellToReport_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CellToReport_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_MeasurementInitiationResult_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_MeasurementInitiationResult_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct MeasurementInitiationResult_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_MeasurementInitiationResult_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_MeasurementInitiationResult_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct MeasurementInitiationResult_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_MeasurementFailureCause_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_MeasurementFailureCause_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct MeasurementFailureCause_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_MeasurementFailureCause_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_MeasurementFailureCause_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct MeasurementFailureCause_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_CompleteFailureCauseInformation_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_CompleteFailureCauseInformation_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CompleteFailureCauseInformation_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_CompleteFailureCauseInformation_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_CompleteFailureCauseInformation_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CompleteFailureCauseInformation_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_CellMeasurementResult_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_CellMeasurementResult_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CellMeasurementResult_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_CellMeasurementResult_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_CellMeasurementResult_ItemIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CellMeasurementResult_ItemIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICsubscriptionRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionRequest_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionRequest_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICsubscriptionRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionRequest_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionRequest_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICsubscriptionResponse_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionResponse_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionResponse_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICsubscriptionResponse_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionResponse_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionResponse_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICsubscriptionFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICsubscriptionFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICsubscriptionDeleteRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteRequest_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteRequest_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICsubscriptionDeleteRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteRequest_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteRequest_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICsubscriptionDeleteResponse_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteResponse_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteResponse_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICsubscriptionDeleteResponse_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteResponse_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteResponse_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICsubscriptionDeleteFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICsubscriptionDeleteFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICindication_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICindication_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICindication_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICindication_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICindication_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICindication_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICcontrolRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICcontrolRequest_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolRequest_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICcontrolRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICcontrolRequest_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolRequest_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICcontrolAcknowledge_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICcontrolAcknowledge_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolAcknowledge_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICcontrolAcknowledge_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICcontrolAcknowledge_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolAcknowledge_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICcontrolFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICcontrolFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICcontrolFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICcontrolFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICserviceUpdate_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdate_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdate_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICserviceUpdate_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdate_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdate_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICserviceUpdateAcknowledge_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateAcknowledge_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateAcknowledge_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICserviceUpdateAcknowledge_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateAcknowledge_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateAcknowledge_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICserviceUpdateFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICserviceUpdateFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICserviceQuery_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICserviceQuery_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceQuery_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICserviceQuery_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_RICserviceQuery_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceQuery_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_105(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ErrorIndication_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ErrorIndication_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ErrorIndication_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_105(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ErrorIndication_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ErrorIndication_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ErrorIndication_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_105(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_109(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ResetRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ResetRequest_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetRequest_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_109(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ResetRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ResetRequest_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetRequest_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_109(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_113(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ResetResponse_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ResetResponse_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetResponse_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_113(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ResetResponse_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ResetResponse_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetResponse_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_113(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_117(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_X2SetupRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_X2SetupRequest_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct X2SetupRequest_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_117(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_X2SetupRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_X2SetupRequest_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct X2SetupRequest_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_117(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_121(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_X2SetupResponse_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_X2SetupResponse_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct X2SetupResponse_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_121(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_X2SetupResponse_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_X2SetupResponse_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct X2SetupResponse_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_121(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_125(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_X2SetupFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_X2SetupFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct X2SetupFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_125(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_X2SetupFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_X2SetupFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct X2SetupFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_125(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_129(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_LoadInformation_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_LoadInformation_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct LoadInformation_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_129(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_LoadInformation_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_LoadInformation_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct LoadInformation_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_129(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_133(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ENBConfigurationUpdate_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENBConfigurationUpdate_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENBConfigurationUpdate_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_133(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ENBConfigurationUpdate_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENBConfigurationUpdate_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENBConfigurationUpdate_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_133(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_137(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ENBConfigurationUpdateAcknowledge_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENBConfigurationUpdateAcknowledge_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENBConfigurationUpdateAcknowledge_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_137(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ENBConfigurationUpdateAcknowledge_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENBConfigurationUpdateAcknowledge_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENBConfigurationUpdateAcknowledge_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_137(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_141(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ENBConfigurationUpdateFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENBConfigurationUpdateFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENBConfigurationUpdateFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_141(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ENBConfigurationUpdateFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENBConfigurationUpdateFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENBConfigurationUpdateFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_141(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_145(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ResourceStatusRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ResourceStatusRequest_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResourceStatusRequest_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_145(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ResourceStatusRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ResourceStatusRequest_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResourceStatusRequest_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_145(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_149(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ResourceStatusResponse_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ResourceStatusResponse_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResourceStatusResponse_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_149(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ResourceStatusResponse_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ResourceStatusResponse_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResourceStatusResponse_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_149(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_153(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ResourceStatusFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ResourceStatusFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResourceStatusFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_153(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ResourceStatusFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ResourceStatusFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResourceStatusFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_153(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_157(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ResourceStatusUpdate_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ResourceStatusUpdate_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResourceStatusUpdate_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_157(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ResourceStatusUpdate_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ResourceStatusUpdate_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResourceStatusUpdate_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_157(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_161(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_SeNBReconfigurationComplete_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_SeNBReconfigurationComplete_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct SeNBReconfigurationComplete_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_161(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_SeNBReconfigurationComplete_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_SeNBReconfigurationComplete_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct SeNBReconfigurationComplete_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_161(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_165(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ENDCX2SetupRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENDCX2SetupRequest_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENDCX2SetupRequest_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_165(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ENDCX2SetupRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENDCX2SetupRequest_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENDCX2SetupRequest_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_165(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_169(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ENB_ENDCX2SetupReqIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENB_ENDCX2SetupReqIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENB_ENDCX2SetupReqIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_169(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ENB_ENDCX2SetupReqIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENB_ENDCX2SetupReqIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENB_ENDCX2SetupReqIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_169(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_173(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_En_gNB_ENDCX2SetupReqIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_En_gNB_ENDCX2SetupReqIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct En_gNB_ENDCX2SetupReqIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_173(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_En_gNB_ENDCX2SetupReqIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_En_gNB_ENDCX2SetupReqIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct En_gNB_ENDCX2SetupReqIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_173(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_177(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ENDCX2SetupResponse_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENDCX2SetupResponse_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENDCX2SetupResponse_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_177(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ENDCX2SetupResponse_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENDCX2SetupResponse_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENDCX2SetupResponse_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_177(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_181(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ENB_ENDCX2SetupReqAckIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENB_ENDCX2SetupReqAckIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENB_ENDCX2SetupReqAckIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_181(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ENB_ENDCX2SetupReqAckIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENB_ENDCX2SetupReqAckIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENB_ENDCX2SetupReqAckIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_181(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_185(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_En_gNB_ENDCX2SetupReqAckIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_En_gNB_ENDCX2SetupReqAckIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct En_gNB_ENDCX2SetupReqAckIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_185(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_En_gNB_ENDCX2SetupReqAckIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_En_gNB_ENDCX2SetupReqAckIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct En_gNB_ENDCX2SetupReqAckIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_185(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_189(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ENDCX2SetupFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENDCX2SetupFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENDCX2SetupFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_189(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ENDCX2SetupFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENDCX2SetupFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENDCX2SetupFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_189(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_193(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ENDCConfigurationUpdate_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENDCConfigurationUpdate_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENDCConfigurationUpdate_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_193(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ENDCConfigurationUpdate_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENDCConfigurationUpdate_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENDCConfigurationUpdate_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_193(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_197(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ENB_ENDCConfigUpdateIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENB_ENDCConfigUpdateIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENB_ENDCConfigUpdateIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_197(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ENB_ENDCConfigUpdateIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENB_ENDCConfigUpdateIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENB_ENDCConfigUpdateIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_197(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_201(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_En_gNB_ENDCConfigUpdateIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_En_gNB_ENDCConfigUpdateIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct En_gNB_ENDCConfigUpdateIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_201(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_En_gNB_ENDCConfigUpdateIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_En_gNB_ENDCConfigUpdateIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct En_gNB_ENDCConfigUpdateIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_201(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_205(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ENDCConfigurationUpdateAcknowledge_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENDCConfigurationUpdateAcknowledge_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENDCConfigurationUpdateAcknowledge_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_205(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ENDCConfigurationUpdateAcknowledge_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENDCConfigurationUpdateAcknowledge_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENDCConfigurationUpdateAcknowledge_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_205(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_209(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_criticality_constraint_209(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_value_constraint_209(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_213(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_En_gNB_ENDCConfigUpdateAckIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_En_gNB_ENDCConfigUpdateAckIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct En_gNB_ENDCConfigUpdateAckIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_213(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_En_gNB_ENDCConfigUpdateAckIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_En_gNB_ENDCConfigUpdateAckIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct En_gNB_ENDCConfigUpdateAckIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_213(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_217(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_ENDCConfigurationUpdateFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENDCConfigurationUpdateFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENDCConfigurationUpdateFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_217(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_ENDCConfigurationUpdateFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_ENDCConfigurationUpdateFailure_IEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ENDCConfigurationUpdateFailure_IEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_217(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static int
-memb_id_constraint_221(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_GNBStatusIndicationIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_GNBStatusIndicationIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 1; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct GNBStatusIndicationIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_221(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_GNBStatusIndicationIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_GNBStatusIndicationIEs_1;
-	size_t constraining_column = 0; /* &id */
-	size_t for_column = 2; /* &Value */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct GNBStatusIndicationIEs, id));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_221(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_per_constraints_t asn_PER_memb_id_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_6 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_7 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_8 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_10 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_11 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_12 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_14 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_15 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_16 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_18 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_19 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_20 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_22 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_23 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_24 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_26 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_27 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_28 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_30 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_31 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_32 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_34 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_35 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_36 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_38 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_39 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_40 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_42 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_43 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_44 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_46 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_47 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_48 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_50 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_51 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_52 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_54 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_55 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_56 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_58 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_59 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_60 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_62 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_63 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_64 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_66 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_67 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_68 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_70 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_71 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_72 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_74 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_75 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_76 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_78 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_79 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_80 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_82 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_83 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_84 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_86 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_87 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_88 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_90 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_91 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_92 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_94 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_95 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_96 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_98 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_99 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_100 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_102 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_103 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_104 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_106 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_107 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_108 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_110 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_111 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_112 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_114 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_115 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_116 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_118 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_119 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_120 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_122 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_123 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_124 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_126 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_127 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_128 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_130 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_131 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_132 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_134 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_135 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_136 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_138 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_139 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_140 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_142 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_143 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_144 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_146 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_147 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_148 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_150 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_151 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_152 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_154 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_155 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_156 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_158 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_159 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_160 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_162 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_163 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_164 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_166 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_167 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_168 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_170 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_171 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_172 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_174 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_175 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_176 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_178 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_179 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_180 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_182 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_183 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_184 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_186 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_187 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_188 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_190 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_191 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_192 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_194 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_195 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_196 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_198 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_199 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_200 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_202 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_203 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_204 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_206 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_207 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_208 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_210 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_211 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_212 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_214 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_215 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_216 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_218 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_219 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_220 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_id_constr_222 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_223 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_224 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_value_4[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs__value, choice.RICaction_ToBeSetup_Item),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICaction_ToBeSetup_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICaction-ToBeSetup-Item"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICaction-ToBeSetup-Item */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = {
-	sizeof(struct RICaction_ToBeSetup_ItemIEs__value),
-	offsetof(struct RICaction_ToBeSetup_ItemIEs__value, _asn_ctx),
-	offsetof(struct RICaction_ToBeSetup_ItemIEs__value, present),
-	sizeof(((struct RICaction_ToBeSetup_ItemIEs__value *)0)->present),
-	asn_MAP_value_tag2el_4,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_4 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_4,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_4	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_ItemIEs_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_2,  memb_id_constraint_1 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICaction_ToBeSetup_ItemIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_3,  memb_criticality_constraint_1 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_4,
-		select_RICaction_ToBeSetup_ItemIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_4,  memb_value_constraint_1 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICaction_ToBeSetup_ItemIEs_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1 = {
-	sizeof(struct RICaction_ToBeSetup_ItemIEs),
-	offsetof(struct RICaction_ToBeSetup_ItemIEs, _asn_ctx),
-	asn_MAP_RICaction_ToBeSetup_ItemIEs_tag2el_1,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_ItemIEs = {
-	"RICaction-ToBeSetup-ItemIEs",
-	"RICaction-ToBeSetup-ItemIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1,
-	sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1)
-		/sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1[0]), /* 1 */
-	asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1)
-		/sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICaction_ToBeSetup_ItemIEs_1,
-	3,	/* Elements count */
-	&asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_8[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs__value, choice.RICaction_Admitted_Item),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICaction_Admitted_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICaction-Admitted-Item"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_8[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICaction-Admitted-Item */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_8 = {
-	sizeof(struct RICaction_Admitted_ItemIEs__value),
-	offsetof(struct RICaction_Admitted_ItemIEs__value, _asn_ctx),
-	offsetof(struct RICaction_Admitted_ItemIEs__value, present),
-	sizeof(((struct RICaction_Admitted_ItemIEs__value *)0)->present),
-	asn_MAP_value_tag2el_8,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_8 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_8,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_8	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICaction_Admitted_ItemIEs_5[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_6,  memb_id_constraint_5 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICaction_Admitted_ItemIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_7,  memb_criticality_constraint_5 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_8,
-		select_RICaction_Admitted_ItemIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_8,  memb_value_constraint_5 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICaction_Admitted_ItemIEs_tags_5[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICaction_Admitted_ItemIEs_tag2el_5[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICaction_Admitted_ItemIEs_specs_5 = {
-	sizeof(struct RICaction_Admitted_ItemIEs),
-	offsetof(struct RICaction_Admitted_ItemIEs, _asn_ctx),
-	asn_MAP_RICaction_Admitted_ItemIEs_tag2el_5,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_ItemIEs = {
-	"RICaction-Admitted-ItemIEs",
-	"RICaction-Admitted-ItemIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICaction_Admitted_ItemIEs_tags_5,
-	sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5)
-		/sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5[0]), /* 1 */
-	asn_DEF_RICaction_Admitted_ItemIEs_tags_5,	/* Same as above */
-	sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5)
-		/sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICaction_Admitted_ItemIEs_5,
-	3,	/* Elements count */
-	&asn_SPC_RICaction_Admitted_ItemIEs_specs_5	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_12[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs__value, choice.RICaction_NotAdmitted_Item),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICaction_NotAdmitted_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICaction-NotAdmitted-Item"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_12[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICaction-NotAdmitted-Item */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_12 = {
-	sizeof(struct RICaction_NotAdmitted_ItemIEs__value),
-	offsetof(struct RICaction_NotAdmitted_ItemIEs__value, _asn_ctx),
-	offsetof(struct RICaction_NotAdmitted_ItemIEs__value, present),
-	sizeof(((struct RICaction_NotAdmitted_ItemIEs__value *)0)->present),
-	asn_MAP_value_tag2el_12,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_12 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_12,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_12	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_ItemIEs_9[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_10,  memb_id_constraint_9 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICaction_NotAdmitted_ItemIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_11,  memb_criticality_constraint_9 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_12,
-		select_RICaction_NotAdmitted_ItemIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_12,  memb_value_constraint_9 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICaction_NotAdmitted_ItemIEs_tag2el_9[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9 = {
-	sizeof(struct RICaction_NotAdmitted_ItemIEs),
-	offsetof(struct RICaction_NotAdmitted_ItemIEs, _asn_ctx),
-	asn_MAP_RICaction_NotAdmitted_ItemIEs_tag2el_9,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_ItemIEs = {
-	"RICaction-NotAdmitted-ItemIEs",
-	"RICaction-NotAdmitted-ItemIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9,
-	sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9)
-		/sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9[0]), /* 1 */
-	asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9,	/* Same as above */
-	sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9)
-		/sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICaction_NotAdmitted_ItemIEs_9,
-	3,	/* Elements count */
-	&asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_16[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs__value, choice.RANfunction_Item),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RANfunction_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunction-Item"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_16[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunction-Item */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_16 = {
-	sizeof(struct RANfunction_ItemIEs__value),
-	offsetof(struct RANfunction_ItemIEs__value, _asn_ctx),
-	offsetof(struct RANfunction_ItemIEs__value, present),
-	sizeof(((struct RANfunction_ItemIEs__value *)0)->present),
-	asn_MAP_value_tag2el_16,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_16 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_16,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_16	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RANfunction_ItemIEs_13[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_14,  memb_id_constraint_13 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RANfunction_ItemIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_15,  memb_criticality_constraint_13 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_16,
-		select_RANfunction_ItemIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_16,  memb_value_constraint_13 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RANfunction_ItemIEs_tags_13[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RANfunction_ItemIEs_tag2el_13[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RANfunction_ItemIEs_specs_13 = {
-	sizeof(struct RANfunction_ItemIEs),
-	offsetof(struct RANfunction_ItemIEs, _asn_ctx),
-	asn_MAP_RANfunction_ItemIEs_tag2el_13,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RANfunction_ItemIEs = {
-	"RANfunction-ItemIEs",
-	"RANfunction-ItemIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RANfunction_ItemIEs_tags_13,
-	sizeof(asn_DEF_RANfunction_ItemIEs_tags_13)
-		/sizeof(asn_DEF_RANfunction_ItemIEs_tags_13[0]), /* 1 */
-	asn_DEF_RANfunction_ItemIEs_tags_13,	/* Same as above */
-	sizeof(asn_DEF_RANfunction_ItemIEs_tags_13)
-		/sizeof(asn_DEF_RANfunction_ItemIEs_tags_13[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RANfunction_ItemIEs_13,
-	3,	/* Elements count */
-	&asn_SPC_RANfunction_ItemIEs_specs_13	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_20[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs__value, choice.RANfunctionID_Item),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RANfunctionID_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionID-Item"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_20[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunctionID-Item */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_20 = {
-	sizeof(struct RANfunctionID_ItemIEs__value),
-	offsetof(struct RANfunctionID_ItemIEs__value, _asn_ctx),
-	offsetof(struct RANfunctionID_ItemIEs__value, present),
-	sizeof(((struct RANfunctionID_ItemIEs__value *)0)->present),
-	asn_MAP_value_tag2el_20,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_20 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_20,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_20	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RANfunctionID_ItemIEs_17[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_18,  memb_id_constraint_17 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RANfunctionID_ItemIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_19,  memb_criticality_constraint_17 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_20,
-		select_RANfunctionID_ItemIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_20,  memb_value_constraint_17 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RANfunctionID_ItemIEs_tags_17[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RANfunctionID_ItemIEs_tag2el_17[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RANfunctionID_ItemIEs_specs_17 = {
-	sizeof(struct RANfunctionID_ItemIEs),
-	offsetof(struct RANfunctionID_ItemIEs, _asn_ctx),
-	asn_MAP_RANfunctionID_ItemIEs_tag2el_17,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RANfunctionID_ItemIEs = {
-	"RANfunctionID-ItemIEs",
-	"RANfunctionID-ItemIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RANfunctionID_ItemIEs_tags_17,
-	sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17)
-		/sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17[0]), /* 1 */
-	asn_DEF_RANfunctionID_ItemIEs_tags_17,	/* Same as above */
-	sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17)
-		/sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RANfunctionID_ItemIEs_17,
-	3,	/* Elements count */
-	&asn_SPC_RANfunctionID_ItemIEs_specs_17	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_24[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs__value, choice.RANfunctionIDcause_Item),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RANfunctionIDcause_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionIDcause-Item"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_24[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunctionIDcause-Item */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_24 = {
-	sizeof(struct RANfunctionIDcause_ItemIEs__value),
-	offsetof(struct RANfunctionIDcause_ItemIEs__value, _asn_ctx),
-	offsetof(struct RANfunctionIDcause_ItemIEs__value, present),
-	sizeof(((struct RANfunctionIDcause_ItemIEs__value *)0)->present),
-	asn_MAP_value_tag2el_24,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_24 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_24,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_24	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RANfunctionIDcause_ItemIEs_21[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_22,  memb_id_constraint_21 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RANfunctionIDcause_ItemIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_23,  memb_criticality_constraint_21 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_24,
-		select_RANfunctionIDcause_ItemIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_24,  memb_value_constraint_21 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RANfunctionIDcause_ItemIEs_tags_21[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RANfunctionIDcause_ItemIEs_tag2el_21[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RANfunctionIDcause_ItemIEs_specs_21 = {
-	sizeof(struct RANfunctionIDcause_ItemIEs),
-	offsetof(struct RANfunctionIDcause_ItemIEs, _asn_ctx),
-	asn_MAP_RANfunctionIDcause_ItemIEs_tag2el_21,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_ItemIEs = {
-	"RANfunctionIDcause-ItemIEs",
-	"RANfunctionIDcause-ItemIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RANfunctionIDcause_ItemIEs_tags_21,
-	sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21)
-		/sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21[0]), /* 1 */
-	asn_DEF_RANfunctionIDcause_ItemIEs_tags_21,	/* Same as above */
-	sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21)
-		/sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RANfunctionIDcause_ItemIEs_21,
-	3,	/* Elements count */
-	&asn_SPC_RANfunctionIDcause_ItemIEs_specs_21	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_28[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_ItemIEs__value, choice.CellInformation_Item),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CellInformation_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CellInformation-Item"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_28[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* CellInformation-Item */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_28 = {
-	sizeof(struct CellInformation_ItemIEs__value),
-	offsetof(struct CellInformation_ItemIEs__value, _asn_ctx),
-	offsetof(struct CellInformation_ItemIEs__value, present),
-	sizeof(((struct CellInformation_ItemIEs__value *)0)->present),
-	asn_MAP_value_tag2el_28,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_28 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_28,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_28	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CellInformation_ItemIEs_25[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_ItemIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_26,  memb_id_constraint_25 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_ItemIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_CellInformation_ItemIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_27,  memb_criticality_constraint_25 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CellInformation_ItemIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_28,
-		select_CellInformation_ItemIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_28,  memb_value_constraint_25 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CellInformation_ItemIEs_tags_25[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CellInformation_ItemIEs_tag2el_25[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CellInformation_ItemIEs_specs_25 = {
-	sizeof(struct CellInformation_ItemIEs),
-	offsetof(struct CellInformation_ItemIEs, _asn_ctx),
-	asn_MAP_CellInformation_ItemIEs_tag2el_25,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CellInformation_ItemIEs = {
-	"CellInformation-ItemIEs",
-	"CellInformation-ItemIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CellInformation_ItemIEs_tags_25,
-	sizeof(asn_DEF_CellInformation_ItemIEs_tags_25)
-		/sizeof(asn_DEF_CellInformation_ItemIEs_tags_25[0]), /* 1 */
-	asn_DEF_CellInformation_ItemIEs_tags_25,	/* Same as above */
-	sizeof(asn_DEF_CellInformation_ItemIEs_tags_25)
-		/sizeof(asn_DEF_CellInformation_ItemIEs_tags_25[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellInformation_ItemIEs_25,
-	3,	/* Elements count */
-	&asn_SPC_CellInformation_ItemIEs_specs_25	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_32[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellToReport_ItemIEs__value, choice.CellToReport_Item),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CellToReport_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CellToReport-Item"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_32[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* CellToReport-Item */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_32 = {
-	sizeof(struct CellToReport_ItemIEs__value),
-	offsetof(struct CellToReport_ItemIEs__value, _asn_ctx),
-	offsetof(struct CellToReport_ItemIEs__value, present),
-	sizeof(((struct CellToReport_ItemIEs__value *)0)->present),
-	asn_MAP_value_tag2el_32,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_32 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_32,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_32	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CellToReport_ItemIEs_29[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellToReport_ItemIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_30,  memb_id_constraint_29 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellToReport_ItemIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_CellToReport_ItemIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_31,  memb_criticality_constraint_29 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CellToReport_ItemIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_32,
-		select_CellToReport_ItemIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_32,  memb_value_constraint_29 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CellToReport_ItemIEs_tags_29[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CellToReport_ItemIEs_tag2el_29[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CellToReport_ItemIEs_specs_29 = {
-	sizeof(struct CellToReport_ItemIEs),
-	offsetof(struct CellToReport_ItemIEs, _asn_ctx),
-	asn_MAP_CellToReport_ItemIEs_tag2el_29,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CellToReport_ItemIEs = {
-	"CellToReport-ItemIEs",
-	"CellToReport-ItemIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CellToReport_ItemIEs_tags_29,
-	sizeof(asn_DEF_CellToReport_ItemIEs_tags_29)
-		/sizeof(asn_DEF_CellToReport_ItemIEs_tags_29[0]), /* 1 */
-	asn_DEF_CellToReport_ItemIEs_tags_29,	/* Same as above */
-	sizeof(asn_DEF_CellToReport_ItemIEs_tags_29)
-		/sizeof(asn_DEF_CellToReport_ItemIEs_tags_29[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellToReport_ItemIEs_29,
-	3,	/* Elements count */
-	&asn_SPC_CellToReport_ItemIEs_specs_29	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_36[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementInitiationResult_ItemIEs__value, choice.MeasurementInitiationResult_Item),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_MeasurementInitiationResult_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"MeasurementInitiationResult-Item"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_36[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* MeasurementInitiationResult-Item */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_36 = {
-	sizeof(struct MeasurementInitiationResult_ItemIEs__value),
-	offsetof(struct MeasurementInitiationResult_ItemIEs__value, _asn_ctx),
-	offsetof(struct MeasurementInitiationResult_ItemIEs__value, present),
-	sizeof(((struct MeasurementInitiationResult_ItemIEs__value *)0)->present),
-	asn_MAP_value_tag2el_36,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_36 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_36,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_36	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_MeasurementInitiationResult_ItemIEs_33[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementInitiationResult_ItemIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_34,  memb_id_constraint_33 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementInitiationResult_ItemIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_MeasurementInitiationResult_ItemIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_35,  memb_criticality_constraint_33 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct MeasurementInitiationResult_ItemIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_36,
-		select_MeasurementInitiationResult_ItemIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_36,  memb_value_constraint_33 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_MeasurementInitiationResult_ItemIEs_tags_33[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_MeasurementInitiationResult_ItemIEs_tag2el_33[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_MeasurementInitiationResult_ItemIEs_specs_33 = {
-	sizeof(struct MeasurementInitiationResult_ItemIEs),
-	offsetof(struct MeasurementInitiationResult_ItemIEs, _asn_ctx),
-	asn_MAP_MeasurementInitiationResult_ItemIEs_tag2el_33,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_MeasurementInitiationResult_ItemIEs = {
-	"MeasurementInitiationResult-ItemIEs",
-	"MeasurementInitiationResult-ItemIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_MeasurementInitiationResult_ItemIEs_tags_33,
-	sizeof(asn_DEF_MeasurementInitiationResult_ItemIEs_tags_33)
-		/sizeof(asn_DEF_MeasurementInitiationResult_ItemIEs_tags_33[0]), /* 1 */
-	asn_DEF_MeasurementInitiationResult_ItemIEs_tags_33,	/* Same as above */
-	sizeof(asn_DEF_MeasurementInitiationResult_ItemIEs_tags_33)
-		/sizeof(asn_DEF_MeasurementInitiationResult_ItemIEs_tags_33[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_MeasurementInitiationResult_ItemIEs_33,
-	3,	/* Elements count */
-	&asn_SPC_MeasurementInitiationResult_ItemIEs_specs_33	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_40[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementFailureCause_ItemIEs__value, choice.MeasurementFailureCause_Item),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_MeasurementFailureCause_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"MeasurementFailureCause-Item"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_40[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* MeasurementFailureCause-Item */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_40 = {
-	sizeof(struct MeasurementFailureCause_ItemIEs__value),
-	offsetof(struct MeasurementFailureCause_ItemIEs__value, _asn_ctx),
-	offsetof(struct MeasurementFailureCause_ItemIEs__value, present),
-	sizeof(((struct MeasurementFailureCause_ItemIEs__value *)0)->present),
-	asn_MAP_value_tag2el_40,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_40 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_40,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_40	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_MeasurementFailureCause_ItemIEs_37[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementFailureCause_ItemIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_38,  memb_id_constraint_37 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementFailureCause_ItemIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_MeasurementFailureCause_ItemIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_39,  memb_criticality_constraint_37 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct MeasurementFailureCause_ItemIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_40,
-		select_MeasurementFailureCause_ItemIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_40,  memb_value_constraint_37 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_MeasurementFailureCause_ItemIEs_tags_37[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_MeasurementFailureCause_ItemIEs_tag2el_37[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_MeasurementFailureCause_ItemIEs_specs_37 = {
-	sizeof(struct MeasurementFailureCause_ItemIEs),
-	offsetof(struct MeasurementFailureCause_ItemIEs, _asn_ctx),
-	asn_MAP_MeasurementFailureCause_ItemIEs_tag2el_37,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_MeasurementFailureCause_ItemIEs = {
-	"MeasurementFailureCause-ItemIEs",
-	"MeasurementFailureCause-ItemIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_MeasurementFailureCause_ItemIEs_tags_37,
-	sizeof(asn_DEF_MeasurementFailureCause_ItemIEs_tags_37)
-		/sizeof(asn_DEF_MeasurementFailureCause_ItemIEs_tags_37[0]), /* 1 */
-	asn_DEF_MeasurementFailureCause_ItemIEs_tags_37,	/* Same as above */
-	sizeof(asn_DEF_MeasurementFailureCause_ItemIEs_tags_37)
-		/sizeof(asn_DEF_MeasurementFailureCause_ItemIEs_tags_37[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_MeasurementFailureCause_ItemIEs_37,
-	3,	/* Elements count */
-	&asn_SPC_MeasurementFailureCause_ItemIEs_specs_37	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_44[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CompleteFailureCauseInformation_ItemIEs__value, choice.CompleteFailureCauseInformation_Item),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CompleteFailureCauseInformation_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CompleteFailureCauseInformation-Item"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_44[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* CompleteFailureCauseInformation-Item */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_44 = {
-	sizeof(struct CompleteFailureCauseInformation_ItemIEs__value),
-	offsetof(struct CompleteFailureCauseInformation_ItemIEs__value, _asn_ctx),
-	offsetof(struct CompleteFailureCauseInformation_ItemIEs__value, present),
-	sizeof(((struct CompleteFailureCauseInformation_ItemIEs__value *)0)->present),
-	asn_MAP_value_tag2el_44,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_44 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_44,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_44	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CompleteFailureCauseInformation_ItemIEs_41[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CompleteFailureCauseInformation_ItemIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_42,  memb_id_constraint_41 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CompleteFailureCauseInformation_ItemIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_CompleteFailureCauseInformation_ItemIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_43,  memb_criticality_constraint_41 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CompleteFailureCauseInformation_ItemIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_44,
-		select_CompleteFailureCauseInformation_ItemIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_44,  memb_value_constraint_41 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CompleteFailureCauseInformation_ItemIEs_tags_41[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CompleteFailureCauseInformation_ItemIEs_tag2el_41[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CompleteFailureCauseInformation_ItemIEs_specs_41 = {
-	sizeof(struct CompleteFailureCauseInformation_ItemIEs),
-	offsetof(struct CompleteFailureCauseInformation_ItemIEs, _asn_ctx),
-	asn_MAP_CompleteFailureCauseInformation_ItemIEs_tag2el_41,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CompleteFailureCauseInformation_ItemIEs = {
-	"CompleteFailureCauseInformation-ItemIEs",
-	"CompleteFailureCauseInformation-ItemIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CompleteFailureCauseInformation_ItemIEs_tags_41,
-	sizeof(asn_DEF_CompleteFailureCauseInformation_ItemIEs_tags_41)
-		/sizeof(asn_DEF_CompleteFailureCauseInformation_ItemIEs_tags_41[0]), /* 1 */
-	asn_DEF_CompleteFailureCauseInformation_ItemIEs_tags_41,	/* Same as above */
-	sizeof(asn_DEF_CompleteFailureCauseInformation_ItemIEs_tags_41)
-		/sizeof(asn_DEF_CompleteFailureCauseInformation_ItemIEs_tags_41[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CompleteFailureCauseInformation_ItemIEs_41,
-	3,	/* Elements count */
-	&asn_SPC_CompleteFailureCauseInformation_ItemIEs_specs_41	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_48[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_ItemIEs__value, choice.CellMeasurementResult_Item),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CellMeasurementResult_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CellMeasurementResult-Item"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_48[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* CellMeasurementResult-Item */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_48 = {
-	sizeof(struct CellMeasurementResult_ItemIEs__value),
-	offsetof(struct CellMeasurementResult_ItemIEs__value, _asn_ctx),
-	offsetof(struct CellMeasurementResult_ItemIEs__value, present),
-	sizeof(((struct CellMeasurementResult_ItemIEs__value *)0)->present),
-	asn_MAP_value_tag2el_48,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_48 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_48,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_48	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_CellMeasurementResult_ItemIEs_45[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_ItemIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_46,  memb_id_constraint_45 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_ItemIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_CellMeasurementResult_ItemIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_47,  memb_criticality_constraint_45 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_ItemIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_48,
-		select_CellMeasurementResult_ItemIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_48,  memb_value_constraint_45 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_CellMeasurementResult_ItemIEs_tags_45[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_CellMeasurementResult_ItemIEs_tag2el_45[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_CellMeasurementResult_ItemIEs_specs_45 = {
-	sizeof(struct CellMeasurementResult_ItemIEs),
-	offsetof(struct CellMeasurementResult_ItemIEs, _asn_ctx),
-	asn_MAP_CellMeasurementResult_ItemIEs_tag2el_45,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_CellMeasurementResult_ItemIEs = {
-	"CellMeasurementResult-ItemIEs",
-	"CellMeasurementResult-ItemIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_CellMeasurementResult_ItemIEs_tags_45,
-	sizeof(asn_DEF_CellMeasurementResult_ItemIEs_tags_45)
-		/sizeof(asn_DEF_CellMeasurementResult_ItemIEs_tags_45[0]), /* 1 */
-	asn_DEF_CellMeasurementResult_ItemIEs_tags_45,	/* Same as above */
-	sizeof(asn_DEF_CellMeasurementResult_ItemIEs_tags_45)
-		/sizeof(asn_DEF_CellMeasurementResult_ItemIEs_tags_45[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellMeasurementResult_ItemIEs_45,
-	3,	/* Elements count */
-	&asn_SPC_CellMeasurementResult_ItemIEs_specs_45	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_52[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RICrequestID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICrequestID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICrequestID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RANfunctionID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_RANfunctionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RICsubscription),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICsubscription,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICsubscription"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_52[] = { 1, 0, 2 };
-static const unsigned asn_MAP_value_from_canonical_52[] = { 1, 0, 2 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_52[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RICrequestID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 } /* RICsubscription */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_52 = {
-	sizeof(struct RICsubscriptionRequest_IEs__value),
-	offsetof(struct RICsubscriptionRequest_IEs__value, _asn_ctx),
-	offsetof(struct RICsubscriptionRequest_IEs__value, present),
-	sizeof(((struct RICsubscriptionRequest_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_52,
-	3,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_52,
-	asn_MAP_value_from_canonical_52,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_52 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_52,
-	3,	/* Elements count */
-	&asn_SPC_value_specs_52	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_IEs_49[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_50,  memb_id_constraint_49 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICsubscriptionRequest_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_51,  memb_criticality_constraint_49 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_52,
-		select_RICsubscriptionRequest_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_52,  memb_value_constraint_49 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICsubscriptionRequest_IEs_tags_49[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionRequest_IEs_tag2el_49[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_IEs_specs_49 = {
-	sizeof(struct RICsubscriptionRequest_IEs),
-	offsetof(struct RICsubscriptionRequest_IEs, _asn_ctx),
-	asn_MAP_RICsubscriptionRequest_IEs_tag2el_49,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest_IEs = {
-	"RICsubscriptionRequest-IEs",
-	"RICsubscriptionRequest-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICsubscriptionRequest_IEs_tags_49,
-	sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_49)
-		/sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_49[0]), /* 1 */
-	asn_DEF_RICsubscriptionRequest_IEs_tags_49,	/* Same as above */
-	sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_49)
-		/sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_49[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICsubscriptionRequest_IEs_49,
-	3,	/* Elements count */
-	&asn_SPC_RICsubscriptionRequest_IEs_specs_49	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_56[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RICrequestID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICrequestID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICrequestID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RANfunctionID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_RANfunctionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RICaction_Admitted_List),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICaction_Admitted_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICaction-Admitted-List"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RICaction_NotAdmitted_List),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICaction_NotAdmitted_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICaction-NotAdmitted-List"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_56[] = { 1, 0, 2, 3 };
-static const unsigned asn_MAP_value_from_canonical_56[] = { 1, 0, 2, 3 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_56[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 2 }, /* RICrequestID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 1 }, /* RICaction-Admitted-List */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -2, 0 } /* RICaction-NotAdmitted-List */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_56 = {
-	sizeof(struct RICsubscriptionResponse_IEs__value),
-	offsetof(struct RICsubscriptionResponse_IEs__value, _asn_ctx),
-	offsetof(struct RICsubscriptionResponse_IEs__value, present),
-	sizeof(((struct RICsubscriptionResponse_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_56,
-	4,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_56,
-	asn_MAP_value_from_canonical_56,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_56 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_56,
-	4,	/* Elements count */
-	&asn_SPC_value_specs_56	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_IEs_53[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_54,  memb_id_constraint_53 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICsubscriptionResponse_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_55,  memb_criticality_constraint_53 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_56,
-		select_RICsubscriptionResponse_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_56,  memb_value_constraint_53 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICsubscriptionResponse_IEs_tags_53[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionResponse_IEs_tag2el_53[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_IEs_specs_53 = {
-	sizeof(struct RICsubscriptionResponse_IEs),
-	offsetof(struct RICsubscriptionResponse_IEs, _asn_ctx),
-	asn_MAP_RICsubscriptionResponse_IEs_tag2el_53,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse_IEs = {
-	"RICsubscriptionResponse-IEs",
-	"RICsubscriptionResponse-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICsubscriptionResponse_IEs_tags_53,
-	sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_53)
-		/sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_53[0]), /* 1 */
-	asn_DEF_RICsubscriptionResponse_IEs_tags_53,	/* Same as above */
-	sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_53)
-		/sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_53[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICsubscriptionResponse_IEs_53,
-	3,	/* Elements count */
-	&asn_SPC_RICsubscriptionResponse_IEs_specs_53	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_60[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RICrequestID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICrequestID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICrequestID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RANfunctionID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_RANfunctionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RICaction_NotAdmitted_List),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICaction_NotAdmitted_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICaction-NotAdmitted-List"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.CriticalityDiagnostics),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CriticalityDiagnostics,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CriticalityDiagnostics"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_60[] = { 1, 0, 2, 3 };
-static const unsigned asn_MAP_value_from_canonical_60[] = { 1, 0, 2, 3 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_60[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 2 }, /* RICrequestID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 1 }, /* RICaction-NotAdmitted-List */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -2, 0 } /* CriticalityDiagnostics */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_60 = {
-	sizeof(struct RICsubscriptionFailure_IEs__value),
-	offsetof(struct RICsubscriptionFailure_IEs__value, _asn_ctx),
-	offsetof(struct RICsubscriptionFailure_IEs__value, present),
-	sizeof(((struct RICsubscriptionFailure_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_60,
-	4,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_60,
-	asn_MAP_value_from_canonical_60,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_60 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_60,
-	4,	/* Elements count */
-	&asn_SPC_value_specs_60	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_IEs_57[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_58,  memb_id_constraint_57 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICsubscriptionFailure_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_59,  memb_criticality_constraint_57 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_60,
-		select_RICsubscriptionFailure_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_60,  memb_value_constraint_57 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICsubscriptionFailure_IEs_tags_57[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionFailure_IEs_tag2el_57[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_IEs_specs_57 = {
-	sizeof(struct RICsubscriptionFailure_IEs),
-	offsetof(struct RICsubscriptionFailure_IEs, _asn_ctx),
-	asn_MAP_RICsubscriptionFailure_IEs_tag2el_57,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure_IEs = {
-	"RICsubscriptionFailure-IEs",
-	"RICsubscriptionFailure-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICsubscriptionFailure_IEs_tags_57,
-	sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_57)
-		/sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_57[0]), /* 1 */
-	asn_DEF_RICsubscriptionFailure_IEs_tags_57,	/* Same as above */
-	sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_57)
-		/sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_57[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICsubscriptionFailure_IEs_57,
-	3,	/* Elements count */
-	&asn_SPC_RICsubscriptionFailure_IEs_specs_57	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_64[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs__value, choice.RICrequestID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICrequestID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICrequestID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs__value, choice.RANfunctionID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_RANfunctionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionID"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_64[] = { 1, 0 };
-static const unsigned asn_MAP_value_from_canonical_64[] = { 1, 0 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_64[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_64 = {
-	sizeof(struct RICsubscriptionDeleteRequest_IEs__value),
-	offsetof(struct RICsubscriptionDeleteRequest_IEs__value, _asn_ctx),
-	offsetof(struct RICsubscriptionDeleteRequest_IEs__value, present),
-	sizeof(((struct RICsubscriptionDeleteRequest_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_64,
-	2,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_64,
-	asn_MAP_value_from_canonical_64,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_64 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_64,
-	2,	/* Elements count */
-	&asn_SPC_value_specs_64	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_IEs_61[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_62,  memb_id_constraint_61 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICsubscriptionDeleteRequest_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_63,  memb_criticality_constraint_61 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_64,
-		select_RICsubscriptionDeleteRequest_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_64,  memb_value_constraint_61 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_61[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteRequest_IEs_tag2el_61[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_61 = {
-	sizeof(struct RICsubscriptionDeleteRequest_IEs),
-	offsetof(struct RICsubscriptionDeleteRequest_IEs, _asn_ctx),
-	asn_MAP_RICsubscriptionDeleteRequest_IEs_tag2el_61,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest_IEs = {
-	"RICsubscriptionDeleteRequest-IEs",
-	"RICsubscriptionDeleteRequest-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_61,
-	sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_61)
-		/sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_61[0]), /* 1 */
-	asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_61,	/* Same as above */
-	sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_61)
-		/sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_61[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICsubscriptionDeleteRequest_IEs_61,
-	3,	/* Elements count */
-	&asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_61	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_68[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs__value, choice.RICrequestID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICrequestID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICrequestID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs__value, choice.RANfunctionID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_RANfunctionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionID"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_68[] = { 1, 0 };
-static const unsigned asn_MAP_value_from_canonical_68[] = { 1, 0 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_68[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_68 = {
-	sizeof(struct RICsubscriptionDeleteResponse_IEs__value),
-	offsetof(struct RICsubscriptionDeleteResponse_IEs__value, _asn_ctx),
-	offsetof(struct RICsubscriptionDeleteResponse_IEs__value, present),
-	sizeof(((struct RICsubscriptionDeleteResponse_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_68,
-	2,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_68,
-	asn_MAP_value_from_canonical_68,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_68 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_68,
-	2,	/* Elements count */
-	&asn_SPC_value_specs_68	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_IEs_65[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_66,  memb_id_constraint_65 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICsubscriptionDeleteResponse_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_67,  memb_criticality_constraint_65 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_68,
-		select_RICsubscriptionDeleteResponse_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_68,  memb_value_constraint_65 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_65[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteResponse_IEs_tag2el_65[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_65 = {
-	sizeof(struct RICsubscriptionDeleteResponse_IEs),
-	offsetof(struct RICsubscriptionDeleteResponse_IEs, _asn_ctx),
-	asn_MAP_RICsubscriptionDeleteResponse_IEs_tag2el_65,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse_IEs = {
-	"RICsubscriptionDeleteResponse-IEs",
-	"RICsubscriptionDeleteResponse-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_65,
-	sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_65)
-		/sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_65[0]), /* 1 */
-	asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_65,	/* Same as above */
-	sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_65)
-		/sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_65[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICsubscriptionDeleteResponse_IEs_65,
-	3,	/* Elements count */
-	&asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_65	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_72[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.RICrequestID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICrequestID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICrequestID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.RANfunctionID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_RANfunctionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.RICcause),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_RICcause,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICcause"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.CriticalityDiagnostics),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CriticalityDiagnostics,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CriticalityDiagnostics"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_72[] = { 1, 0, 3, 2 };
-static const unsigned asn_MAP_value_from_canonical_72[] = { 1, 0, 3, 2 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_72[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RICrequestID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -1, 0 }, /* CriticalityDiagnostics */
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* radioNetwork */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 2, 0, 0 }, /* transport */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* protocol */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* misc */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 2, 0, 0 } /* ric */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_72 = {
-	sizeof(struct RICsubscriptionDeleteFailure_IEs__value),
-	offsetof(struct RICsubscriptionDeleteFailure_IEs__value, _asn_ctx),
-	offsetof(struct RICsubscriptionDeleteFailure_IEs__value, present),
-	sizeof(((struct RICsubscriptionDeleteFailure_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_72,
-	8,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_72,
-	asn_MAP_value_from_canonical_72,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_72 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_72,
-	4,	/* Elements count */
-	&asn_SPC_value_specs_72	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_IEs_69[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_70,  memb_id_constraint_69 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICsubscriptionDeleteFailure_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_71,  memb_criticality_constraint_69 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_72,
-		select_RICsubscriptionDeleteFailure_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_72,  memb_value_constraint_69 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_69[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteFailure_IEs_tag2el_69[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_69 = {
-	sizeof(struct RICsubscriptionDeleteFailure_IEs),
-	offsetof(struct RICsubscriptionDeleteFailure_IEs, _asn_ctx),
-	asn_MAP_RICsubscriptionDeleteFailure_IEs_tag2el_69,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure_IEs = {
-	"RICsubscriptionDeleteFailure-IEs",
-	"RICsubscriptionDeleteFailure-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_69,
-	sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_69)
-		/sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_69[0]), /* 1 */
-	asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_69,	/* Same as above */
-	sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_69)
-		/sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_69[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICsubscriptionDeleteFailure_IEs_69,
-	3,	/* Elements count */
-	&asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_69	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_76[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICrequestID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICrequestID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICrequestID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RANfunctionID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_RANfunctionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICactionID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_RICactionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICactionID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationSN),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_RICindicationSN,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICindicationSN"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationType),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_RICindicationType,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICindicationType"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationHeader),
-		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
-		0,
-		&asn_DEF_RICindicationHeader,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICindicationHeader"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationMessage),
-		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
-		0,
-		&asn_DEF_RICindicationMessage,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICindicationMessage"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICcallProcessID),
-		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
-		0,
-		&asn_DEF_RICcallProcessID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICcallProcessID"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_76[] = { 1, 2, 3, 5, 6, 7, 4, 0 };
-static const unsigned asn_MAP_value_from_canonical_76[] = { 7, 0, 1, 2, 6, 3, 4, 5 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_76[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 2 }, /* RANfunctionID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 2, -1, 1 }, /* RICactionID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 3, -2, 0 }, /* RICindicationSN */
-    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 5, 0, 2 }, /* RICindicationHeader */
-    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 6, -1, 1 }, /* RICindicationMessage */
-    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 7, -2, 0 }, /* RICcallProcessID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 4, 0, 0 }, /* RICindicationType */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_76 = {
-	sizeof(struct RICindication_IEs__value),
-	offsetof(struct RICindication_IEs__value, _asn_ctx),
-	offsetof(struct RICindication_IEs__value, present),
-	sizeof(((struct RICindication_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_76,
-	8,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_76,
-	asn_MAP_value_from_canonical_76,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_76 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_76,
-	8,	/* Elements count */
-	&asn_SPC_value_specs_76	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICindication_IEs_73[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_74,  memb_id_constraint_73 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICindication_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_75,  memb_criticality_constraint_73 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_76,
-		select_RICindication_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_76,  memb_value_constraint_73 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICindication_IEs_tags_73[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICindication_IEs_tag2el_73[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICindication_IEs_specs_73 = {
-	sizeof(struct RICindication_IEs),
-	offsetof(struct RICindication_IEs, _asn_ctx),
-	asn_MAP_RICindication_IEs_tag2el_73,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICindication_IEs = {
-	"RICindication-IEs",
-	"RICindication-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICindication_IEs_tags_73,
-	sizeof(asn_DEF_RICindication_IEs_tags_73)
-		/sizeof(asn_DEF_RICindication_IEs_tags_73[0]), /* 1 */
-	asn_DEF_RICindication_IEs_tags_73,	/* Same as above */
-	sizeof(asn_DEF_RICindication_IEs_tags_73)
-		/sizeof(asn_DEF_RICindication_IEs_tags_73[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICindication_IEs_73,
-	3,	/* Elements count */
-	&asn_SPC_RICindication_IEs_specs_73	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_80[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICrequestID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICrequestID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICrequestID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RANfunctionID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_RANfunctionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcallProcessID),
-		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
-		0,
-		&asn_DEF_RICcallProcessID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICcallProcessID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolHeader),
-		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
-		0,
-		&asn_DEF_RICcontrolHeader,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICcontrolHeader"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolMessage),
-		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
-		0,
-		&asn_DEF_RICcontrolMessage,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICcontrolMessage"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolAckRequest),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_RICcontrolAckRequest,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICcontrolAckRequest"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_80[] = { 1, 2, 3, 4, 5, 0 };
-static const unsigned asn_MAP_value_from_canonical_80[] = { 5, 0, 1, 2, 3, 4 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_80[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 2, 0, 2 }, /* RICcallProcessID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 3, -1, 1 }, /* RICcontrolHeader */
-    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 4, -2, 0 }, /* RICcontrolMessage */
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 5, 0, 0 }, /* RICcontrolAckRequest */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_80 = {
-	sizeof(struct RICcontrolRequest_IEs__value),
-	offsetof(struct RICcontrolRequest_IEs__value, _asn_ctx),
-	offsetof(struct RICcontrolRequest_IEs__value, present),
-	sizeof(((struct RICcontrolRequest_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_80,
-	6,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_80,
-	asn_MAP_value_from_canonical_80,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_80 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_80,
-	6,	/* Elements count */
-	&asn_SPC_value_specs_80	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICcontrolRequest_IEs_77[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_78,  memb_id_constraint_77 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICcontrolRequest_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_79,  memb_criticality_constraint_77 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_80,
-		select_RICcontrolRequest_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_80,  memb_value_constraint_77 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICcontrolRequest_IEs_tags_77[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICcontrolRequest_IEs_tag2el_77[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_IEs_specs_77 = {
-	sizeof(struct RICcontrolRequest_IEs),
-	offsetof(struct RICcontrolRequest_IEs, _asn_ctx),
-	asn_MAP_RICcontrolRequest_IEs_tag2el_77,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest_IEs = {
-	"RICcontrolRequest-IEs",
-	"RICcontrolRequest-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICcontrolRequest_IEs_tags_77,
-	sizeof(asn_DEF_RICcontrolRequest_IEs_tags_77)
-		/sizeof(asn_DEF_RICcontrolRequest_IEs_tags_77[0]), /* 1 */
-	asn_DEF_RICcontrolRequest_IEs_tags_77,	/* Same as above */
-	sizeof(asn_DEF_RICcontrolRequest_IEs_tags_77)
-		/sizeof(asn_DEF_RICcontrolRequest_IEs_tags_77[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICcontrolRequest_IEs_77,
-	3,	/* Elements count */
-	&asn_SPC_RICcontrolRequest_IEs_specs_77	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_84[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICrequestID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICrequestID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICrequestID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RANfunctionID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_RANfunctionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcallProcessID),
-		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
-		0,
-		&asn_DEF_RICcallProcessID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICcallProcessID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcontrolStatus),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_RICcontrolStatus,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICcontrolStatus"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_84[] = { 1, 2, 3, 0 };
-static const unsigned asn_MAP_value_from_canonical_84[] = { 3, 0, 1, 2 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_84[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 2, 0, 0 }, /* RICcallProcessID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 3, 0, 0 }, /* RICcontrolStatus */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_84 = {
-	sizeof(struct RICcontrolAcknowledge_IEs__value),
-	offsetof(struct RICcontrolAcknowledge_IEs__value, _asn_ctx),
-	offsetof(struct RICcontrolAcknowledge_IEs__value, present),
-	sizeof(((struct RICcontrolAcknowledge_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_84,
-	4,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_84,
-	asn_MAP_value_from_canonical_84,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_84 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_84,
-	4,	/* Elements count */
-	&asn_SPC_value_specs_84	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_IEs_81[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_82,  memb_id_constraint_81 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICcontrolAcknowledge_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_83,  memb_criticality_constraint_81 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_84,
-		select_RICcontrolAcknowledge_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_84,  memb_value_constraint_81 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICcontrolAcknowledge_IEs_tags_81[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICcontrolAcknowledge_IEs_tag2el_81[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_IEs_specs_81 = {
-	sizeof(struct RICcontrolAcknowledge_IEs),
-	offsetof(struct RICcontrolAcknowledge_IEs, _asn_ctx),
-	asn_MAP_RICcontrolAcknowledge_IEs_tag2el_81,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge_IEs = {
-	"RICcontrolAcknowledge-IEs",
-	"RICcontrolAcknowledge-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICcontrolAcknowledge_IEs_tags_81,
-	sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_81)
-		/sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_81[0]), /* 1 */
-	asn_DEF_RICcontrolAcknowledge_IEs_tags_81,	/* Same as above */
-	sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_81)
-		/sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_81[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICcontrolAcknowledge_IEs_81,
-	3,	/* Elements count */
-	&asn_SPC_RICcontrolAcknowledge_IEs_specs_81	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_88[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RICrequestID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICrequestID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICrequestID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RANfunctionID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_RANfunctionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RICcallProcessID),
-		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
-		0,
-		&asn_DEF_RICcallProcessID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICcallProcessID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RICcause),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_RICcause,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICcause"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_88[] = { 1, 2, 0, 3 };
-static const unsigned asn_MAP_value_from_canonical_88[] = { 2, 0, 1, 3 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_88[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 2, 0, 0 }, /* RICcallProcessID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 }, /* RICrequestID */
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 3, 0, 0 }, /* radioNetwork */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 3, 0, 0 }, /* transport */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 3, 0, 0 }, /* protocol */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* misc */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 3, 0, 0 } /* ric */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_88 = {
-	sizeof(struct RICcontrolFailure_IEs__value),
-	offsetof(struct RICcontrolFailure_IEs__value, _asn_ctx),
-	offsetof(struct RICcontrolFailure_IEs__value, present),
-	sizeof(((struct RICcontrolFailure_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_88,
-	8,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_88,
-	asn_MAP_value_from_canonical_88,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_88 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_88,
-	4,	/* Elements count */
-	&asn_SPC_value_specs_88	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICcontrolFailure_IEs_85[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_86,  memb_id_constraint_85 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICcontrolFailure_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_87,  memb_criticality_constraint_85 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_88,
-		select_RICcontrolFailure_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_88,  memb_value_constraint_85 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICcontrolFailure_IEs_tags_85[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICcontrolFailure_IEs_tag2el_85[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_IEs_specs_85 = {
-	sizeof(struct RICcontrolFailure_IEs),
-	offsetof(struct RICcontrolFailure_IEs, _asn_ctx),
-	asn_MAP_RICcontrolFailure_IEs_tag2el_85,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure_IEs = {
-	"RICcontrolFailure-IEs",
-	"RICcontrolFailure-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICcontrolFailure_IEs_tags_85,
-	sizeof(asn_DEF_RICcontrolFailure_IEs_tags_85)
-		/sizeof(asn_DEF_RICcontrolFailure_IEs_tags_85[0]), /* 1 */
-	asn_DEF_RICcontrolFailure_IEs_tags_85,	/* Same as above */
-	sizeof(asn_DEF_RICcontrolFailure_IEs_tags_85)
-		/sizeof(asn_DEF_RICcontrolFailure_IEs_tags_85[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICcontrolFailure_IEs_85,
-	3,	/* Elements count */
-	&asn_SPC_RICcontrolFailure_IEs_specs_85	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_92[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs__value, choice.RANfunctions_List),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RANfunctions_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctions-List"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs__value, choice.RANfunctionsID_List),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RANfunctionsID_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionsID-List"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_92[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RANfunctions-List */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 } /* RANfunctionsID-List */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_92 = {
-	sizeof(struct RICserviceUpdate_IEs__value),
-	offsetof(struct RICserviceUpdate_IEs__value, _asn_ctx),
-	offsetof(struct RICserviceUpdate_IEs__value, present),
-	sizeof(((struct RICserviceUpdate_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_92,
-	2,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_92 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_92,
-	2,	/* Elements count */
-	&asn_SPC_value_specs_92	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICserviceUpdate_IEs_89[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_90,  memb_id_constraint_89 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICserviceUpdate_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_91,  memb_criticality_constraint_89 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_92,
-		select_RICserviceUpdate_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_92,  memb_value_constraint_89 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICserviceUpdate_IEs_tags_89[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdate_IEs_tag2el_89[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_IEs_specs_89 = {
-	sizeof(struct RICserviceUpdate_IEs),
-	offsetof(struct RICserviceUpdate_IEs, _asn_ctx),
-	asn_MAP_RICserviceUpdate_IEs_tag2el_89,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate_IEs = {
-	"RICserviceUpdate-IEs",
-	"RICserviceUpdate-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICserviceUpdate_IEs_tags_89,
-	sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89)
-		/sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89[0]), /* 1 */
-	asn_DEF_RICserviceUpdate_IEs_tags_89,	/* Same as above */
-	sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89)
-		/sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICserviceUpdate_IEs_89,
-	3,	/* Elements count */
-	&asn_SPC_RICserviceUpdate_IEs_specs_89	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_96[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs__value, choice.RANfunctionsID_List),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RANfunctionsID_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionsID-List"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs__value, choice.RANfunctionsIDcause_List),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RANfunctionsIDcause_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionsIDcause-List"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_96[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RANfunctionsID-List */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 } /* RANfunctionsIDcause-List */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_96 = {
-	sizeof(struct RICserviceUpdateAcknowledge_IEs__value),
-	offsetof(struct RICserviceUpdateAcknowledge_IEs__value, _asn_ctx),
-	offsetof(struct RICserviceUpdateAcknowledge_IEs__value, present),
-	sizeof(((struct RICserviceUpdateAcknowledge_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_96,
-	2,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_96 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_96,
-	2,	/* Elements count */
-	&asn_SPC_value_specs_96	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_IEs_93[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_94,  memb_id_constraint_93 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICserviceUpdateAcknowledge_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_95,  memb_criticality_constraint_93 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_96,
-		select_RICserviceUpdateAcknowledge_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_96,  memb_value_constraint_93 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateAcknowledge_IEs_tag2el_93[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_93 = {
-	sizeof(struct RICserviceUpdateAcknowledge_IEs),
-	offsetof(struct RICserviceUpdateAcknowledge_IEs, _asn_ctx),
-	asn_MAP_RICserviceUpdateAcknowledge_IEs_tag2el_93,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge_IEs = {
-	"RICserviceUpdateAcknowledge-IEs",
-	"RICserviceUpdateAcknowledge-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93,
-	sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93)
-		/sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93[0]), /* 1 */
-	asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93,	/* Same as above */
-	sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93)
-		/sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICserviceUpdateAcknowledge_IEs_93,
-	3,	/* Elements count */
-	&asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_93	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_100[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs__value, choice.RANfunctionsIDcause_List),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RANfunctionsIDcause_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionsIDcause-List"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs__value, choice.TimeToWait),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_TimeToWait,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"TimeToWait"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs__value, choice.CriticalityDiagnostics),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CriticalityDiagnostics,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CriticalityDiagnostics"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_100[] = { 1, 0, 2 };
-static const unsigned asn_MAP_value_from_canonical_100[] = { 1, 0, 2 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_100[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 }, /* TimeToWait */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RANfunctionsIDcause-List */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 } /* CriticalityDiagnostics */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_100 = {
-	sizeof(struct RICserviceUpdateFailure_IEs__value),
-	offsetof(struct RICserviceUpdateFailure_IEs__value, _asn_ctx),
-	offsetof(struct RICserviceUpdateFailure_IEs__value, present),
-	sizeof(((struct RICserviceUpdateFailure_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_100,
-	3,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_100,
-	asn_MAP_value_from_canonical_100,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_100 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_100,
-	3,	/* Elements count */
-	&asn_SPC_value_specs_100	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_IEs_97[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_98,  memb_id_constraint_97 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICserviceUpdateFailure_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_99,  memb_criticality_constraint_97 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_100,
-		select_RICserviceUpdateFailure_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_100,  memb_value_constraint_97 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICserviceUpdateFailure_IEs_tags_97[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateFailure_IEs_tag2el_97[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_IEs_specs_97 = {
-	sizeof(struct RICserviceUpdateFailure_IEs),
-	offsetof(struct RICserviceUpdateFailure_IEs, _asn_ctx),
-	asn_MAP_RICserviceUpdateFailure_IEs_tag2el_97,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure_IEs = {
-	"RICserviceUpdateFailure-IEs",
-	"RICserviceUpdateFailure-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICserviceUpdateFailure_IEs_tags_97,
-	sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97)
-		/sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97[0]), /* 1 */
-	asn_DEF_RICserviceUpdateFailure_IEs_tags_97,	/* Same as above */
-	sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97)
-		/sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICserviceUpdateFailure_IEs_97,
-	3,	/* Elements count */
-	&asn_SPC_RICserviceUpdateFailure_IEs_specs_97	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_104[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs__value, choice.RANfunctionsID_List),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RANfunctionsID_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RANfunctionsID-List"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_104[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunctionsID-List */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_104 = {
-	sizeof(struct RICserviceQuery_IEs__value),
-	offsetof(struct RICserviceQuery_IEs__value, _asn_ctx),
-	offsetof(struct RICserviceQuery_IEs__value, present),
-	sizeof(((struct RICserviceQuery_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_104,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_104 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_104,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_104	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICserviceQuery_IEs_101[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_102,  memb_id_constraint_101 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICserviceQuery_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_103,  memb_criticality_constraint_101 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_104,
-		select_RICserviceQuery_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_104,  memb_value_constraint_101 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICserviceQuery_IEs_tags_101[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICserviceQuery_IEs_tag2el_101[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_IEs_specs_101 = {
-	sizeof(struct RICserviceQuery_IEs),
-	offsetof(struct RICserviceQuery_IEs, _asn_ctx),
-	asn_MAP_RICserviceQuery_IEs_tag2el_101,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICserviceQuery_IEs = {
-	"RICserviceQuery-IEs",
-	"RICserviceQuery-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICserviceQuery_IEs_tags_101,
-	sizeof(asn_DEF_RICserviceQuery_IEs_tags_101)
-		/sizeof(asn_DEF_RICserviceQuery_IEs_tags_101[0]), /* 1 */
-	asn_DEF_RICserviceQuery_IEs_tags_101,	/* Same as above */
-	sizeof(asn_DEF_RICserviceQuery_IEs_tags_101)
-		/sizeof(asn_DEF_RICserviceQuery_IEs_tags_101[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICserviceQuery_IEs_101,
-	3,	/* Elements count */
-	&asn_SPC_RICserviceQuery_IEs_specs_101	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_108[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.UE_X2AP_ID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_UE_X2AP_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"UE-X2AP-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.Cause),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_Cause,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"Cause"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.CriticalityDiagnostics),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CriticalityDiagnostics,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CriticalityDiagnostics"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.UE_X2AP_ID_Extension),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_UE_X2AP_ID_Extension,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"UE-X2AP-ID-Extension"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs__value, choice.SgNB_UE_X2AP_ID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_SgNB_UE_X2AP_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"SgNB-UE-X2AP-ID"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_108[] = { 0, 3, 4, 2, 1 };
-static const unsigned asn_MAP_value_from_canonical_108[] = { 0, 4, 3, 1, 2 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_108[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 2 }, /* UE-X2AP-ID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 3, -1, 1 }, /* UE-X2AP-ID-Extension */
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 4, -2, 0 }, /* SgNB-UE-X2AP-ID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, 0, 0 }, /* CriticalityDiagnostics */
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 }, /* radioNetwork */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* transport */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* protocol */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 1, 0, 0 } /* misc */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_108 = {
-	sizeof(struct ErrorIndication_IEs__value),
-	offsetof(struct ErrorIndication_IEs__value, _asn_ctx),
-	offsetof(struct ErrorIndication_IEs__value, present),
-	sizeof(((struct ErrorIndication_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_108,
-	8,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_108,
-	asn_MAP_value_from_canonical_108,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_108 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_108,
-	5,	/* Elements count */
-	&asn_SPC_value_specs_108	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ErrorIndication_IEs_105[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_106,  memb_id_constraint_105 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ErrorIndication_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_107,  memb_criticality_constraint_105 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ErrorIndication_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_108,
-		select_ErrorIndication_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_108,  memb_value_constraint_105 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ErrorIndication_IEs_tags_105[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ErrorIndication_IEs_tag2el_105[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ErrorIndication_IEs_specs_105 = {
-	sizeof(struct ErrorIndication_IEs),
-	offsetof(struct ErrorIndication_IEs, _asn_ctx),
-	asn_MAP_ErrorIndication_IEs_tag2el_105,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ErrorIndication_IEs = {
-	"ErrorIndication-IEs",
-	"ErrorIndication-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ErrorIndication_IEs_tags_105,
-	sizeof(asn_DEF_ErrorIndication_IEs_tags_105)
-		/sizeof(asn_DEF_ErrorIndication_IEs_tags_105[0]), /* 1 */
-	asn_DEF_ErrorIndication_IEs_tags_105,	/* Same as above */
-	sizeof(asn_DEF_ErrorIndication_IEs_tags_105)
-		/sizeof(asn_DEF_ErrorIndication_IEs_tags_105[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ErrorIndication_IEs_105,
-	3,	/* Elements count */
-	&asn_SPC_ErrorIndication_IEs_specs_105	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_112[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResetRequest_IEs__value, choice.Cause),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_Cause,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"Cause"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_112[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* radioNetwork */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* transport */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 }, /* protocol */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 } /* misc */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_112 = {
-	sizeof(struct ResetRequest_IEs__value),
-	offsetof(struct ResetRequest_IEs__value, _asn_ctx),
-	offsetof(struct ResetRequest_IEs__value, present),
-	sizeof(((struct ResetRequest_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_112,
-	4,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_112 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_112,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_112	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ResetRequest_IEs_109[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResetRequest_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_110,  memb_id_constraint_109 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResetRequest_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ResetRequest_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_111,  memb_criticality_constraint_109 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResetRequest_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_112,
-		select_ResetRequest_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_112,  memb_value_constraint_109 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ResetRequest_IEs_tags_109[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResetRequest_IEs_tag2el_109[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResetRequest_IEs_specs_109 = {
-	sizeof(struct ResetRequest_IEs),
-	offsetof(struct ResetRequest_IEs, _asn_ctx),
-	asn_MAP_ResetRequest_IEs_tag2el_109,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResetRequest_IEs = {
-	"ResetRequest-IEs",
-	"ResetRequest-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResetRequest_IEs_tags_109,
-	sizeof(asn_DEF_ResetRequest_IEs_tags_109)
-		/sizeof(asn_DEF_ResetRequest_IEs_tags_109[0]), /* 1 */
-	asn_DEF_ResetRequest_IEs_tags_109,	/* Same as above */
-	sizeof(asn_DEF_ResetRequest_IEs_tags_109)
-		/sizeof(asn_DEF_ResetRequest_IEs_tags_109[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResetRequest_IEs_109,
-	3,	/* Elements count */
-	&asn_SPC_ResetRequest_IEs_specs_109	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_116[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResetResponse_IEs__value, choice.CriticalityDiagnostics),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CriticalityDiagnostics,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CriticalityDiagnostics"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_116[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* CriticalityDiagnostics */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_116 = {
-	sizeof(struct ResetResponse_IEs__value),
-	offsetof(struct ResetResponse_IEs__value, _asn_ctx),
-	offsetof(struct ResetResponse_IEs__value, present),
-	sizeof(((struct ResetResponse_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_116,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_116 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_116,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_116	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ResetResponse_IEs_113[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResetResponse_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_114,  memb_id_constraint_113 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResetResponse_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ResetResponse_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_115,  memb_criticality_constraint_113 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResetResponse_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_116,
-		select_ResetResponse_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_116,  memb_value_constraint_113 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ResetResponse_IEs_tags_113[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResetResponse_IEs_tag2el_113[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResetResponse_IEs_specs_113 = {
-	sizeof(struct ResetResponse_IEs),
-	offsetof(struct ResetResponse_IEs, _asn_ctx),
-	asn_MAP_ResetResponse_IEs_tag2el_113,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResetResponse_IEs = {
-	"ResetResponse-IEs",
-	"ResetResponse-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResetResponse_IEs_tags_113,
-	sizeof(asn_DEF_ResetResponse_IEs_tags_113)
-		/sizeof(asn_DEF_ResetResponse_IEs_tags_113[0]), /* 1 */
-	asn_DEF_ResetResponse_IEs_tags_113,	/* Same as above */
-	sizeof(asn_DEF_ResetResponse_IEs_tags_113)
-		/sizeof(asn_DEF_ResetResponse_IEs_tags_113[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResetResponse_IEs_113,
-	3,	/* Elements count */
-	&asn_SPC_ResetResponse_IEs_specs_113	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_120[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupRequest_IEs__value, choice.GlobalENB_ID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_GlobalENB_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"GlobalENB-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupRequest_IEs__value, choice.ServedCells),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedCells,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ServedCells"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupRequest_IEs__value, choice.GUGroupIDList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_GUGroupIDList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"GUGroupIDList"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupRequest_IEs__value, choice.LHN_ID),
-		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
-		0,
-		&asn_DEF_LHN_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"LHN-ID"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_120[] = { 3, 0, 1, 2 };
-static const unsigned asn_MAP_value_from_canonical_120[] = { 1, 2, 3, 0 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_120[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 3, 0, 0 }, /* LHN-ID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 2 }, /* GlobalENB-ID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 1 }, /* ServedCells */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 0 } /* GUGroupIDList */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_120 = {
-	sizeof(struct X2SetupRequest_IEs__value),
-	offsetof(struct X2SetupRequest_IEs__value, _asn_ctx),
-	offsetof(struct X2SetupRequest_IEs__value, present),
-	sizeof(((struct X2SetupRequest_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_120,
-	4,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_120,
-	asn_MAP_value_from_canonical_120,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_120 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_120,
-	4,	/* Elements count */
-	&asn_SPC_value_specs_120	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_X2SetupRequest_IEs_117[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupRequest_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_118,  memb_id_constraint_117 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupRequest_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_X2SetupRequest_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_119,  memb_criticality_constraint_117 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct X2SetupRequest_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_120,
-		select_X2SetupRequest_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_120,  memb_value_constraint_117 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_X2SetupRequest_IEs_tags_117[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_X2SetupRequest_IEs_tag2el_117[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_X2SetupRequest_IEs_specs_117 = {
-	sizeof(struct X2SetupRequest_IEs),
-	offsetof(struct X2SetupRequest_IEs, _asn_ctx),
-	asn_MAP_X2SetupRequest_IEs_tag2el_117,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_X2SetupRequest_IEs = {
-	"X2SetupRequest-IEs",
-	"X2SetupRequest-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_X2SetupRequest_IEs_tags_117,
-	sizeof(asn_DEF_X2SetupRequest_IEs_tags_117)
-		/sizeof(asn_DEF_X2SetupRequest_IEs_tags_117[0]), /* 1 */
-	asn_DEF_X2SetupRequest_IEs_tags_117,	/* Same as above */
-	sizeof(asn_DEF_X2SetupRequest_IEs_tags_117)
-		/sizeof(asn_DEF_X2SetupRequest_IEs_tags_117[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_X2SetupRequest_IEs_117,
-	3,	/* Elements count */
-	&asn_SPC_X2SetupRequest_IEs_specs_117	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_124[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupResponse_IEs__value, choice.GlobalENB_ID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_GlobalENB_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"GlobalENB-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupResponse_IEs__value, choice.ServedCells),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedCells,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ServedCells"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupResponse_IEs__value, choice.GUGroupIDList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_GUGroupIDList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"GUGroupIDList"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupResponse_IEs__value, choice.CriticalityDiagnostics),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CriticalityDiagnostics,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CriticalityDiagnostics"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupResponse_IEs__value, choice.LHN_ID),
-		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
-		0,
-		&asn_DEF_LHN_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"LHN-ID"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_124[] = { 4, 0, 1, 2, 3 };
-static const unsigned asn_MAP_value_from_canonical_124[] = { 1, 2, 3, 4, 0 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_124[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 4, 0, 0 }, /* LHN-ID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 3 }, /* GlobalENB-ID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 2 }, /* ServedCells */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 1 }, /* GUGroupIDList */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 0 } /* CriticalityDiagnostics */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_124 = {
-	sizeof(struct X2SetupResponse_IEs__value),
-	offsetof(struct X2SetupResponse_IEs__value, _asn_ctx),
-	offsetof(struct X2SetupResponse_IEs__value, present),
-	sizeof(((struct X2SetupResponse_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_124,
-	5,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_124,
-	asn_MAP_value_from_canonical_124,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_124 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_124,
-	5,	/* Elements count */
-	&asn_SPC_value_specs_124	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_X2SetupResponse_IEs_121[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupResponse_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_122,  memb_id_constraint_121 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupResponse_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_X2SetupResponse_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_123,  memb_criticality_constraint_121 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct X2SetupResponse_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_124,
-		select_X2SetupResponse_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_124,  memb_value_constraint_121 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_X2SetupResponse_IEs_tags_121[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_X2SetupResponse_IEs_tag2el_121[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_X2SetupResponse_IEs_specs_121 = {
-	sizeof(struct X2SetupResponse_IEs),
-	offsetof(struct X2SetupResponse_IEs, _asn_ctx),
-	asn_MAP_X2SetupResponse_IEs_tag2el_121,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_X2SetupResponse_IEs = {
-	"X2SetupResponse-IEs",
-	"X2SetupResponse-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_X2SetupResponse_IEs_tags_121,
-	sizeof(asn_DEF_X2SetupResponse_IEs_tags_121)
-		/sizeof(asn_DEF_X2SetupResponse_IEs_tags_121[0]), /* 1 */
-	asn_DEF_X2SetupResponse_IEs_tags_121,	/* Same as above */
-	sizeof(asn_DEF_X2SetupResponse_IEs_tags_121)
-		/sizeof(asn_DEF_X2SetupResponse_IEs_tags_121[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_X2SetupResponse_IEs_121,
-	3,	/* Elements count */
-	&asn_SPC_X2SetupResponse_IEs_specs_121	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_128[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupFailure_IEs__value, choice.Cause),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_Cause,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"Cause"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupFailure_IEs__value, choice.TimeToWait),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_TimeToWait,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"TimeToWait"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupFailure_IEs__value, choice.CriticalityDiagnostics),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CriticalityDiagnostics,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CriticalityDiagnostics"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_128[] = { 1, 2, 0 };
-static const unsigned asn_MAP_value_from_canonical_128[] = { 2, 0, 1 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_128[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 }, /* TimeToWait */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, 0, 0 }, /* CriticalityDiagnostics */
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* radioNetwork */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* transport */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 }, /* protocol */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 } /* misc */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_128 = {
-	sizeof(struct X2SetupFailure_IEs__value),
-	offsetof(struct X2SetupFailure_IEs__value, _asn_ctx),
-	offsetof(struct X2SetupFailure_IEs__value, present),
-	sizeof(((struct X2SetupFailure_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_128,
-	6,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_128,
-	asn_MAP_value_from_canonical_128,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_128 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_128,
-	3,	/* Elements count */
-	&asn_SPC_value_specs_128	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_X2SetupFailure_IEs_125[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupFailure_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_126,  memb_id_constraint_125 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupFailure_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_X2SetupFailure_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_127,  memb_criticality_constraint_125 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct X2SetupFailure_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_128,
-		select_X2SetupFailure_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_128,  memb_value_constraint_125 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_X2SetupFailure_IEs_tags_125[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_X2SetupFailure_IEs_tag2el_125[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_X2SetupFailure_IEs_specs_125 = {
-	sizeof(struct X2SetupFailure_IEs),
-	offsetof(struct X2SetupFailure_IEs, _asn_ctx),
-	asn_MAP_X2SetupFailure_IEs_tag2el_125,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_X2SetupFailure_IEs = {
-	"X2SetupFailure-IEs",
-	"X2SetupFailure-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_X2SetupFailure_IEs_tags_125,
-	sizeof(asn_DEF_X2SetupFailure_IEs_tags_125)
-		/sizeof(asn_DEF_X2SetupFailure_IEs_tags_125[0]), /* 1 */
-	asn_DEF_X2SetupFailure_IEs_tags_125,	/* Same as above */
-	sizeof(asn_DEF_X2SetupFailure_IEs_tags_125)
-		/sizeof(asn_DEF_X2SetupFailure_IEs_tags_125[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_X2SetupFailure_IEs_125,
-	3,	/* Elements count */
-	&asn_SPC_X2SetupFailure_IEs_specs_125	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_132[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct LoadInformation_IEs__value, choice.CellInformation_List),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CellInformation_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CellInformation-List"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_132[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* CellInformation-List */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_132 = {
-	sizeof(struct LoadInformation_IEs__value),
-	offsetof(struct LoadInformation_IEs__value, _asn_ctx),
-	offsetof(struct LoadInformation_IEs__value, present),
-	sizeof(((struct LoadInformation_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_132,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_132 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_132,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_132	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_LoadInformation_IEs_129[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct LoadInformation_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_130,  memb_id_constraint_129 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct LoadInformation_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_LoadInformation_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_131,  memb_criticality_constraint_129 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct LoadInformation_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_132,
-		select_LoadInformation_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_132,  memb_value_constraint_129 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_LoadInformation_IEs_tags_129[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_LoadInformation_IEs_tag2el_129[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_LoadInformation_IEs_specs_129 = {
-	sizeof(struct LoadInformation_IEs),
-	offsetof(struct LoadInformation_IEs, _asn_ctx),
-	asn_MAP_LoadInformation_IEs_tag2el_129,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_LoadInformation_IEs = {
-	"LoadInformation-IEs",
-	"LoadInformation-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_LoadInformation_IEs_tags_129,
-	sizeof(asn_DEF_LoadInformation_IEs_tags_129)
-		/sizeof(asn_DEF_LoadInformation_IEs_tags_129[0]), /* 1 */
-	asn_DEF_LoadInformation_IEs_tags_129,	/* Same as above */
-	sizeof(asn_DEF_LoadInformation_IEs_tags_129)
-		/sizeof(asn_DEF_LoadInformation_IEs_tags_129[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_LoadInformation_IEs_129,
-	3,	/* Elements count */
-	&asn_SPC_LoadInformation_IEs_specs_129	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_136[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdate_IEs__value, choice.ServedCells),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedCells,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ServedCells"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdate_IEs__value, choice.ServedCellsToModify),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedCellsToModify,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ServedCellsToModify"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdate_IEs__value, choice.Old_ECGIs),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Old_ECGIs,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"Old-ECGIs"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdate_IEs__value, choice.GUGroupIDList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_GUGroupIDList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"GUGroupIDList"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdate_IEs__value, choice.CoverageModificationList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CoverageModificationList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CoverageModificationList"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_136[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 4 }, /* ServedCells */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 3 }, /* ServedCellsToModify */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 2 }, /* Old-ECGIs */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 1 }, /* GUGroupIDList */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 0 } /* CoverageModificationList */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_136 = {
-	sizeof(struct ENBConfigurationUpdate_IEs__value),
-	offsetof(struct ENBConfigurationUpdate_IEs__value, _asn_ctx),
-	offsetof(struct ENBConfigurationUpdate_IEs__value, present),
-	sizeof(((struct ENBConfigurationUpdate_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_136,
-	5,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_136 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_136,
-	5,	/* Elements count */
-	&asn_SPC_value_specs_136	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ENBConfigurationUpdate_IEs_133[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdate_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_134,  memb_id_constraint_133 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdate_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ENBConfigurationUpdate_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_135,  memb_criticality_constraint_133 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdate_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_136,
-		select_ENBConfigurationUpdate_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_136,  memb_value_constraint_133 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENBConfigurationUpdate_IEs_tags_133[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENBConfigurationUpdate_IEs_tag2el_133[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationUpdate_IEs_specs_133 = {
-	sizeof(struct ENBConfigurationUpdate_IEs),
-	offsetof(struct ENBConfigurationUpdate_IEs, _asn_ctx),
-	asn_MAP_ENBConfigurationUpdate_IEs_tag2el_133,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdate_IEs = {
-	"ENBConfigurationUpdate-IEs",
-	"ENBConfigurationUpdate-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENBConfigurationUpdate_IEs_tags_133,
-	sizeof(asn_DEF_ENBConfigurationUpdate_IEs_tags_133)
-		/sizeof(asn_DEF_ENBConfigurationUpdate_IEs_tags_133[0]), /* 1 */
-	asn_DEF_ENBConfigurationUpdate_IEs_tags_133,	/* Same as above */
-	sizeof(asn_DEF_ENBConfigurationUpdate_IEs_tags_133)
-		/sizeof(asn_DEF_ENBConfigurationUpdate_IEs_tags_133[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENBConfigurationUpdate_IEs_133,
-	3,	/* Elements count */
-	&asn_SPC_ENBConfigurationUpdate_IEs_specs_133	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_140[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdateAcknowledge_IEs__value, choice.CriticalityDiagnostics),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CriticalityDiagnostics,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CriticalityDiagnostics"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_140[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* CriticalityDiagnostics */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_140 = {
-	sizeof(struct ENBConfigurationUpdateAcknowledge_IEs__value),
-	offsetof(struct ENBConfigurationUpdateAcknowledge_IEs__value, _asn_ctx),
-	offsetof(struct ENBConfigurationUpdateAcknowledge_IEs__value, present),
-	sizeof(((struct ENBConfigurationUpdateAcknowledge_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_140,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_140 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_140,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_140	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ENBConfigurationUpdateAcknowledge_IEs_137[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdateAcknowledge_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_138,  memb_id_constraint_137 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdateAcknowledge_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ENBConfigurationUpdateAcknowledge_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_139,  memb_criticality_constraint_137 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdateAcknowledge_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_140,
-		select_ENBConfigurationUpdateAcknowledge_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_140,  memb_value_constraint_137 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENBConfigurationUpdateAcknowledge_IEs_tags_137[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENBConfigurationUpdateAcknowledge_IEs_tag2el_137[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationUpdateAcknowledge_IEs_specs_137 = {
-	sizeof(struct ENBConfigurationUpdateAcknowledge_IEs),
-	offsetof(struct ENBConfigurationUpdateAcknowledge_IEs, _asn_ctx),
-	asn_MAP_ENBConfigurationUpdateAcknowledge_IEs_tag2el_137,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdateAcknowledge_IEs = {
-	"ENBConfigurationUpdateAcknowledge-IEs",
-	"ENBConfigurationUpdateAcknowledge-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENBConfigurationUpdateAcknowledge_IEs_tags_137,
-	sizeof(asn_DEF_ENBConfigurationUpdateAcknowledge_IEs_tags_137)
-		/sizeof(asn_DEF_ENBConfigurationUpdateAcknowledge_IEs_tags_137[0]), /* 1 */
-	asn_DEF_ENBConfigurationUpdateAcknowledge_IEs_tags_137,	/* Same as above */
-	sizeof(asn_DEF_ENBConfigurationUpdateAcknowledge_IEs_tags_137)
-		/sizeof(asn_DEF_ENBConfigurationUpdateAcknowledge_IEs_tags_137[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENBConfigurationUpdateAcknowledge_IEs_137,
-	3,	/* Elements count */
-	&asn_SPC_ENBConfigurationUpdateAcknowledge_IEs_specs_137	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_144[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdateFailure_IEs__value, choice.Cause),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_Cause,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"Cause"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdateFailure_IEs__value, choice.TimeToWait),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_TimeToWait,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"TimeToWait"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdateFailure_IEs__value, choice.CriticalityDiagnostics),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CriticalityDiagnostics,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CriticalityDiagnostics"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_144[] = { 1, 2, 0 };
-static const unsigned asn_MAP_value_from_canonical_144[] = { 2, 0, 1 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_144[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 }, /* TimeToWait */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, 0, 0 }, /* CriticalityDiagnostics */
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* radioNetwork */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* transport */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 }, /* protocol */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 } /* misc */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_144 = {
-	sizeof(struct ENBConfigurationUpdateFailure_IEs__value),
-	offsetof(struct ENBConfigurationUpdateFailure_IEs__value, _asn_ctx),
-	offsetof(struct ENBConfigurationUpdateFailure_IEs__value, present),
-	sizeof(((struct ENBConfigurationUpdateFailure_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_144,
-	6,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_144,
-	asn_MAP_value_from_canonical_144,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_144 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_144,
-	3,	/* Elements count */
-	&asn_SPC_value_specs_144	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ENBConfigurationUpdateFailure_IEs_141[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdateFailure_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_142,  memb_id_constraint_141 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdateFailure_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ENBConfigurationUpdateFailure_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_143,  memb_criticality_constraint_141 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ENBConfigurationUpdateFailure_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_144,
-		select_ENBConfigurationUpdateFailure_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_144,  memb_value_constraint_141 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENBConfigurationUpdateFailure_IEs_tags_141[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENBConfigurationUpdateFailure_IEs_tag2el_141[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationUpdateFailure_IEs_specs_141 = {
-	sizeof(struct ENBConfigurationUpdateFailure_IEs),
-	offsetof(struct ENBConfigurationUpdateFailure_IEs, _asn_ctx),
-	asn_MAP_ENBConfigurationUpdateFailure_IEs_tag2el_141,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdateFailure_IEs = {
-	"ENBConfigurationUpdateFailure-IEs",
-	"ENBConfigurationUpdateFailure-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENBConfigurationUpdateFailure_IEs_tags_141,
-	sizeof(asn_DEF_ENBConfigurationUpdateFailure_IEs_tags_141)
-		/sizeof(asn_DEF_ENBConfigurationUpdateFailure_IEs_tags_141[0]), /* 1 */
-	asn_DEF_ENBConfigurationUpdateFailure_IEs_tags_141,	/* Same as above */
-	sizeof(asn_DEF_ENBConfigurationUpdateFailure_IEs_tags_141)
-		/sizeof(asn_DEF_ENBConfigurationUpdateFailure_IEs_tags_141[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENBConfigurationUpdateFailure_IEs_141,
-	3,	/* Elements count */
-	&asn_SPC_ENBConfigurationUpdateFailure_IEs_specs_141	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_148[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusRequest_IEs__value, choice.Measurement_ID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_Measurement_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"Measurement-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusRequest_IEs__value, choice.Registration_Request),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_Registration_Request,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"Registration-Request"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusRequest_IEs__value, choice.ReportCharacteristics),
-		(ASN_TAG_CLASS_UNIVERSAL | (3 << 2)),
-		0,
-		&asn_DEF_ReportCharacteristics,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ReportCharacteristics"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusRequest_IEs__value, choice.CellToReport_List),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CellToReport_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CellToReport-List"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusRequest_IEs__value, choice.ReportingPeriodicity),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_ReportingPeriodicity,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ReportingPeriodicity"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusRequest_IEs__value, choice.PartialSuccessIndicator),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_PartialSuccessIndicator,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"PartialSuccessIndicator"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusRequest_IEs__value, choice.ReportingPeriodicityRSRPMR),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_ReportingPeriodicityRSRPMR,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ReportingPeriodicityRSRPMR"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusRequest_IEs__value, choice.ReportingPeriodicityCSIR),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_ReportingPeriodicityCSIR,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ReportingPeriodicityCSIR"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_148[] = { 0, 2, 1, 4, 5, 6, 7, 3 };
-static const unsigned asn_MAP_value_from_canonical_148[] = { 0, 2, 1, 7, 3, 4, 5, 6 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_148[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* Measurement-ID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 2, 0, 0 }, /* ReportCharacteristics */
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 4 }, /* Registration-Request */
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 4, -1, 3 }, /* ReportingPeriodicity */
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 5, -2, 2 }, /* PartialSuccessIndicator */
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 6, -3, 1 }, /* ReportingPeriodicityRSRPMR */
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 7, -4, 0 }, /* ReportingPeriodicityCSIR */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, 0, 0 } /* CellToReport-List */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_148 = {
-	sizeof(struct ResourceStatusRequest_IEs__value),
-	offsetof(struct ResourceStatusRequest_IEs__value, _asn_ctx),
-	offsetof(struct ResourceStatusRequest_IEs__value, present),
-	sizeof(((struct ResourceStatusRequest_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_148,
-	8,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_148,
-	asn_MAP_value_from_canonical_148,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_148 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_148,
-	8,	/* Elements count */
-	&asn_SPC_value_specs_148	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ResourceStatusRequest_IEs_145[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusRequest_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_146,  memb_id_constraint_145 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusRequest_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ResourceStatusRequest_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_147,  memb_criticality_constraint_145 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResourceStatusRequest_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_148,
-		select_ResourceStatusRequest_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_148,  memb_value_constraint_145 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ResourceStatusRequest_IEs_tags_145[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResourceStatusRequest_IEs_tag2el_145[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusRequest_IEs_specs_145 = {
-	sizeof(struct ResourceStatusRequest_IEs),
-	offsetof(struct ResourceStatusRequest_IEs, _asn_ctx),
-	asn_MAP_ResourceStatusRequest_IEs_tag2el_145,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResourceStatusRequest_IEs = {
-	"ResourceStatusRequest-IEs",
-	"ResourceStatusRequest-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResourceStatusRequest_IEs_tags_145,
-	sizeof(asn_DEF_ResourceStatusRequest_IEs_tags_145)
-		/sizeof(asn_DEF_ResourceStatusRequest_IEs_tags_145[0]), /* 1 */
-	asn_DEF_ResourceStatusRequest_IEs_tags_145,	/* Same as above */
-	sizeof(asn_DEF_ResourceStatusRequest_IEs_tags_145)
-		/sizeof(asn_DEF_ResourceStatusRequest_IEs_tags_145[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResourceStatusRequest_IEs_145,
-	3,	/* Elements count */
-	&asn_SPC_ResourceStatusRequest_IEs_specs_145	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_152[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusResponse_IEs__value, choice.Measurement_ID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_Measurement_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"Measurement-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusResponse_IEs__value, choice.CriticalityDiagnostics),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CriticalityDiagnostics,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CriticalityDiagnostics"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusResponse_IEs__value, choice.MeasurementInitiationResult_List),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_MeasurementInitiationResult_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"MeasurementInitiationResult-List"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_152[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* Measurement-ID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 1 }, /* CriticalityDiagnostics */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 } /* MeasurementInitiationResult-List */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_152 = {
-	sizeof(struct ResourceStatusResponse_IEs__value),
-	offsetof(struct ResourceStatusResponse_IEs__value, _asn_ctx),
-	offsetof(struct ResourceStatusResponse_IEs__value, present),
-	sizeof(((struct ResourceStatusResponse_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_152,
-	3,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_152 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_152,
-	3,	/* Elements count */
-	&asn_SPC_value_specs_152	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ResourceStatusResponse_IEs_149[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusResponse_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_150,  memb_id_constraint_149 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusResponse_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ResourceStatusResponse_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_151,  memb_criticality_constraint_149 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResourceStatusResponse_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_152,
-		select_ResourceStatusResponse_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_152,  memb_value_constraint_149 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ResourceStatusResponse_IEs_tags_149[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResourceStatusResponse_IEs_tag2el_149[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusResponse_IEs_specs_149 = {
-	sizeof(struct ResourceStatusResponse_IEs),
-	offsetof(struct ResourceStatusResponse_IEs, _asn_ctx),
-	asn_MAP_ResourceStatusResponse_IEs_tag2el_149,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResourceStatusResponse_IEs = {
-	"ResourceStatusResponse-IEs",
-	"ResourceStatusResponse-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResourceStatusResponse_IEs_tags_149,
-	sizeof(asn_DEF_ResourceStatusResponse_IEs_tags_149)
-		/sizeof(asn_DEF_ResourceStatusResponse_IEs_tags_149[0]), /* 1 */
-	asn_DEF_ResourceStatusResponse_IEs_tags_149,	/* Same as above */
-	sizeof(asn_DEF_ResourceStatusResponse_IEs_tags_149)
-		/sizeof(asn_DEF_ResourceStatusResponse_IEs_tags_149[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResourceStatusResponse_IEs_149,
-	3,	/* Elements count */
-	&asn_SPC_ResourceStatusResponse_IEs_specs_149	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_156[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusFailure_IEs__value, choice.Measurement_ID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_Measurement_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"Measurement-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusFailure_IEs__value, choice.Cause),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_Cause,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"Cause"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusFailure_IEs__value, choice.CriticalityDiagnostics),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CriticalityDiagnostics,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CriticalityDiagnostics"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusFailure_IEs__value, choice.CompleteFailureCauseInformation_List),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CompleteFailureCauseInformation_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CompleteFailureCauseInformation-List"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_156[] = { 0, 2, 3, 1 };
-static const unsigned asn_MAP_value_from_canonical_156[] = { 0, 3, 1, 2 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_156[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* Measurement-ID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, 0, 1 }, /* CriticalityDiagnostics */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -1, 0 }, /* CompleteFailureCauseInformation-List */
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 }, /* radioNetwork */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* transport */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* protocol */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 1, 0, 0 } /* misc */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_156 = {
-	sizeof(struct ResourceStatusFailure_IEs__value),
-	offsetof(struct ResourceStatusFailure_IEs__value, _asn_ctx),
-	offsetof(struct ResourceStatusFailure_IEs__value, present),
-	sizeof(((struct ResourceStatusFailure_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_156,
-	7,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_156,
-	asn_MAP_value_from_canonical_156,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_156 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_156,
-	4,	/* Elements count */
-	&asn_SPC_value_specs_156	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ResourceStatusFailure_IEs_153[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusFailure_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_154,  memb_id_constraint_153 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusFailure_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ResourceStatusFailure_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_155,  memb_criticality_constraint_153 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResourceStatusFailure_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_156,
-		select_ResourceStatusFailure_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_156,  memb_value_constraint_153 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ResourceStatusFailure_IEs_tags_153[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResourceStatusFailure_IEs_tag2el_153[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusFailure_IEs_specs_153 = {
-	sizeof(struct ResourceStatusFailure_IEs),
-	offsetof(struct ResourceStatusFailure_IEs, _asn_ctx),
-	asn_MAP_ResourceStatusFailure_IEs_tag2el_153,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResourceStatusFailure_IEs = {
-	"ResourceStatusFailure-IEs",
-	"ResourceStatusFailure-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResourceStatusFailure_IEs_tags_153,
-	sizeof(asn_DEF_ResourceStatusFailure_IEs_tags_153)
-		/sizeof(asn_DEF_ResourceStatusFailure_IEs_tags_153[0]), /* 1 */
-	asn_DEF_ResourceStatusFailure_IEs_tags_153,	/* Same as above */
-	sizeof(asn_DEF_ResourceStatusFailure_IEs_tags_153)
-		/sizeof(asn_DEF_ResourceStatusFailure_IEs_tags_153[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResourceStatusFailure_IEs_153,
-	3,	/* Elements count */
-	&asn_SPC_ResourceStatusFailure_IEs_specs_153	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_160[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusUpdate_IEs__value, choice.Measurement_ID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_Measurement_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"Measurement-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusUpdate_IEs__value, choice.CellMeasurementResult_List),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CellMeasurementResult_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CellMeasurementResult-List"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_160[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* Measurement-ID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 } /* CellMeasurementResult-List */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_160 = {
-	sizeof(struct ResourceStatusUpdate_IEs__value),
-	offsetof(struct ResourceStatusUpdate_IEs__value, _asn_ctx),
-	offsetof(struct ResourceStatusUpdate_IEs__value, present),
-	sizeof(((struct ResourceStatusUpdate_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_160,
-	2,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_160 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_160,
-	2,	/* Elements count */
-	&asn_SPC_value_specs_160	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ResourceStatusUpdate_IEs_157[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusUpdate_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_158,  memb_id_constraint_157 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusUpdate_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ResourceStatusUpdate_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_159,  memb_criticality_constraint_157 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResourceStatusUpdate_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_160,
-		select_ResourceStatusUpdate_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_160,  memb_value_constraint_157 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ResourceStatusUpdate_IEs_tags_157[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResourceStatusUpdate_IEs_tag2el_157[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusUpdate_IEs_specs_157 = {
-	sizeof(struct ResourceStatusUpdate_IEs),
-	offsetof(struct ResourceStatusUpdate_IEs, _asn_ctx),
-	asn_MAP_ResourceStatusUpdate_IEs_tag2el_157,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResourceStatusUpdate_IEs = {
-	"ResourceStatusUpdate-IEs",
-	"ResourceStatusUpdate-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResourceStatusUpdate_IEs_tags_157,
-	sizeof(asn_DEF_ResourceStatusUpdate_IEs_tags_157)
-		/sizeof(asn_DEF_ResourceStatusUpdate_IEs_tags_157[0]), /* 1 */
-	asn_DEF_ResourceStatusUpdate_IEs_tags_157,	/* Same as above */
-	sizeof(asn_DEF_ResourceStatusUpdate_IEs_tags_157)
-		/sizeof(asn_DEF_ResourceStatusUpdate_IEs_tags_157[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResourceStatusUpdate_IEs_157,
-	3,	/* Elements count */
-	&asn_SPC_ResourceStatusUpdate_IEs_specs_157	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_164[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SeNBReconfigurationComplete_IEs__value, choice.UE_X2AP_ID),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_UE_X2AP_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"UE-X2AP-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SeNBReconfigurationComplete_IEs__value, choice.ResponseInformationSeNBReconfComp),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_ResponseInformationSeNBReconfComp,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ResponseInformationSeNBReconfComp"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SeNBReconfigurationComplete_IEs__value, choice.UE_X2AP_ID_Extension),
-		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
-		0,
-		&asn_DEF_UE_X2AP_ID_Extension,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"UE-X2AP-ID-Extension"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_164[] = { 0, 2, 1 };
-static const unsigned asn_MAP_value_from_canonical_164[] = { 0, 2, 1 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_164[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 1 }, /* UE-X2AP-ID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 2, -1, 0 }, /* UE-X2AP-ID-Extension */
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 }, /* success */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* reject-by-MeNB */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_164 = {
-	sizeof(struct SeNBReconfigurationComplete_IEs__value),
-	offsetof(struct SeNBReconfigurationComplete_IEs__value, _asn_ctx),
-	offsetof(struct SeNBReconfigurationComplete_IEs__value, present),
-	sizeof(((struct SeNBReconfigurationComplete_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_164,
-	4,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_164,
-	asn_MAP_value_from_canonical_164,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_164 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_164,
-	3,	/* Elements count */
-	&asn_SPC_value_specs_164	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_SeNBReconfigurationComplete_IEs_161[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SeNBReconfigurationComplete_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_162,  memb_id_constraint_161 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SeNBReconfigurationComplete_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_SeNBReconfigurationComplete_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_163,  memb_criticality_constraint_161 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct SeNBReconfigurationComplete_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_164,
-		select_SeNBReconfigurationComplete_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_164,  memb_value_constraint_161 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_SeNBReconfigurationComplete_IEs_tags_161[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_SeNBReconfigurationComplete_IEs_tag2el_161[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_SeNBReconfigurationComplete_IEs_specs_161 = {
-	sizeof(struct SeNBReconfigurationComplete_IEs),
-	offsetof(struct SeNBReconfigurationComplete_IEs, _asn_ctx),
-	asn_MAP_SeNBReconfigurationComplete_IEs_tag2el_161,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_SeNBReconfigurationComplete_IEs = {
-	"SeNBReconfigurationComplete-IEs",
-	"SeNBReconfigurationComplete-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_SeNBReconfigurationComplete_IEs_tags_161,
-	sizeof(asn_DEF_SeNBReconfigurationComplete_IEs_tags_161)
-		/sizeof(asn_DEF_SeNBReconfigurationComplete_IEs_tags_161[0]), /* 1 */
-	asn_DEF_SeNBReconfigurationComplete_IEs_tags_161,	/* Same as above */
-	sizeof(asn_DEF_SeNBReconfigurationComplete_IEs_tags_161)
-		/sizeof(asn_DEF_SeNBReconfigurationComplete_IEs_tags_161[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_SeNBReconfigurationComplete_IEs_161,
-	3,	/* Elements count */
-	&asn_SPC_SeNBReconfigurationComplete_IEs_specs_161	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_168[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupRequest_IEs__value, choice.InitiatingNodeType_EndcX2Setup),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_InitiatingNodeType_EndcX2Setup,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"InitiatingNodeType-EndcX2Setup"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_168[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* init-eNB */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 } /* init-en-gNB */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_168 = {
-	sizeof(struct ENDCX2SetupRequest_IEs__value),
-	offsetof(struct ENDCX2SetupRequest_IEs__value, _asn_ctx),
-	offsetof(struct ENDCX2SetupRequest_IEs__value, present),
-	sizeof(((struct ENDCX2SetupRequest_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_168,
-	2,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_168 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_168,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_168	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ENDCX2SetupRequest_IEs_165[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupRequest_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_166,  memb_id_constraint_165 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupRequest_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ENDCX2SetupRequest_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_167,  memb_criticality_constraint_165 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupRequest_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_168,
-		select_ENDCX2SetupRequest_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_168,  memb_value_constraint_165 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENDCX2SetupRequest_IEs_tags_165[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENDCX2SetupRequest_IEs_tag2el_165[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENDCX2SetupRequest_IEs_specs_165 = {
-	sizeof(struct ENDCX2SetupRequest_IEs),
-	offsetof(struct ENDCX2SetupRequest_IEs, _asn_ctx),
-	asn_MAP_ENDCX2SetupRequest_IEs_tag2el_165,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENDCX2SetupRequest_IEs = {
-	"ENDCX2SetupRequest-IEs",
-	"ENDCX2SetupRequest-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENDCX2SetupRequest_IEs_tags_165,
-	sizeof(asn_DEF_ENDCX2SetupRequest_IEs_tags_165)
-		/sizeof(asn_DEF_ENDCX2SetupRequest_IEs_tags_165[0]), /* 1 */
-	asn_DEF_ENDCX2SetupRequest_IEs_tags_165,	/* Same as above */
-	sizeof(asn_DEF_ENDCX2SetupRequest_IEs_tags_165)
-		/sizeof(asn_DEF_ENDCX2SetupRequest_IEs_tags_165[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENDCX2SetupRequest_IEs_165,
-	3,	/* Elements count */
-	&asn_SPC_ENDCX2SetupRequest_IEs_specs_165	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_172[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCX2SetupReqIEs__value, choice.GlobalENB_ID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_GlobalENB_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"GlobalENB-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCX2SetupReqIEs__value, choice.ServedEUTRAcellsENDCX2ManagementList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedEUTRAcellsENDCX2ManagementList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ServedEUTRAcellsENDCX2ManagementList"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_172[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* GlobalENB-ID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 } /* ServedEUTRAcellsENDCX2ManagementList */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_172 = {
-	sizeof(struct ENB_ENDCX2SetupReqIEs__value),
-	offsetof(struct ENB_ENDCX2SetupReqIEs__value, _asn_ctx),
-	offsetof(struct ENB_ENDCX2SetupReqIEs__value, present),
-	sizeof(((struct ENB_ENDCX2SetupReqIEs__value *)0)->present),
-	asn_MAP_value_tag2el_172,
-	2,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_172 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_172,
-	2,	/* Elements count */
-	&asn_SPC_value_specs_172	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ENB_ENDCX2SetupReqIEs_169[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCX2SetupReqIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_170,  memb_id_constraint_169 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCX2SetupReqIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ENB_ENDCX2SetupReqIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_171,  memb_criticality_constraint_169 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCX2SetupReqIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_172,
-		select_ENB_ENDCX2SetupReqIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_172,  memb_value_constraint_169 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENB_ENDCX2SetupReqIEs_tags_169[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENB_ENDCX2SetupReqIEs_tag2el_169[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENB_ENDCX2SetupReqIEs_specs_169 = {
-	sizeof(struct ENB_ENDCX2SetupReqIEs),
-	offsetof(struct ENB_ENDCX2SetupReqIEs, _asn_ctx),
-	asn_MAP_ENB_ENDCX2SetupReqIEs_tag2el_169,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENB_ENDCX2SetupReqIEs = {
-	"ENB-ENDCX2SetupReqIEs",
-	"ENB-ENDCX2SetupReqIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENB_ENDCX2SetupReqIEs_tags_169,
-	sizeof(asn_DEF_ENB_ENDCX2SetupReqIEs_tags_169)
-		/sizeof(asn_DEF_ENB_ENDCX2SetupReqIEs_tags_169[0]), /* 1 */
-	asn_DEF_ENB_ENDCX2SetupReqIEs_tags_169,	/* Same as above */
-	sizeof(asn_DEF_ENB_ENDCX2SetupReqIEs_tags_169)
-		/sizeof(asn_DEF_ENB_ENDCX2SetupReqIEs_tags_169[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENB_ENDCX2SetupReqIEs_169,
-	3,	/* Elements count */
-	&asn_SPC_ENB_ENDCX2SetupReqIEs_specs_169	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_176[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCX2SetupReqIEs__value, choice.GlobalGNB_ID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_GlobalGNB_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"GlobalGNB-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCX2SetupReqIEs__value, choice.ServedNRcellsENDCX2ManagementList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedNRcellsENDCX2ManagementList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ServedNRcellsENDCX2ManagementList"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_176[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* GlobalGNB-ID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 } /* ServedNRcellsENDCX2ManagementList */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_176 = {
-	sizeof(struct En_gNB_ENDCX2SetupReqIEs__value),
-	offsetof(struct En_gNB_ENDCX2SetupReqIEs__value, _asn_ctx),
-	offsetof(struct En_gNB_ENDCX2SetupReqIEs__value, present),
-	sizeof(((struct En_gNB_ENDCX2SetupReqIEs__value *)0)->present),
-	asn_MAP_value_tag2el_176,
-	2,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_176 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_176,
-	2,	/* Elements count */
-	&asn_SPC_value_specs_176	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_En_gNB_ENDCX2SetupReqIEs_173[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCX2SetupReqIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_174,  memb_id_constraint_173 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCX2SetupReqIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_En_gNB_ENDCX2SetupReqIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_175,  memb_criticality_constraint_173 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCX2SetupReqIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_176,
-		select_En_gNB_ENDCX2SetupReqIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_176,  memb_value_constraint_173 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_En_gNB_ENDCX2SetupReqIEs_tags_173[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_En_gNB_ENDCX2SetupReqIEs_tag2el_173[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_En_gNB_ENDCX2SetupReqIEs_specs_173 = {
-	sizeof(struct En_gNB_ENDCX2SetupReqIEs),
-	offsetof(struct En_gNB_ENDCX2SetupReqIEs, _asn_ctx),
-	asn_MAP_En_gNB_ENDCX2SetupReqIEs_tag2el_173,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_En_gNB_ENDCX2SetupReqIEs = {
-	"En-gNB-ENDCX2SetupReqIEs",
-	"En-gNB-ENDCX2SetupReqIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_En_gNB_ENDCX2SetupReqIEs_tags_173,
-	sizeof(asn_DEF_En_gNB_ENDCX2SetupReqIEs_tags_173)
-		/sizeof(asn_DEF_En_gNB_ENDCX2SetupReqIEs_tags_173[0]), /* 1 */
-	asn_DEF_En_gNB_ENDCX2SetupReqIEs_tags_173,	/* Same as above */
-	sizeof(asn_DEF_En_gNB_ENDCX2SetupReqIEs_tags_173)
-		/sizeof(asn_DEF_En_gNB_ENDCX2SetupReqIEs_tags_173[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_En_gNB_ENDCX2SetupReqIEs_173,
-	3,	/* Elements count */
-	&asn_SPC_En_gNB_ENDCX2SetupReqIEs_specs_173	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_180[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupResponse_IEs__value, choice.RespondingNodeType_EndcX2Setup),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_RespondingNodeType_EndcX2Setup,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RespondingNodeType-EndcX2Setup"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_180[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* respond-eNB */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 } /* respond-en-gNB */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_180 = {
-	sizeof(struct ENDCX2SetupResponse_IEs__value),
-	offsetof(struct ENDCX2SetupResponse_IEs__value, _asn_ctx),
-	offsetof(struct ENDCX2SetupResponse_IEs__value, present),
-	sizeof(((struct ENDCX2SetupResponse_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_180,
-	2,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_180 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_180,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_180	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ENDCX2SetupResponse_IEs_177[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupResponse_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_178,  memb_id_constraint_177 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupResponse_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ENDCX2SetupResponse_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_179,  memb_criticality_constraint_177 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupResponse_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_180,
-		select_ENDCX2SetupResponse_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_180,  memb_value_constraint_177 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENDCX2SetupResponse_IEs_tags_177[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENDCX2SetupResponse_IEs_tag2el_177[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENDCX2SetupResponse_IEs_specs_177 = {
-	sizeof(struct ENDCX2SetupResponse_IEs),
-	offsetof(struct ENDCX2SetupResponse_IEs, _asn_ctx),
-	asn_MAP_ENDCX2SetupResponse_IEs_tag2el_177,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENDCX2SetupResponse_IEs = {
-	"ENDCX2SetupResponse-IEs",
-	"ENDCX2SetupResponse-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENDCX2SetupResponse_IEs_tags_177,
-	sizeof(asn_DEF_ENDCX2SetupResponse_IEs_tags_177)
-		/sizeof(asn_DEF_ENDCX2SetupResponse_IEs_tags_177[0]), /* 1 */
-	asn_DEF_ENDCX2SetupResponse_IEs_tags_177,	/* Same as above */
-	sizeof(asn_DEF_ENDCX2SetupResponse_IEs_tags_177)
-		/sizeof(asn_DEF_ENDCX2SetupResponse_IEs_tags_177[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENDCX2SetupResponse_IEs_177,
-	3,	/* Elements count */
-	&asn_SPC_ENDCX2SetupResponse_IEs_specs_177	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_184[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCX2SetupReqAckIEs__value, choice.GlobalENB_ID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_GlobalENB_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"GlobalENB-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCX2SetupReqAckIEs__value, choice.ServedEUTRAcellsENDCX2ManagementList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedEUTRAcellsENDCX2ManagementList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ServedEUTRAcellsENDCX2ManagementList"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_184[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* GlobalENB-ID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 } /* ServedEUTRAcellsENDCX2ManagementList */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_184 = {
-	sizeof(struct ENB_ENDCX2SetupReqAckIEs__value),
-	offsetof(struct ENB_ENDCX2SetupReqAckIEs__value, _asn_ctx),
-	offsetof(struct ENB_ENDCX2SetupReqAckIEs__value, present),
-	sizeof(((struct ENB_ENDCX2SetupReqAckIEs__value *)0)->present),
-	asn_MAP_value_tag2el_184,
-	2,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_184 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_184,
-	2,	/* Elements count */
-	&asn_SPC_value_specs_184	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ENB_ENDCX2SetupReqAckIEs_181[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCX2SetupReqAckIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_182,  memb_id_constraint_181 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCX2SetupReqAckIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ENB_ENDCX2SetupReqAckIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_183,  memb_criticality_constraint_181 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCX2SetupReqAckIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_184,
-		select_ENB_ENDCX2SetupReqAckIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_184,  memb_value_constraint_181 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENB_ENDCX2SetupReqAckIEs_tags_181[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENB_ENDCX2SetupReqAckIEs_tag2el_181[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENB_ENDCX2SetupReqAckIEs_specs_181 = {
-	sizeof(struct ENB_ENDCX2SetupReqAckIEs),
-	offsetof(struct ENB_ENDCX2SetupReqAckIEs, _asn_ctx),
-	asn_MAP_ENB_ENDCX2SetupReqAckIEs_tag2el_181,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENB_ENDCX2SetupReqAckIEs = {
-	"ENB-ENDCX2SetupReqAckIEs",
-	"ENB-ENDCX2SetupReqAckIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENB_ENDCX2SetupReqAckIEs_tags_181,
-	sizeof(asn_DEF_ENB_ENDCX2SetupReqAckIEs_tags_181)
-		/sizeof(asn_DEF_ENB_ENDCX2SetupReqAckIEs_tags_181[0]), /* 1 */
-	asn_DEF_ENB_ENDCX2SetupReqAckIEs_tags_181,	/* Same as above */
-	sizeof(asn_DEF_ENB_ENDCX2SetupReqAckIEs_tags_181)
-		/sizeof(asn_DEF_ENB_ENDCX2SetupReqAckIEs_tags_181[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENB_ENDCX2SetupReqAckIEs_181,
-	3,	/* Elements count */
-	&asn_SPC_ENB_ENDCX2SetupReqAckIEs_specs_181	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_188[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCX2SetupReqAckIEs__value, choice.GlobalGNB_ID),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_GlobalGNB_ID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"GlobalGNB-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCX2SetupReqAckIEs__value, choice.ServedNRcellsENDCX2ManagementList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedNRcellsENDCX2ManagementList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ServedNRcellsENDCX2ManagementList"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_188[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* GlobalGNB-ID */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 } /* ServedNRcellsENDCX2ManagementList */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_188 = {
-	sizeof(struct En_gNB_ENDCX2SetupReqAckIEs__value),
-	offsetof(struct En_gNB_ENDCX2SetupReqAckIEs__value, _asn_ctx),
-	offsetof(struct En_gNB_ENDCX2SetupReqAckIEs__value, present),
-	sizeof(((struct En_gNB_ENDCX2SetupReqAckIEs__value *)0)->present),
-	asn_MAP_value_tag2el_188,
-	2,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_188 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_188,
-	2,	/* Elements count */
-	&asn_SPC_value_specs_188	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_En_gNB_ENDCX2SetupReqAckIEs_185[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCX2SetupReqAckIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_186,  memb_id_constraint_185 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCX2SetupReqAckIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_En_gNB_ENDCX2SetupReqAckIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_187,  memb_criticality_constraint_185 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCX2SetupReqAckIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_188,
-		select_En_gNB_ENDCX2SetupReqAckIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_188,  memb_value_constraint_185 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_En_gNB_ENDCX2SetupReqAckIEs_tags_185[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_En_gNB_ENDCX2SetupReqAckIEs_tag2el_185[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_En_gNB_ENDCX2SetupReqAckIEs_specs_185 = {
-	sizeof(struct En_gNB_ENDCX2SetupReqAckIEs),
-	offsetof(struct En_gNB_ENDCX2SetupReqAckIEs, _asn_ctx),
-	asn_MAP_En_gNB_ENDCX2SetupReqAckIEs_tag2el_185,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_En_gNB_ENDCX2SetupReqAckIEs = {
-	"En-gNB-ENDCX2SetupReqAckIEs",
-	"En-gNB-ENDCX2SetupReqAckIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_En_gNB_ENDCX2SetupReqAckIEs_tags_185,
-	sizeof(asn_DEF_En_gNB_ENDCX2SetupReqAckIEs_tags_185)
-		/sizeof(asn_DEF_En_gNB_ENDCX2SetupReqAckIEs_tags_185[0]), /* 1 */
-	asn_DEF_En_gNB_ENDCX2SetupReqAckIEs_tags_185,	/* Same as above */
-	sizeof(asn_DEF_En_gNB_ENDCX2SetupReqAckIEs_tags_185)
-		/sizeof(asn_DEF_En_gNB_ENDCX2SetupReqAckIEs_tags_185[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_En_gNB_ENDCX2SetupReqAckIEs_185,
-	3,	/* Elements count */
-	&asn_SPC_En_gNB_ENDCX2SetupReqAckIEs_specs_185	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_192[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupFailure_IEs__value, choice.Cause),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_Cause,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"Cause"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupFailure_IEs__value, choice.CriticalityDiagnostics),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CriticalityDiagnostics,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CriticalityDiagnostics"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupFailure_IEs__value, choice.TimeToWait),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_TimeToWait,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"TimeToWait"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_192[] = { 2, 1, 0 };
-static const unsigned asn_MAP_value_from_canonical_192[] = { 2, 1, 0 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_192[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 2, 0, 0 }, /* TimeToWait */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* CriticalityDiagnostics */
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* radioNetwork */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* transport */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 }, /* protocol */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 } /* misc */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_192 = {
-	sizeof(struct ENDCX2SetupFailure_IEs__value),
-	offsetof(struct ENDCX2SetupFailure_IEs__value, _asn_ctx),
-	offsetof(struct ENDCX2SetupFailure_IEs__value, present),
-	sizeof(((struct ENDCX2SetupFailure_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_192,
-	6,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_192,
-	asn_MAP_value_from_canonical_192,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_192 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_192,
-	3,	/* Elements count */
-	&asn_SPC_value_specs_192	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ENDCX2SetupFailure_IEs_189[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupFailure_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_190,  memb_id_constraint_189 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupFailure_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ENDCX2SetupFailure_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_191,  memb_criticality_constraint_189 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ENDCX2SetupFailure_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_192,
-		select_ENDCX2SetupFailure_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_192,  memb_value_constraint_189 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENDCX2SetupFailure_IEs_tags_189[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENDCX2SetupFailure_IEs_tag2el_189[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENDCX2SetupFailure_IEs_specs_189 = {
-	sizeof(struct ENDCX2SetupFailure_IEs),
-	offsetof(struct ENDCX2SetupFailure_IEs, _asn_ctx),
-	asn_MAP_ENDCX2SetupFailure_IEs_tag2el_189,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENDCX2SetupFailure_IEs = {
-	"ENDCX2SetupFailure-IEs",
-	"ENDCX2SetupFailure-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENDCX2SetupFailure_IEs_tags_189,
-	sizeof(asn_DEF_ENDCX2SetupFailure_IEs_tags_189)
-		/sizeof(asn_DEF_ENDCX2SetupFailure_IEs_tags_189[0]), /* 1 */
-	asn_DEF_ENDCX2SetupFailure_IEs_tags_189,	/* Same as above */
-	sizeof(asn_DEF_ENDCX2SetupFailure_IEs_tags_189)
-		/sizeof(asn_DEF_ENDCX2SetupFailure_IEs_tags_189[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENDCX2SetupFailure_IEs_189,
-	3,	/* Elements count */
-	&asn_SPC_ENDCX2SetupFailure_IEs_specs_189	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_196[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdate_IEs__value, choice.InitiatingNodeType_EndcConfigUpdate),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_InitiatingNodeType_EndcConfigUpdate,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"InitiatingNodeType-EndcConfigUpdate"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_196[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* init-eNB */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 } /* init-en-gNB */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_196 = {
-	sizeof(struct ENDCConfigurationUpdate_IEs__value),
-	offsetof(struct ENDCConfigurationUpdate_IEs__value, _asn_ctx),
-	offsetof(struct ENDCConfigurationUpdate_IEs__value, present),
-	sizeof(((struct ENDCConfigurationUpdate_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_196,
-	2,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_196 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_196,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_196	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ENDCConfigurationUpdate_IEs_193[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdate_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_194,  memb_id_constraint_193 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdate_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ENDCConfigurationUpdate_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_195,  memb_criticality_constraint_193 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdate_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_196,
-		select_ENDCConfigurationUpdate_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_196,  memb_value_constraint_193 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENDCConfigurationUpdate_IEs_tags_193[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENDCConfigurationUpdate_IEs_tag2el_193[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENDCConfigurationUpdate_IEs_specs_193 = {
-	sizeof(struct ENDCConfigurationUpdate_IEs),
-	offsetof(struct ENDCConfigurationUpdate_IEs, _asn_ctx),
-	asn_MAP_ENDCConfigurationUpdate_IEs_tag2el_193,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENDCConfigurationUpdate_IEs = {
-	"ENDCConfigurationUpdate-IEs",
-	"ENDCConfigurationUpdate-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENDCConfigurationUpdate_IEs_tags_193,
-	sizeof(asn_DEF_ENDCConfigurationUpdate_IEs_tags_193)
-		/sizeof(asn_DEF_ENDCConfigurationUpdate_IEs_tags_193[0]), /* 1 */
-	asn_DEF_ENDCConfigurationUpdate_IEs_tags_193,	/* Same as above */
-	sizeof(asn_DEF_ENDCConfigurationUpdate_IEs_tags_193)
-		/sizeof(asn_DEF_ENDCConfigurationUpdate_IEs_tags_193[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENDCConfigurationUpdate_IEs_193,
-	3,	/* Elements count */
-	&asn_SPC_ENDCConfigurationUpdate_IEs_specs_193	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_200[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCConfigUpdateIEs__value, choice.CellAssistanceInformation),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_CellAssistanceInformation,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CellAssistanceInformation"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCConfigUpdateIEs__value, choice.ServedEUTRAcellsENDCX2ManagementList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedEUTRAcellsENDCX2ManagementList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ServedEUTRAcellsENDCX2ManagementList"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCConfigUpdateIEs__value, choice.ServedEUTRAcellsToModifyListENDCConfUpd),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ServedEUTRAcellsToModifyListENDCConfUpd"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCConfigUpdateIEs__value, choice.ServedEUTRAcellsToDeleteListENDCConfUpd),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedEUTRAcellsToDeleteListENDCConfUpd,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ServedEUTRAcellsToDeleteListENDCConfUpd"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_200[] = { 1, 2, 3, 0 };
-static const unsigned asn_MAP_value_from_canonical_200[] = { 3, 0, 1, 2 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_200[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 2 }, /* ServedEUTRAcellsENDCX2ManagementList */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 1 }, /* ServedEUTRAcellsToModifyListENDCConfUpd */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -2, 0 }, /* ServedEUTRAcellsToDeleteListENDCConfUpd */
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* limited-list */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 } /* full-list */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_200 = {
-	sizeof(struct ENB_ENDCConfigUpdateIEs__value),
-	offsetof(struct ENB_ENDCConfigUpdateIEs__value, _asn_ctx),
-	offsetof(struct ENB_ENDCConfigUpdateIEs__value, present),
-	sizeof(((struct ENB_ENDCConfigUpdateIEs__value *)0)->present),
-	asn_MAP_value_tag2el_200,
-	5,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_200,
-	asn_MAP_value_from_canonical_200,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_200 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_200,
-	4,	/* Elements count */
-	&asn_SPC_value_specs_200	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ENB_ENDCConfigUpdateIEs_197[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCConfigUpdateIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_198,  memb_id_constraint_197 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCConfigUpdateIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ENB_ENDCConfigUpdateIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_199,  memb_criticality_constraint_197 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCConfigUpdateIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_200,
-		select_ENB_ENDCConfigUpdateIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_200,  memb_value_constraint_197 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENB_ENDCConfigUpdateIEs_tags_197[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENB_ENDCConfigUpdateIEs_tag2el_197[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENB_ENDCConfigUpdateIEs_specs_197 = {
-	sizeof(struct ENB_ENDCConfigUpdateIEs),
-	offsetof(struct ENB_ENDCConfigUpdateIEs, _asn_ctx),
-	asn_MAP_ENB_ENDCConfigUpdateIEs_tag2el_197,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENB_ENDCConfigUpdateIEs = {
-	"ENB-ENDCConfigUpdateIEs",
-	"ENB-ENDCConfigUpdateIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENB_ENDCConfigUpdateIEs_tags_197,
-	sizeof(asn_DEF_ENB_ENDCConfigUpdateIEs_tags_197)
-		/sizeof(asn_DEF_ENB_ENDCConfigUpdateIEs_tags_197[0]), /* 1 */
-	asn_DEF_ENB_ENDCConfigUpdateIEs_tags_197,	/* Same as above */
-	sizeof(asn_DEF_ENB_ENDCConfigUpdateIEs_tags_197)
-		/sizeof(asn_DEF_ENB_ENDCConfigUpdateIEs_tags_197[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENB_ENDCConfigUpdateIEs_197,
-	3,	/* Elements count */
-	&asn_SPC_ENB_ENDCConfigUpdateIEs_specs_197	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_204[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCConfigUpdateIEs__value, choice.ServedNRcellsENDCX2ManagementList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedNRcellsENDCX2ManagementList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ServedNRcellsENDCX2ManagementList"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCConfigUpdateIEs__value, choice.ServedNRcellsToModifyENDCConfUpdList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedNRcellsToModifyENDCConfUpdList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ServedNRcellsToModifyENDCConfUpdList"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCConfigUpdateIEs__value, choice.ServedNRcellsToDeleteENDCConfUpdList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedNRcellsToDeleteENDCConfUpdList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ServedNRcellsToDeleteENDCConfUpdList"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_204[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 2 }, /* ServedNRcellsENDCX2ManagementList */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 1 }, /* ServedNRcellsToModifyENDCConfUpdList */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 0 } /* ServedNRcellsToDeleteENDCConfUpdList */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_204 = {
-	sizeof(struct En_gNB_ENDCConfigUpdateIEs__value),
-	offsetof(struct En_gNB_ENDCConfigUpdateIEs__value, _asn_ctx),
-	offsetof(struct En_gNB_ENDCConfigUpdateIEs__value, present),
-	sizeof(((struct En_gNB_ENDCConfigUpdateIEs__value *)0)->present),
-	asn_MAP_value_tag2el_204,
-	3,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_204 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_204,
-	3,	/* Elements count */
-	&asn_SPC_value_specs_204	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_En_gNB_ENDCConfigUpdateIEs_201[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCConfigUpdateIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_202,  memb_id_constraint_201 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCConfigUpdateIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_En_gNB_ENDCConfigUpdateIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_203,  memb_criticality_constraint_201 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCConfigUpdateIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_204,
-		select_En_gNB_ENDCConfigUpdateIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_204,  memb_value_constraint_201 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_En_gNB_ENDCConfigUpdateIEs_tags_201[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_En_gNB_ENDCConfigUpdateIEs_tag2el_201[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_En_gNB_ENDCConfigUpdateIEs_specs_201 = {
-	sizeof(struct En_gNB_ENDCConfigUpdateIEs),
-	offsetof(struct En_gNB_ENDCConfigUpdateIEs, _asn_ctx),
-	asn_MAP_En_gNB_ENDCConfigUpdateIEs_tag2el_201,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_En_gNB_ENDCConfigUpdateIEs = {
-	"En-gNB-ENDCConfigUpdateIEs",
-	"En-gNB-ENDCConfigUpdateIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_En_gNB_ENDCConfigUpdateIEs_tags_201,
-	sizeof(asn_DEF_En_gNB_ENDCConfigUpdateIEs_tags_201)
-		/sizeof(asn_DEF_En_gNB_ENDCConfigUpdateIEs_tags_201[0]), /* 1 */
-	asn_DEF_En_gNB_ENDCConfigUpdateIEs_tags_201,	/* Same as above */
-	sizeof(asn_DEF_En_gNB_ENDCConfigUpdateIEs_tags_201)
-		/sizeof(asn_DEF_En_gNB_ENDCConfigUpdateIEs_tags_201[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_En_gNB_ENDCConfigUpdateIEs_201,
-	3,	/* Elements count */
-	&asn_SPC_En_gNB_ENDCConfigUpdateIEs_specs_201	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_208[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdateAcknowledge_IEs__value, choice.RespondingNodeType_EndcConfigUpdate),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_RespondingNodeType_EndcConfigUpdate,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RespondingNodeType-EndcConfigUpdate"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_208[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* respond-eNB */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 } /* respond-en-gNB */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_208 = {
-	sizeof(struct ENDCConfigurationUpdateAcknowledge_IEs__value),
-	offsetof(struct ENDCConfigurationUpdateAcknowledge_IEs__value, _asn_ctx),
-	offsetof(struct ENDCConfigurationUpdateAcknowledge_IEs__value, present),
-	sizeof(((struct ENDCConfigurationUpdateAcknowledge_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_208,
-	2,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_208 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_208,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_208	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ENDCConfigurationUpdateAcknowledge_IEs_205[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdateAcknowledge_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_206,  memb_id_constraint_205 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdateAcknowledge_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ENDCConfigurationUpdateAcknowledge_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_207,  memb_criticality_constraint_205 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdateAcknowledge_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_208,
-		select_ENDCConfigurationUpdateAcknowledge_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_208,  memb_value_constraint_205 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENDCConfigurationUpdateAcknowledge_IEs_tags_205[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENDCConfigurationUpdateAcknowledge_IEs_tag2el_205[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENDCConfigurationUpdateAcknowledge_IEs_specs_205 = {
-	sizeof(struct ENDCConfigurationUpdateAcknowledge_IEs),
-	offsetof(struct ENDCConfigurationUpdateAcknowledge_IEs, _asn_ctx),
-	asn_MAP_ENDCConfigurationUpdateAcknowledge_IEs_tag2el_205,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENDCConfigurationUpdateAcknowledge_IEs = {
-	"ENDCConfigurationUpdateAcknowledge-IEs",
-	"ENDCConfigurationUpdateAcknowledge-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENDCConfigurationUpdateAcknowledge_IEs_tags_205,
-	sizeof(asn_DEF_ENDCConfigurationUpdateAcknowledge_IEs_tags_205)
-		/sizeof(asn_DEF_ENDCConfigurationUpdateAcknowledge_IEs_tags_205[0]), /* 1 */
-	asn_DEF_ENDCConfigurationUpdateAcknowledge_IEs_tags_205,	/* Same as above */
-	sizeof(asn_DEF_ENDCConfigurationUpdateAcknowledge_IEs_tags_205)
-		/sizeof(asn_DEF_ENDCConfigurationUpdateAcknowledge_IEs_tags_205[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENDCConfigurationUpdateAcknowledge_IEs_205,
-	3,	/* Elements count */
-	&asn_SPC_ENDCConfigurationUpdateAcknowledge_IEs_specs_205	/* Additional specs */
-};
-
-static asn_CHOICE_specifics_t asn_SPC_value_specs_212 = {
-	sizeof(struct ENB_ENDCConfigUpdateAckIEs__value),
-	offsetof(struct ENB_ENDCConfigUpdateAckIEs__value, _asn_ctx),
-	offsetof(struct ENB_ENDCConfigUpdateAckIEs__value, present),
-	sizeof(((struct ENB_ENDCConfigUpdateAckIEs__value *)0)->present),
-	0,	/* No top level tags */
-	0,	/* No tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_212 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_value_specs_212	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ENB_ENDCConfigUpdateAckIEs_209[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCConfigUpdateAckIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_210,  memb_id_constraint_209 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCConfigUpdateAckIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		0,
-		{ 0, &asn_PER_memb_criticality_constr_211,  memb_criticality_constraint_209 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ENB_ENDCConfigUpdateAckIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_212,
-		0,
-		{ 0, &asn_PER_memb_value_constr_212,  memb_value_constraint_209 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENB_ENDCConfigUpdateAckIEs_tags_209[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENB_ENDCConfigUpdateAckIEs_tag2el_209[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENB_ENDCConfigUpdateAckIEs_specs_209 = {
-	sizeof(struct ENB_ENDCConfigUpdateAckIEs),
-	offsetof(struct ENB_ENDCConfigUpdateAckIEs, _asn_ctx),
-	asn_MAP_ENB_ENDCConfigUpdateAckIEs_tag2el_209,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENB_ENDCConfigUpdateAckIEs = {
-	"ENB-ENDCConfigUpdateAckIEs",
-	"ENB-ENDCConfigUpdateAckIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENB_ENDCConfigUpdateAckIEs_tags_209,
-	sizeof(asn_DEF_ENB_ENDCConfigUpdateAckIEs_tags_209)
-		/sizeof(asn_DEF_ENB_ENDCConfigUpdateAckIEs_tags_209[0]), /* 1 */
-	asn_DEF_ENB_ENDCConfigUpdateAckIEs_tags_209,	/* Same as above */
-	sizeof(asn_DEF_ENB_ENDCConfigUpdateAckIEs_tags_209)
-		/sizeof(asn_DEF_ENB_ENDCConfigUpdateAckIEs_tags_209[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENB_ENDCConfigUpdateAckIEs_209,
-	3,	/* Elements count */
-	&asn_SPC_ENB_ENDCConfigUpdateAckIEs_specs_209	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_216[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCConfigUpdateAckIEs__value, choice.ServedNRcellsENDCX2ManagementList),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedNRcellsENDCX2ManagementList,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ServedNRcellsENDCX2ManagementList"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_216[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* ServedNRcellsENDCX2ManagementList */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_216 = {
-	sizeof(struct En_gNB_ENDCConfigUpdateAckIEs__value),
-	offsetof(struct En_gNB_ENDCConfigUpdateAckIEs__value, _asn_ctx),
-	offsetof(struct En_gNB_ENDCConfigUpdateAckIEs__value, present),
-	sizeof(((struct En_gNB_ENDCConfigUpdateAckIEs__value *)0)->present),
-	asn_MAP_value_tag2el_216,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_216 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_216,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_216	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_En_gNB_ENDCConfigUpdateAckIEs_213[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCConfigUpdateAckIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_214,  memb_id_constraint_213 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCConfigUpdateAckIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_En_gNB_ENDCConfigUpdateAckIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_215,  memb_criticality_constraint_213 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct En_gNB_ENDCConfigUpdateAckIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_216,
-		select_En_gNB_ENDCConfigUpdateAckIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_216,  memb_value_constraint_213 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_En_gNB_ENDCConfigUpdateAckIEs_tags_213[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_En_gNB_ENDCConfigUpdateAckIEs_tag2el_213[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_En_gNB_ENDCConfigUpdateAckIEs_specs_213 = {
-	sizeof(struct En_gNB_ENDCConfigUpdateAckIEs),
-	offsetof(struct En_gNB_ENDCConfigUpdateAckIEs, _asn_ctx),
-	asn_MAP_En_gNB_ENDCConfigUpdateAckIEs_tag2el_213,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_En_gNB_ENDCConfigUpdateAckIEs = {
-	"En-gNB-ENDCConfigUpdateAckIEs",
-	"En-gNB-ENDCConfigUpdateAckIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_En_gNB_ENDCConfigUpdateAckIEs_tags_213,
-	sizeof(asn_DEF_En_gNB_ENDCConfigUpdateAckIEs_tags_213)
-		/sizeof(asn_DEF_En_gNB_ENDCConfigUpdateAckIEs_tags_213[0]), /* 1 */
-	asn_DEF_En_gNB_ENDCConfigUpdateAckIEs_tags_213,	/* Same as above */
-	sizeof(asn_DEF_En_gNB_ENDCConfigUpdateAckIEs_tags_213)
-		/sizeof(asn_DEF_En_gNB_ENDCConfigUpdateAckIEs_tags_213[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_En_gNB_ENDCConfigUpdateAckIEs_213,
-	3,	/* Elements count */
-	&asn_SPC_En_gNB_ENDCConfigUpdateAckIEs_specs_213	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_220[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdateFailure_IEs__value, choice.Cause),
-		-1 /* Ambiguous tag (CHOICE?) */,
-		0,
-		&asn_DEF_Cause,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"Cause"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdateFailure_IEs__value, choice.CriticalityDiagnostics),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_CriticalityDiagnostics,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"CriticalityDiagnostics"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdateFailure_IEs__value, choice.TimeToWait),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_TimeToWait,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"TimeToWait"
-		},
-};
-static const unsigned asn_MAP_value_to_canonical_220[] = { 2, 1, 0 };
-static const unsigned asn_MAP_value_from_canonical_220[] = { 2, 1, 0 };
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_220[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 2, 0, 0 }, /* TimeToWait */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* CriticalityDiagnostics */
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* radioNetwork */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* transport */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 }, /* protocol */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 } /* misc */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_220 = {
-	sizeof(struct ENDCConfigurationUpdateFailure_IEs__value),
-	offsetof(struct ENDCConfigurationUpdateFailure_IEs__value, _asn_ctx),
-	offsetof(struct ENDCConfigurationUpdateFailure_IEs__value, present),
-	sizeof(((struct ENDCConfigurationUpdateFailure_IEs__value *)0)->present),
-	asn_MAP_value_tag2el_220,
-	6,	/* Count of tags in the map */
-	asn_MAP_value_to_canonical_220,
-	asn_MAP_value_from_canonical_220,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_220 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_220,
-	3,	/* Elements count */
-	&asn_SPC_value_specs_220	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ENDCConfigurationUpdateFailure_IEs_217[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdateFailure_IEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_218,  memb_id_constraint_217 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdateFailure_IEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_ENDCConfigurationUpdateFailure_IEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_219,  memb_criticality_constraint_217 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ENDCConfigurationUpdateFailure_IEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_220,
-		select_ENDCConfigurationUpdateFailure_IEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_220,  memb_value_constraint_217 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ENDCConfigurationUpdateFailure_IEs_tags_217[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ENDCConfigurationUpdateFailure_IEs_tag2el_217[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ENDCConfigurationUpdateFailure_IEs_specs_217 = {
-	sizeof(struct ENDCConfigurationUpdateFailure_IEs),
-	offsetof(struct ENDCConfigurationUpdateFailure_IEs, _asn_ctx),
-	asn_MAP_ENDCConfigurationUpdateFailure_IEs_tag2el_217,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ENDCConfigurationUpdateFailure_IEs = {
-	"ENDCConfigurationUpdateFailure-IEs",
-	"ENDCConfigurationUpdateFailure-IEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ENDCConfigurationUpdateFailure_IEs_tags_217,
-	sizeof(asn_DEF_ENDCConfigurationUpdateFailure_IEs_tags_217)
-		/sizeof(asn_DEF_ENDCConfigurationUpdateFailure_IEs_tags_217[0]), /* 1 */
-	asn_DEF_ENDCConfigurationUpdateFailure_IEs_tags_217,	/* Same as above */
-	sizeof(asn_DEF_ENDCConfigurationUpdateFailure_IEs_tags_217)
-		/sizeof(asn_DEF_ENDCConfigurationUpdateFailure_IEs_tags_217[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ENDCConfigurationUpdateFailure_IEs_217,
-	3,	/* Elements count */
-	&asn_SPC_ENDCConfigurationUpdateFailure_IEs_specs_217	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_value_224[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct GNBStatusIndicationIEs__value, choice.GNBOverloadInformation),
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_GNBOverloadInformation,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"GNBOverloadInformation"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_224[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, 0, 0 } /* GNBOverloadInformation */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_224 = {
-	sizeof(struct GNBStatusIndicationIEs__value),
-	offsetof(struct GNBStatusIndicationIEs__value, _asn_ctx),
-	offsetof(struct GNBStatusIndicationIEs__value, present),
-	sizeof(((struct GNBStatusIndicationIEs__value *)0)->present),
-	asn_MAP_value_tag2el_224,
-	1,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_224 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_224,
-	1,	/* Elements count */
-	&asn_SPC_value_specs_224	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_GNBStatusIndicationIEs_221[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct GNBStatusIndicationIEs, id),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_ID,
-		0,
-		{ 0, &asn_PER_memb_id_constr_222,  memb_id_constraint_221 },
-		0, 0, /* No default value */
-		"id"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct GNBStatusIndicationIEs, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_GNBStatusIndicationIEs_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_223,  memb_criticality_constraint_221 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct GNBStatusIndicationIEs, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_224,
-		select_GNBStatusIndicationIEs_value_type,
-		{ 0, &asn_PER_memb_value_constr_224,  memb_value_constraint_221 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_GNBStatusIndicationIEs_tags_221[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_GNBStatusIndicationIEs_tag2el_221[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_GNBStatusIndicationIEs_specs_221 = {
-	sizeof(struct GNBStatusIndicationIEs),
-	offsetof(struct GNBStatusIndicationIEs, _asn_ctx),
-	asn_MAP_GNBStatusIndicationIEs_tag2el_221,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_GNBStatusIndicationIEs = {
-	"GNBStatusIndicationIEs",
-	"GNBStatusIndicationIEs",
-	&asn_OP_SEQUENCE,
-	asn_DEF_GNBStatusIndicationIEs_tags_221,
-	sizeof(asn_DEF_GNBStatusIndicationIEs_tags_221)
-		/sizeof(asn_DEF_GNBStatusIndicationIEs_tags_221[0]), /* 1 */
-	asn_DEF_GNBStatusIndicationIEs_tags_221,	/* Same as above */
-	sizeof(asn_DEF_GNBStatusIndicationIEs_tags_221)
-		/sizeof(asn_DEF_GNBStatusIndicationIEs_tags_221[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_GNBStatusIndicationIEs_221,
-	3,	/* Elements count */
-	&asn_SPC_GNBStatusIndicationIEs_specs_221	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ProtocolIE-Field.h b/3rdparty/libe2ap/ProtocolIE-Field.h
deleted file mode 100644
index bfeef29..0000000
--- a/3rdparty/libe2ap/ProtocolIE-Field.h
+++ /dev/null
@@ -1,1560 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-Containers"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ProtocolIE_Field_H_
-#define	_ProtocolIE_Field_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-ID.h"
-#include "Criticality.h"
-#include "ANY.h"
-#include "asn_ioc.h"
-#include "RICaction-ToBeSetup-Item.h"
-#include "Presence.h"
-#include "OPEN_TYPE.h"
-#include "constr_CHOICE.h"
-#include "constr_SEQUENCE.h"
-#include "RICaction-Admitted-Item.h"
-#include "RICaction-NotAdmitted-Item.h"
-#include "RANfunction-Item.h"
-#include "RANfunctionID-Item.h"
-#include "RANfunctionIDcause-Item.h"
-#include "CellInformation-Item.h"
-#include "CellToReport-Item.h"
-#include "MeasurementInitiationResult-Item.h"
-#include "MeasurementFailureCause-Item.h"
-#include "CompleteFailureCauseInformation-Item.h"
-#include "CellMeasurementResult-Item.h"
-#include "RICrequestID.h"
-#include "RANfunctionID.h"
-#include "RICsubscription.h"
-#include "RICaction-Admitted-List.h"
-#include "RICaction-NotAdmitted-List.h"
-#include "CriticalityDiagnostics.h"
-#include "RICcause.h"
-#include "RICactionID.h"
-#include "RICindicationSN.h"
-#include "RICindicationType.h"
-#include "RICindicationHeader.h"
-#include "RICindicationMessage.h"
-#include "RICcallProcessID.h"
-#include "RICcontrolHeader.h"
-#include "RICcontrolMessage.h"
-#include "RICcontrolAckRequest.h"
-#include "RICcontrolStatus.h"
-#include "RANfunctions-List.h"
-#include "RANfunctionsID-List.h"
-#include "RANfunctionsIDcause-List.h"
-#include "TimeToWait.h"
-#include "UE-X2AP-ID.h"
-#include "Cause.h"
-#include "UE-X2AP-ID-Extension.h"
-#include "SgNB-UE-X2AP-ID.h"
-#include "GlobalENB-ID.h"
-#include "ServedCells.h"
-#include "GUGroupIDList.h"
-#include "LHN-ID.h"
-#include "CellInformation-List.h"
-#include "ServedCellsToModify.h"
-#include "Old-ECGIs.h"
-#include "CoverageModificationList.h"
-#include "Measurement-ID.h"
-#include "Registration-Request.h"
-#include "ReportCharacteristics.h"
-#include "CellToReport-List.h"
-#include "ReportingPeriodicity.h"
-#include "PartialSuccessIndicator.h"
-#include "ReportingPeriodicityRSRPMR.h"
-#include "ReportingPeriodicityCSIR.h"
-#include "MeasurementInitiationResult-List.h"
-#include "CompleteFailureCauseInformation-List.h"
-#include "CellMeasurementResult-List.h"
-#include "ResponseInformationSeNBReconfComp.h"
-#include "InitiatingNodeType-EndcX2Setup.h"
-#include "ServedEUTRAcellsENDCX2ManagementList.h"
-#include "GlobalGNB-ID.h"
-#include "ServedNRcellsENDCX2ManagementList.h"
-#include "RespondingNodeType-EndcX2Setup.h"
-#include "InitiatingNodeType-EndcConfigUpdate.h"
-#include "CellAssistanceInformation.h"
-#include "ServedEUTRAcellsToModifyListENDCConfUpd.h"
-#include "ServedEUTRAcellsToDeleteListENDCConfUpd.h"
-#include "ServedNRcellsToModifyENDCConfUpdList.h"
-#include "ServedNRcellsToDeleteENDCConfUpdList.h"
-#include "RespondingNodeType-EndcConfigUpdate.h"
-#include "GNBOverloadInformation.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RICaction_ToBeSetup_ItemIEs__value_PR {
-	RICaction_ToBeSetup_ItemIEs__value_PR_NOTHING,	/* No components present */
-	RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item
-} RICaction_ToBeSetup_ItemIEs__value_PR;
-typedef enum RICaction_Admitted_ItemIEs__value_PR {
-	RICaction_Admitted_ItemIEs__value_PR_NOTHING,	/* No components present */
-	RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item
-} RICaction_Admitted_ItemIEs__value_PR;
-typedef enum RICaction_NotAdmitted_ItemIEs__value_PR {
-	RICaction_NotAdmitted_ItemIEs__value_PR_NOTHING,	/* No components present */
-	RICaction_NotAdmitted_ItemIEs__value_PR_RICaction_NotAdmitted_Item
-} RICaction_NotAdmitted_ItemIEs__value_PR;
-typedef enum RANfunction_ItemIEs__value_PR {
-	RANfunction_ItemIEs__value_PR_NOTHING,	/* No components present */
-	RANfunction_ItemIEs__value_PR_RANfunction_Item
-} RANfunction_ItemIEs__value_PR;
-typedef enum RANfunctionID_ItemIEs__value_PR {
-	RANfunctionID_ItemIEs__value_PR_NOTHING,	/* No components present */
-	RANfunctionID_ItemIEs__value_PR_RANfunctionID_Item
-} RANfunctionID_ItemIEs__value_PR;
-typedef enum RANfunctionIDcause_ItemIEs__value_PR {
-	RANfunctionIDcause_ItemIEs__value_PR_NOTHING,	/* No components present */
-	RANfunctionIDcause_ItemIEs__value_PR_RANfunctionIDcause_Item
-} RANfunctionIDcause_ItemIEs__value_PR;
-typedef enum CellInformation_ItemIEs__value_PR {
-	CellInformation_ItemIEs__value_PR_NOTHING,	/* No components present */
-	CellInformation_ItemIEs__value_PR_CellInformation_Item
-} CellInformation_ItemIEs__value_PR;
-typedef enum CellToReport_ItemIEs__value_PR {
-	CellToReport_ItemIEs__value_PR_NOTHING,	/* No components present */
-	CellToReport_ItemIEs__value_PR_CellToReport_Item
-} CellToReport_ItemIEs__value_PR;
-typedef enum MeasurementInitiationResult_ItemIEs__value_PR {
-	MeasurementInitiationResult_ItemIEs__value_PR_NOTHING,	/* No components present */
-	MeasurementInitiationResult_ItemIEs__value_PR_MeasurementInitiationResult_Item
-} MeasurementInitiationResult_ItemIEs__value_PR;
-typedef enum MeasurementFailureCause_ItemIEs__value_PR {
-	MeasurementFailureCause_ItemIEs__value_PR_NOTHING,	/* No components present */
-	MeasurementFailureCause_ItemIEs__value_PR_MeasurementFailureCause_Item
-} MeasurementFailureCause_ItemIEs__value_PR;
-typedef enum CompleteFailureCauseInformation_ItemIEs__value_PR {
-	CompleteFailureCauseInformation_ItemIEs__value_PR_NOTHING,	/* No components present */
-	CompleteFailureCauseInformation_ItemIEs__value_PR_CompleteFailureCauseInformation_Item
-} CompleteFailureCauseInformation_ItemIEs__value_PR;
-typedef enum CellMeasurementResult_ItemIEs__value_PR {
-	CellMeasurementResult_ItemIEs__value_PR_NOTHING,	/* No components present */
-	CellMeasurementResult_ItemIEs__value_PR_CellMeasurementResult_Item
-} CellMeasurementResult_ItemIEs__value_PR;
-typedef enum RICsubscriptionRequest_IEs__value_PR {
-	RICsubscriptionRequest_IEs__value_PR_NOTHING,	/* No components present */
-	RICsubscriptionRequest_IEs__value_PR_RICrequestID,
-	RICsubscriptionRequest_IEs__value_PR_RANfunctionID,
-	RICsubscriptionRequest_IEs__value_PR_RICsubscription
-} RICsubscriptionRequest_IEs__value_PR;
-typedef enum RICsubscriptionResponse_IEs__value_PR {
-	RICsubscriptionResponse_IEs__value_PR_NOTHING,	/* No components present */
-	RICsubscriptionResponse_IEs__value_PR_RICrequestID,
-	RICsubscriptionResponse_IEs__value_PR_RANfunctionID,
-	RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List,
-	RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List
-} RICsubscriptionResponse_IEs__value_PR;
-typedef enum RICsubscriptionFailure_IEs__value_PR {
-	RICsubscriptionFailure_IEs__value_PR_NOTHING,	/* No components present */
-	RICsubscriptionFailure_IEs__value_PR_RICrequestID,
-	RICsubscriptionFailure_IEs__value_PR_RANfunctionID,
-	RICsubscriptionFailure_IEs__value_PR_RICaction_NotAdmitted_List,
-	RICsubscriptionFailure_IEs__value_PR_CriticalityDiagnostics
-} RICsubscriptionFailure_IEs__value_PR;
-typedef enum RICsubscriptionDeleteRequest_IEs__value_PR {
-	RICsubscriptionDeleteRequest_IEs__value_PR_NOTHING,	/* No components present */
-	RICsubscriptionDeleteRequest_IEs__value_PR_RICrequestID,
-	RICsubscriptionDeleteRequest_IEs__value_PR_RANfunctionID
-} RICsubscriptionDeleteRequest_IEs__value_PR;
-typedef enum RICsubscriptionDeleteResponse_IEs__value_PR {
-	RICsubscriptionDeleteResponse_IEs__value_PR_NOTHING,	/* No components present */
-	RICsubscriptionDeleteResponse_IEs__value_PR_RICrequestID,
-	RICsubscriptionDeleteResponse_IEs__value_PR_RANfunctionID
-} RICsubscriptionDeleteResponse_IEs__value_PR;
-typedef enum RICsubscriptionDeleteFailure_IEs__value_PR {
-	RICsubscriptionDeleteFailure_IEs__value_PR_NOTHING,	/* No components present */
-	RICsubscriptionDeleteFailure_IEs__value_PR_RICrequestID,
-	RICsubscriptionDeleteFailure_IEs__value_PR_RANfunctionID,
-	RICsubscriptionDeleteFailure_IEs__value_PR_RICcause,
-	RICsubscriptionDeleteFailure_IEs__value_PR_CriticalityDiagnostics
-} RICsubscriptionDeleteFailure_IEs__value_PR;
-typedef enum RICindication_IEs__value_PR {
-	RICindication_IEs__value_PR_NOTHING,	/* No components present */
-	RICindication_IEs__value_PR_RICrequestID,
-	RICindication_IEs__value_PR_RANfunctionID,
-	RICindication_IEs__value_PR_RICactionID,
-	RICindication_IEs__value_PR_RICindicationSN,
-	RICindication_IEs__value_PR_RICindicationType,
-	RICindication_IEs__value_PR_RICindicationHeader,
-	RICindication_IEs__value_PR_RICindicationMessage,
-	RICindication_IEs__value_PR_RICcallProcessID
-} RICindication_IEs__value_PR;
-typedef enum RICcontrolRequest_IEs__value_PR {
-	RICcontrolRequest_IEs__value_PR_NOTHING,	/* No components present */
-	RICcontrolRequest_IEs__value_PR_RICrequestID,
-	RICcontrolRequest_IEs__value_PR_RANfunctionID,
-	RICcontrolRequest_IEs__value_PR_RICcallProcessID,
-	RICcontrolRequest_IEs__value_PR_RICcontrolHeader,
-	RICcontrolRequest_IEs__value_PR_RICcontrolMessage,
-	RICcontrolRequest_IEs__value_PR_RICcontrolAckRequest
-} RICcontrolRequest_IEs__value_PR;
-typedef enum RICcontrolAcknowledge_IEs__value_PR {
-	RICcontrolAcknowledge_IEs__value_PR_NOTHING,	/* No components present */
-	RICcontrolAcknowledge_IEs__value_PR_RICrequestID,
-	RICcontrolAcknowledge_IEs__value_PR_RANfunctionID,
-	RICcontrolAcknowledge_IEs__value_PR_RICcallProcessID,
-	RICcontrolAcknowledge_IEs__value_PR_RICcontrolStatus
-} RICcontrolAcknowledge_IEs__value_PR;
-typedef enum RICcontrolFailure_IEs__value_PR {
-	RICcontrolFailure_IEs__value_PR_NOTHING,	/* No components present */
-	RICcontrolFailure_IEs__value_PR_RICrequestID,
-	RICcontrolFailure_IEs__value_PR_RANfunctionID,
-	RICcontrolFailure_IEs__value_PR_RICcallProcessID,
-	RICcontrolFailure_IEs__value_PR_RICcause
-} RICcontrolFailure_IEs__value_PR;
-typedef enum RICserviceUpdate_IEs__value_PR {
-	RICserviceUpdate_IEs__value_PR_NOTHING,	/* No components present */
-	RICserviceUpdate_IEs__value_PR_RANfunctions_List,
-	RICserviceUpdate_IEs__value_PR_RANfunctionsID_List
-} RICserviceUpdate_IEs__value_PR;
-typedef enum RICserviceUpdateAcknowledge_IEs__value_PR {
-	RICserviceUpdateAcknowledge_IEs__value_PR_NOTHING,	/* No components present */
-	RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsID_List,
-	RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsIDcause_List
-} RICserviceUpdateAcknowledge_IEs__value_PR;
-typedef enum RICserviceUpdateFailure_IEs__value_PR {
-	RICserviceUpdateFailure_IEs__value_PR_NOTHING,	/* No components present */
-	RICserviceUpdateFailure_IEs__value_PR_RANfunctionsIDcause_List,
-	RICserviceUpdateFailure_IEs__value_PR_TimeToWait,
-	RICserviceUpdateFailure_IEs__value_PR_CriticalityDiagnostics
-} RICserviceUpdateFailure_IEs__value_PR;
-typedef enum RICserviceQuery_IEs__value_PR {
-	RICserviceQuery_IEs__value_PR_NOTHING,	/* No components present */
-	RICserviceQuery_IEs__value_PR_RANfunctionsID_List
-} RICserviceQuery_IEs__value_PR;
-typedef enum ErrorIndication_IEs__value_PR {
-	ErrorIndication_IEs__value_PR_NOTHING,	/* No components present */
-	ErrorIndication_IEs__value_PR_UE_X2AP_ID,
-	ErrorIndication_IEs__value_PR_Cause,
-	ErrorIndication_IEs__value_PR_CriticalityDiagnostics,
-	ErrorIndication_IEs__value_PR_UE_X2AP_ID_Extension,
-	ErrorIndication_IEs__value_PR_SgNB_UE_X2AP_ID
-} ErrorIndication_IEs__value_PR;
-typedef enum ResetRequest_IEs__value_PR {
-	ResetRequest_IEs__value_PR_NOTHING,	/* No components present */
-	ResetRequest_IEs__value_PR_Cause
-} ResetRequest_IEs__value_PR;
-typedef enum ResetResponse_IEs__value_PR {
-	ResetResponse_IEs__value_PR_NOTHING,	/* No components present */
-	ResetResponse_IEs__value_PR_CriticalityDiagnostics
-} ResetResponse_IEs__value_PR;
-typedef enum X2SetupRequest_IEs__value_PR {
-	X2SetupRequest_IEs__value_PR_NOTHING,	/* No components present */
-	X2SetupRequest_IEs__value_PR_GlobalENB_ID,
-	X2SetupRequest_IEs__value_PR_ServedCells,
-	X2SetupRequest_IEs__value_PR_GUGroupIDList,
-	X2SetupRequest_IEs__value_PR_LHN_ID
-} X2SetupRequest_IEs__value_PR;
-typedef enum X2SetupResponse_IEs__value_PR {
-	X2SetupResponse_IEs__value_PR_NOTHING,	/* No components present */
-	X2SetupResponse_IEs__value_PR_GlobalENB_ID,
-	X2SetupResponse_IEs__value_PR_ServedCells,
-	X2SetupResponse_IEs__value_PR_GUGroupIDList,
-	X2SetupResponse_IEs__value_PR_CriticalityDiagnostics,
-	X2SetupResponse_IEs__value_PR_LHN_ID
-} X2SetupResponse_IEs__value_PR;
-typedef enum X2SetupFailure_IEs__value_PR {
-	X2SetupFailure_IEs__value_PR_NOTHING,	/* No components present */
-	X2SetupFailure_IEs__value_PR_Cause,
-	X2SetupFailure_IEs__value_PR_TimeToWait,
-	X2SetupFailure_IEs__value_PR_CriticalityDiagnostics
-} X2SetupFailure_IEs__value_PR;
-typedef enum LoadInformation_IEs__value_PR {
-	LoadInformation_IEs__value_PR_NOTHING,	/* No components present */
-	LoadInformation_IEs__value_PR_CellInformation_List
-} LoadInformation_IEs__value_PR;
-typedef enum ENBConfigurationUpdate_IEs__value_PR {
-	ENBConfigurationUpdate_IEs__value_PR_NOTHING,	/* No components present */
-	ENBConfigurationUpdate_IEs__value_PR_ServedCells,
-	ENBConfigurationUpdate_IEs__value_PR_ServedCellsToModify,
-	ENBConfigurationUpdate_IEs__value_PR_Old_ECGIs,
-	ENBConfigurationUpdate_IEs__value_PR_GUGroupIDList,
-	ENBConfigurationUpdate_IEs__value_PR_CoverageModificationList
-} ENBConfigurationUpdate_IEs__value_PR;
-typedef enum ENBConfigurationUpdateAcknowledge_IEs__value_PR {
-	ENBConfigurationUpdateAcknowledge_IEs__value_PR_NOTHING,	/* No components present */
-	ENBConfigurationUpdateAcknowledge_IEs__value_PR_CriticalityDiagnostics
-} ENBConfigurationUpdateAcknowledge_IEs__value_PR;
-typedef enum ENBConfigurationUpdateFailure_IEs__value_PR {
-	ENBConfigurationUpdateFailure_IEs__value_PR_NOTHING,	/* No components present */
-	ENBConfigurationUpdateFailure_IEs__value_PR_Cause,
-	ENBConfigurationUpdateFailure_IEs__value_PR_TimeToWait,
-	ENBConfigurationUpdateFailure_IEs__value_PR_CriticalityDiagnostics
-} ENBConfigurationUpdateFailure_IEs__value_PR;
-typedef enum ResourceStatusRequest_IEs__value_PR {
-	ResourceStatusRequest_IEs__value_PR_NOTHING,	/* No components present */
-	ResourceStatusRequest_IEs__value_PR_Measurement_ID,
-	ResourceStatusRequest_IEs__value_PR_Registration_Request,
-	ResourceStatusRequest_IEs__value_PR_ReportCharacteristics,
-	ResourceStatusRequest_IEs__value_PR_CellToReport_List,
-	ResourceStatusRequest_IEs__value_PR_ReportingPeriodicity,
-	ResourceStatusRequest_IEs__value_PR_PartialSuccessIndicator,
-	ResourceStatusRequest_IEs__value_PR_ReportingPeriodicityRSRPMR,
-	ResourceStatusRequest_IEs__value_PR_ReportingPeriodicityCSIR
-} ResourceStatusRequest_IEs__value_PR;
-typedef enum ResourceStatusResponse_IEs__value_PR {
-	ResourceStatusResponse_IEs__value_PR_NOTHING,	/* No components present */
-	ResourceStatusResponse_IEs__value_PR_Measurement_ID,
-	ResourceStatusResponse_IEs__value_PR_CriticalityDiagnostics,
-	ResourceStatusResponse_IEs__value_PR_MeasurementInitiationResult_List
-} ResourceStatusResponse_IEs__value_PR;
-typedef enum ResourceStatusFailure_IEs__value_PR {
-	ResourceStatusFailure_IEs__value_PR_NOTHING,	/* No components present */
-	ResourceStatusFailure_IEs__value_PR_Measurement_ID,
-	ResourceStatusFailure_IEs__value_PR_Cause,
-	ResourceStatusFailure_IEs__value_PR_CriticalityDiagnostics,
-	ResourceStatusFailure_IEs__value_PR_CompleteFailureCauseInformation_List
-} ResourceStatusFailure_IEs__value_PR;
-typedef enum ResourceStatusUpdate_IEs__value_PR {
-	ResourceStatusUpdate_IEs__value_PR_NOTHING,	/* No components present */
-	ResourceStatusUpdate_IEs__value_PR_Measurement_ID,
-	ResourceStatusUpdate_IEs__value_PR_CellMeasurementResult_List
-} ResourceStatusUpdate_IEs__value_PR;
-typedef enum SeNBReconfigurationComplete_IEs__value_PR {
-	SeNBReconfigurationComplete_IEs__value_PR_NOTHING,	/* No components present */
-	SeNBReconfigurationComplete_IEs__value_PR_UE_X2AP_ID,
-	SeNBReconfigurationComplete_IEs__value_PR_ResponseInformationSeNBReconfComp,
-	SeNBReconfigurationComplete_IEs__value_PR_UE_X2AP_ID_Extension
-} SeNBReconfigurationComplete_IEs__value_PR;
-typedef enum ENDCX2SetupRequest_IEs__value_PR {
-	ENDCX2SetupRequest_IEs__value_PR_NOTHING,	/* No components present */
-	ENDCX2SetupRequest_IEs__value_PR_InitiatingNodeType_EndcX2Setup
-} ENDCX2SetupRequest_IEs__value_PR;
-typedef enum ENB_ENDCX2SetupReqIEs__value_PR {
-	ENB_ENDCX2SetupReqIEs__value_PR_NOTHING,	/* No components present */
-	ENB_ENDCX2SetupReqIEs__value_PR_GlobalENB_ID,
-	ENB_ENDCX2SetupReqIEs__value_PR_ServedEUTRAcellsENDCX2ManagementList
-} ENB_ENDCX2SetupReqIEs__value_PR;
-typedef enum En_gNB_ENDCX2SetupReqIEs__value_PR {
-	En_gNB_ENDCX2SetupReqIEs__value_PR_NOTHING,	/* No components present */
-	En_gNB_ENDCX2SetupReqIEs__value_PR_GlobalGNB_ID,
-	En_gNB_ENDCX2SetupReqIEs__value_PR_ServedNRcellsENDCX2ManagementList
-} En_gNB_ENDCX2SetupReqIEs__value_PR;
-typedef enum ENDCX2SetupResponse_IEs__value_PR {
-	ENDCX2SetupResponse_IEs__value_PR_NOTHING,	/* No components present */
-	ENDCX2SetupResponse_IEs__value_PR_RespondingNodeType_EndcX2Setup
-} ENDCX2SetupResponse_IEs__value_PR;
-typedef enum ENB_ENDCX2SetupReqAckIEs__value_PR {
-	ENB_ENDCX2SetupReqAckIEs__value_PR_NOTHING,	/* No components present */
-	ENB_ENDCX2SetupReqAckIEs__value_PR_GlobalENB_ID,
-	ENB_ENDCX2SetupReqAckIEs__value_PR_ServedEUTRAcellsENDCX2ManagementList
-} ENB_ENDCX2SetupReqAckIEs__value_PR;
-typedef enum En_gNB_ENDCX2SetupReqAckIEs__value_PR {
-	En_gNB_ENDCX2SetupReqAckIEs__value_PR_NOTHING,	/* No components present */
-	En_gNB_ENDCX2SetupReqAckIEs__value_PR_GlobalGNB_ID,
-	En_gNB_ENDCX2SetupReqAckIEs__value_PR_ServedNRcellsENDCX2ManagementList
-} En_gNB_ENDCX2SetupReqAckIEs__value_PR;
-typedef enum ENDCX2SetupFailure_IEs__value_PR {
-	ENDCX2SetupFailure_IEs__value_PR_NOTHING,	/* No components present */
-	ENDCX2SetupFailure_IEs__value_PR_Cause,
-	ENDCX2SetupFailure_IEs__value_PR_CriticalityDiagnostics,
-	ENDCX2SetupFailure_IEs__value_PR_TimeToWait
-} ENDCX2SetupFailure_IEs__value_PR;
-typedef enum ENDCConfigurationUpdate_IEs__value_PR {
-	ENDCConfigurationUpdate_IEs__value_PR_NOTHING,	/* No components present */
-	ENDCConfigurationUpdate_IEs__value_PR_InitiatingNodeType_EndcConfigUpdate
-} ENDCConfigurationUpdate_IEs__value_PR;
-typedef enum ENB_ENDCConfigUpdateIEs__value_PR {
-	ENB_ENDCConfigUpdateIEs__value_PR_NOTHING,	/* No components present */
-	ENB_ENDCConfigUpdateIEs__value_PR_CellAssistanceInformation,
-	ENB_ENDCConfigUpdateIEs__value_PR_ServedEUTRAcellsENDCX2ManagementList,
-	ENB_ENDCConfigUpdateIEs__value_PR_ServedEUTRAcellsToModifyListENDCConfUpd,
-	ENB_ENDCConfigUpdateIEs__value_PR_ServedEUTRAcellsToDeleteListENDCConfUpd
-} ENB_ENDCConfigUpdateIEs__value_PR;
-typedef enum En_gNB_ENDCConfigUpdateIEs__value_PR {
-	En_gNB_ENDCConfigUpdateIEs__value_PR_NOTHING,	/* No components present */
-	En_gNB_ENDCConfigUpdateIEs__value_PR_ServedNRcellsENDCX2ManagementList,
-	En_gNB_ENDCConfigUpdateIEs__value_PR_ServedNRcellsToModifyENDCConfUpdList,
-	En_gNB_ENDCConfigUpdateIEs__value_PR_ServedNRcellsToDeleteENDCConfUpdList
-} En_gNB_ENDCConfigUpdateIEs__value_PR;
-typedef enum ENDCConfigurationUpdateAcknowledge_IEs__value_PR {
-	ENDCConfigurationUpdateAcknowledge_IEs__value_PR_NOTHING,	/* No components present */
-	ENDCConfigurationUpdateAcknowledge_IEs__value_PR_RespondingNodeType_EndcConfigUpdate
-} ENDCConfigurationUpdateAcknowledge_IEs__value_PR;
-typedef enum ENB_ENDCConfigUpdateAckIEs__value_PR {
-	ENB_ENDCConfigUpdateAckIEs__value_PR_NOTHING	/* No components present */
-	
-} ENB_ENDCConfigUpdateAckIEs__value_PR;
-typedef enum En_gNB_ENDCConfigUpdateAckIEs__value_PR {
-	En_gNB_ENDCConfigUpdateAckIEs__value_PR_NOTHING,	/* No components present */
-	En_gNB_ENDCConfigUpdateAckIEs__value_PR_ServedNRcellsENDCX2ManagementList
-} En_gNB_ENDCConfigUpdateAckIEs__value_PR;
-typedef enum ENDCConfigurationUpdateFailure_IEs__value_PR {
-	ENDCConfigurationUpdateFailure_IEs__value_PR_NOTHING,	/* No components present */
-	ENDCConfigurationUpdateFailure_IEs__value_PR_Cause,
-	ENDCConfigurationUpdateFailure_IEs__value_PR_CriticalityDiagnostics,
-	ENDCConfigurationUpdateFailure_IEs__value_PR_TimeToWait
-} ENDCConfigurationUpdateFailure_IEs__value_PR;
-typedef enum GNBStatusIndicationIEs__value_PR {
-	GNBStatusIndicationIEs__value_PR_NOTHING,	/* No components present */
-	GNBStatusIndicationIEs__value_PR_GNBOverloadInformation
-} GNBStatusIndicationIEs__value_PR;
-
-/* ProtocolIE-Field */
-typedef struct RICaction_ToBeSetup_ItemIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICaction_ToBeSetup_ItemIEs__value {
-		RICaction_ToBeSetup_ItemIEs__value_PR present;
-		union RICaction_ToBeSetup_ItemIEs__value_u {
-			RICaction_ToBeSetup_Item_t	 RICaction_ToBeSetup_Item;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICaction_ToBeSetup_ItemIEs_t;
-typedef struct RICaction_Admitted_ItemIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICaction_Admitted_ItemIEs__value {
-		RICaction_Admitted_ItemIEs__value_PR present;
-		union RICaction_Admitted_ItemIEs__value_u {
-			RICaction_Admitted_Item_t	 RICaction_Admitted_Item;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICaction_Admitted_ItemIEs_t;
-typedef struct RICaction_NotAdmitted_ItemIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICaction_NotAdmitted_ItemIEs__value {
-		RICaction_NotAdmitted_ItemIEs__value_PR present;
-		union RICaction_NotAdmitted_ItemIEs__value_u {
-			RICaction_NotAdmitted_Item_t	 RICaction_NotAdmitted_Item;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICaction_NotAdmitted_ItemIEs_t;
-typedef struct RANfunction_ItemIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RANfunction_ItemIEs__value {
-		RANfunction_ItemIEs__value_PR present;
-		union RANfunction_ItemIEs__value_u {
-			RANfunction_Item_t	 RANfunction_Item;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RANfunction_ItemIEs_t;
-typedef struct RANfunctionID_ItemIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RANfunctionID_ItemIEs__value {
-		RANfunctionID_ItemIEs__value_PR present;
-		union RANfunctionID_ItemIEs__value_u {
-			RANfunctionID_Item_t	 RANfunctionID_Item;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RANfunctionID_ItemIEs_t;
-typedef struct RANfunctionIDcause_ItemIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RANfunctionIDcause_ItemIEs__value {
-		RANfunctionIDcause_ItemIEs__value_PR present;
-		union RANfunctionIDcause_ItemIEs__value_u {
-			RANfunctionIDcause_Item_t	 RANfunctionIDcause_Item;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RANfunctionIDcause_ItemIEs_t;
-typedef struct CellInformation_ItemIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CellInformation_ItemIEs__value {
-		CellInformation_ItemIEs__value_PR present;
-		union CellInformation_ItemIEs__value_u {
-			CellInformation_Item_t	 CellInformation_Item;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellInformation_ItemIEs_t;
-typedef struct CellToReport_ItemIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CellToReport_ItemIEs__value {
-		CellToReport_ItemIEs__value_PR present;
-		union CellToReport_ItemIEs__value_u {
-			CellToReport_Item_t	 CellToReport_Item;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellToReport_ItemIEs_t;
-typedef struct MeasurementInitiationResult_ItemIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct MeasurementInitiationResult_ItemIEs__value {
-		MeasurementInitiationResult_ItemIEs__value_PR present;
-		union MeasurementInitiationResult_ItemIEs__value_u {
-			MeasurementInitiationResult_Item_t	 MeasurementInitiationResult_Item;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} MeasurementInitiationResult_ItemIEs_t;
-typedef struct MeasurementFailureCause_ItemIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct MeasurementFailureCause_ItemIEs__value {
-		MeasurementFailureCause_ItemIEs__value_PR present;
-		union MeasurementFailureCause_ItemIEs__value_u {
-			MeasurementFailureCause_Item_t	 MeasurementFailureCause_Item;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} MeasurementFailureCause_ItemIEs_t;
-typedef struct CompleteFailureCauseInformation_ItemIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CompleteFailureCauseInformation_ItemIEs__value {
-		CompleteFailureCauseInformation_ItemIEs__value_PR present;
-		union CompleteFailureCauseInformation_ItemIEs__value_u {
-			CompleteFailureCauseInformation_Item_t	 CompleteFailureCauseInformation_Item;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CompleteFailureCauseInformation_ItemIEs_t;
-typedef struct CellMeasurementResult_ItemIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct CellMeasurementResult_ItemIEs__value {
-		CellMeasurementResult_ItemIEs__value_PR present;
-		union CellMeasurementResult_ItemIEs__value_u {
-			CellMeasurementResult_Item_t	 CellMeasurementResult_Item;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} CellMeasurementResult_ItemIEs_t;
-typedef struct RICsubscriptionRequest_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICsubscriptionRequest_IEs__value {
-		RICsubscriptionRequest_IEs__value_PR present;
-		union RICsubscriptionRequest_IEs__value_u {
-			RICrequestID_t	 RICrequestID;
-			RANfunctionID_t	 RANfunctionID;
-			RICsubscription_t	 RICsubscription;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICsubscriptionRequest_IEs_t;
-typedef struct RICsubscriptionResponse_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICsubscriptionResponse_IEs__value {
-		RICsubscriptionResponse_IEs__value_PR present;
-		union RICsubscriptionResponse_IEs__value_u {
-			RICrequestID_t	 RICrequestID;
-			RANfunctionID_t	 RANfunctionID;
-			RICaction_Admitted_List_t	 RICaction_Admitted_List;
-			RICaction_NotAdmitted_List_t	 RICaction_NotAdmitted_List;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICsubscriptionResponse_IEs_t;
-typedef struct RICsubscriptionFailure_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICsubscriptionFailure_IEs__value {
-		RICsubscriptionFailure_IEs__value_PR present;
-		union RICsubscriptionFailure_IEs__value_u {
-			RICrequestID_t	 RICrequestID;
-			RANfunctionID_t	 RANfunctionID;
-			RICaction_NotAdmitted_List_t	 RICaction_NotAdmitted_List;
-			CriticalityDiagnostics_t	 CriticalityDiagnostics;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICsubscriptionFailure_IEs_t;
-typedef struct RICsubscriptionDeleteRequest_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICsubscriptionDeleteRequest_IEs__value {
-		RICsubscriptionDeleteRequest_IEs__value_PR present;
-		union RICsubscriptionDeleteRequest_IEs__value_u {
-			RICrequestID_t	 RICrequestID;
-			RANfunctionID_t	 RANfunctionID;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICsubscriptionDeleteRequest_IEs_t;
-typedef struct RICsubscriptionDeleteResponse_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICsubscriptionDeleteResponse_IEs__value {
-		RICsubscriptionDeleteResponse_IEs__value_PR present;
-		union RICsubscriptionDeleteResponse_IEs__value_u {
-			RICrequestID_t	 RICrequestID;
-			RANfunctionID_t	 RANfunctionID;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICsubscriptionDeleteResponse_IEs_t;
-typedef struct RICsubscriptionDeleteFailure_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICsubscriptionDeleteFailure_IEs__value {
-		RICsubscriptionDeleteFailure_IEs__value_PR present;
-		union RICsubscriptionDeleteFailure_IEs__value_u {
-			RICrequestID_t	 RICrequestID;
-			RANfunctionID_t	 RANfunctionID;
-			RICcause_t	 RICcause;
-			CriticalityDiagnostics_t	 CriticalityDiagnostics;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICsubscriptionDeleteFailure_IEs_t;
-typedef struct RICindication_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICindication_IEs__value {
-		RICindication_IEs__value_PR present;
-		union RICindication_IEs__value_u {
-			RICrequestID_t	 RICrequestID;
-			RANfunctionID_t	 RANfunctionID;
-			RICactionID_t	 RICactionID;
-			RICindicationSN_t	 RICindicationSN;
-			RICindicationType_t	 RICindicationType;
-			RICindicationHeader_t	 RICindicationHeader;
-			RICindicationMessage_t	 RICindicationMessage;
-			RICcallProcessID_t	 RICcallProcessID;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICindication_IEs_t;
-typedef struct RICcontrolRequest_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICcontrolRequest_IEs__value {
-		RICcontrolRequest_IEs__value_PR present;
-		union RICcontrolRequest_IEs__value_u {
-			RICrequestID_t	 RICrequestID;
-			RANfunctionID_t	 RANfunctionID;
-			RICcallProcessID_t	 RICcallProcessID;
-			RICcontrolHeader_t	 RICcontrolHeader;
-			RICcontrolMessage_t	 RICcontrolMessage;
-			RICcontrolAckRequest_t	 RICcontrolAckRequest;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICcontrolRequest_IEs_t;
-typedef struct RICcontrolAcknowledge_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICcontrolAcknowledge_IEs__value {
-		RICcontrolAcknowledge_IEs__value_PR present;
-		union RICcontrolAcknowledge_IEs__value_u {
-			RICrequestID_t	 RICrequestID;
-			RANfunctionID_t	 RANfunctionID;
-			RICcallProcessID_t	 RICcallProcessID;
-			RICcontrolStatus_t	 RICcontrolStatus;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICcontrolAcknowledge_IEs_t;
-typedef struct RICcontrolFailure_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICcontrolFailure_IEs__value {
-		RICcontrolFailure_IEs__value_PR present;
-		union RICcontrolFailure_IEs__value_u {
-			RICrequestID_t	 RICrequestID;
-			RANfunctionID_t	 RANfunctionID;
-			RICcallProcessID_t	 RICcallProcessID;
-			RICcause_t	 RICcause;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICcontrolFailure_IEs_t;
-typedef struct RICserviceUpdate_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICserviceUpdate_IEs__value {
-		RICserviceUpdate_IEs__value_PR present;
-		union RICserviceUpdate_IEs__value_u {
-			RANfunctions_List_t	 RANfunctions_List;
-			RANfunctionsID_List_t	 RANfunctionsID_List;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICserviceUpdate_IEs_t;
-typedef struct RICserviceUpdateAcknowledge_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICserviceUpdateAcknowledge_IEs__value {
-		RICserviceUpdateAcknowledge_IEs__value_PR present;
-		union RICserviceUpdateAcknowledge_IEs__value_u {
-			RANfunctionsID_List_t	 RANfunctionsID_List;
-			RANfunctionsIDcause_List_t	 RANfunctionsIDcause_List;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICserviceUpdateAcknowledge_IEs_t;
-typedef struct RICserviceUpdateFailure_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICserviceUpdateFailure_IEs__value {
-		RICserviceUpdateFailure_IEs__value_PR present;
-		union RICserviceUpdateFailure_IEs__value_u {
-			RANfunctionsIDcause_List_t	 RANfunctionsIDcause_List;
-			TimeToWait_t	 TimeToWait;
-			CriticalityDiagnostics_t	 CriticalityDiagnostics;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICserviceUpdateFailure_IEs_t;
-typedef struct RICserviceQuery_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct RICserviceQuery_IEs__value {
-		RICserviceQuery_IEs__value_PR present;
-		union RICserviceQuery_IEs__value_u {
-			RANfunctionsID_List_t	 RANfunctionsID_List;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICserviceQuery_IEs_t;
-typedef struct ErrorIndication_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ErrorIndication_IEs__value {
-		ErrorIndication_IEs__value_PR present;
-		union ErrorIndication_IEs__value_u {
-			UE_X2AP_ID_t	 UE_X2AP_ID;
-			Cause_t	 Cause;
-			CriticalityDiagnostics_t	 CriticalityDiagnostics;
-			UE_X2AP_ID_Extension_t	 UE_X2AP_ID_Extension;
-			SgNB_UE_X2AP_ID_t	 SgNB_UE_X2AP_ID;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ErrorIndication_IEs_t;
-typedef struct ResetRequest_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ResetRequest_IEs__value {
-		ResetRequest_IEs__value_PR present;
-		union ResetRequest_IEs__value_u {
-			Cause_t	 Cause;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResetRequest_IEs_t;
-typedef struct ResetResponse_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ResetResponse_IEs__value {
-		ResetResponse_IEs__value_PR present;
-		union ResetResponse_IEs__value_u {
-			CriticalityDiagnostics_t	 CriticalityDiagnostics;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResetResponse_IEs_t;
-typedef struct X2SetupRequest_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct X2SetupRequest_IEs__value {
-		X2SetupRequest_IEs__value_PR present;
-		union X2SetupRequest_IEs__value_u {
-			GlobalENB_ID_t	 GlobalENB_ID;
-			ServedCells_t	 ServedCells;
-			GUGroupIDList_t	 GUGroupIDList;
-			LHN_ID_t	 LHN_ID;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} X2SetupRequest_IEs_t;
-typedef struct X2SetupResponse_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct X2SetupResponse_IEs__value {
-		X2SetupResponse_IEs__value_PR present;
-		union X2SetupResponse_IEs__value_u {
-			GlobalENB_ID_t	 GlobalENB_ID;
-			ServedCells_t	 ServedCells;
-			GUGroupIDList_t	 GUGroupIDList;
-			CriticalityDiagnostics_t	 CriticalityDiagnostics;
-			LHN_ID_t	 LHN_ID;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} X2SetupResponse_IEs_t;
-typedef struct X2SetupFailure_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct X2SetupFailure_IEs__value {
-		X2SetupFailure_IEs__value_PR present;
-		union X2SetupFailure_IEs__value_u {
-			Cause_t	 Cause;
-			TimeToWait_t	 TimeToWait;
-			CriticalityDiagnostics_t	 CriticalityDiagnostics;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} X2SetupFailure_IEs_t;
-typedef struct LoadInformation_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct LoadInformation_IEs__value {
-		LoadInformation_IEs__value_PR present;
-		union LoadInformation_IEs__value_u {
-			CellInformation_List_t	 CellInformation_List;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} LoadInformation_IEs_t;
-typedef struct ENBConfigurationUpdate_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ENBConfigurationUpdate_IEs__value {
-		ENBConfigurationUpdate_IEs__value_PR present;
-		union ENBConfigurationUpdate_IEs__value_u {
-			ServedCells_t	 ServedCells;
-			ServedCellsToModify_t	 ServedCellsToModify;
-			Old_ECGIs_t	 Old_ECGIs;
-			GUGroupIDList_t	 GUGroupIDList;
-			CoverageModificationList_t	 CoverageModificationList;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENBConfigurationUpdate_IEs_t;
-typedef struct ENBConfigurationUpdateAcknowledge_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ENBConfigurationUpdateAcknowledge_IEs__value {
-		ENBConfigurationUpdateAcknowledge_IEs__value_PR present;
-		union ENBConfigurationUpdateAcknowledge_IEs__value_u {
-			CriticalityDiagnostics_t	 CriticalityDiagnostics;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENBConfigurationUpdateAcknowledge_IEs_t;
-typedef struct ENBConfigurationUpdateFailure_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ENBConfigurationUpdateFailure_IEs__value {
-		ENBConfigurationUpdateFailure_IEs__value_PR present;
-		union ENBConfigurationUpdateFailure_IEs__value_u {
-			Cause_t	 Cause;
-			TimeToWait_t	 TimeToWait;
-			CriticalityDiagnostics_t	 CriticalityDiagnostics;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENBConfigurationUpdateFailure_IEs_t;
-typedef struct ResourceStatusRequest_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ResourceStatusRequest_IEs__value {
-		ResourceStatusRequest_IEs__value_PR present;
-		union ResourceStatusRequest_IEs__value_u {
-			Measurement_ID_t	 Measurement_ID;
-			Registration_Request_t	 Registration_Request;
-			ReportCharacteristics_t	 ReportCharacteristics;
-			CellToReport_List_t	 CellToReport_List;
-			ReportingPeriodicity_t	 ReportingPeriodicity;
-			PartialSuccessIndicator_t	 PartialSuccessIndicator;
-			ReportingPeriodicityRSRPMR_t	 ReportingPeriodicityRSRPMR;
-			ReportingPeriodicityCSIR_t	 ReportingPeriodicityCSIR;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResourceStatusRequest_IEs_t;
-typedef struct ResourceStatusResponse_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ResourceStatusResponse_IEs__value {
-		ResourceStatusResponse_IEs__value_PR present;
-		union ResourceStatusResponse_IEs__value_u {
-			Measurement_ID_t	 Measurement_ID;
-			CriticalityDiagnostics_t	 CriticalityDiagnostics;
-			MeasurementInitiationResult_List_t	 MeasurementInitiationResult_List;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResourceStatusResponse_IEs_t;
-typedef struct ResourceStatusFailure_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ResourceStatusFailure_IEs__value {
-		ResourceStatusFailure_IEs__value_PR present;
-		union ResourceStatusFailure_IEs__value_u {
-			Measurement_ID_t	 Measurement_ID;
-			Cause_t	 Cause;
-			CriticalityDiagnostics_t	 CriticalityDiagnostics;
-			CompleteFailureCauseInformation_List_t	 CompleteFailureCauseInformation_List;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResourceStatusFailure_IEs_t;
-typedef struct ResourceStatusUpdate_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ResourceStatusUpdate_IEs__value {
-		ResourceStatusUpdate_IEs__value_PR present;
-		union ResourceStatusUpdate_IEs__value_u {
-			Measurement_ID_t	 Measurement_ID;
-			CellMeasurementResult_List_t	 CellMeasurementResult_List;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResourceStatusUpdate_IEs_t;
-typedef struct SeNBReconfigurationComplete_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct SeNBReconfigurationComplete_IEs__value {
-		SeNBReconfigurationComplete_IEs__value_PR present;
-		union SeNBReconfigurationComplete_IEs__value_u {
-			UE_X2AP_ID_t	 UE_X2AP_ID;
-			ResponseInformationSeNBReconfComp_t	 ResponseInformationSeNBReconfComp;
-			UE_X2AP_ID_Extension_t	 UE_X2AP_ID_Extension;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SeNBReconfigurationComplete_IEs_t;
-typedef struct ENDCX2SetupRequest_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ENDCX2SetupRequest_IEs__value {
-		ENDCX2SetupRequest_IEs__value_PR present;
-		union ENDCX2SetupRequest_IEs__value_u {
-			InitiatingNodeType_EndcX2Setup_t	 InitiatingNodeType_EndcX2Setup;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENDCX2SetupRequest_IEs_t;
-typedef struct ENB_ENDCX2SetupReqIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ENB_ENDCX2SetupReqIEs__value {
-		ENB_ENDCX2SetupReqIEs__value_PR present;
-		union ENB_ENDCX2SetupReqIEs__value_u {
-			GlobalENB_ID_t	 GlobalENB_ID;
-			ServedEUTRAcellsENDCX2ManagementList_t	 ServedEUTRAcellsENDCX2ManagementList;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENB_ENDCX2SetupReqIEs_t;
-typedef struct En_gNB_ENDCX2SetupReqIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct En_gNB_ENDCX2SetupReqIEs__value {
-		En_gNB_ENDCX2SetupReqIEs__value_PR present;
-		union En_gNB_ENDCX2SetupReqIEs__value_u {
-			GlobalGNB_ID_t	 GlobalGNB_ID;
-			ServedNRcellsENDCX2ManagementList_t	 ServedNRcellsENDCX2ManagementList;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} En_gNB_ENDCX2SetupReqIEs_t;
-typedef struct ENDCX2SetupResponse_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ENDCX2SetupResponse_IEs__value {
-		ENDCX2SetupResponse_IEs__value_PR present;
-		union ENDCX2SetupResponse_IEs__value_u {
-			RespondingNodeType_EndcX2Setup_t	 RespondingNodeType_EndcX2Setup;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENDCX2SetupResponse_IEs_t;
-typedef struct ENB_ENDCX2SetupReqAckIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ENB_ENDCX2SetupReqAckIEs__value {
-		ENB_ENDCX2SetupReqAckIEs__value_PR present;
-		union ENB_ENDCX2SetupReqAckIEs__value_u {
-			GlobalENB_ID_t	 GlobalENB_ID;
-			ServedEUTRAcellsENDCX2ManagementList_t	 ServedEUTRAcellsENDCX2ManagementList;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENB_ENDCX2SetupReqAckIEs_t;
-typedef struct En_gNB_ENDCX2SetupReqAckIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct En_gNB_ENDCX2SetupReqAckIEs__value {
-		En_gNB_ENDCX2SetupReqAckIEs__value_PR present;
-		union En_gNB_ENDCX2SetupReqAckIEs__value_u {
-			GlobalGNB_ID_t	 GlobalGNB_ID;
-			ServedNRcellsENDCX2ManagementList_t	 ServedNRcellsENDCX2ManagementList;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} En_gNB_ENDCX2SetupReqAckIEs_t;
-typedef struct ENDCX2SetupFailure_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ENDCX2SetupFailure_IEs__value {
-		ENDCX2SetupFailure_IEs__value_PR present;
-		union ENDCX2SetupFailure_IEs__value_u {
-			Cause_t	 Cause;
-			CriticalityDiagnostics_t	 CriticalityDiagnostics;
-			TimeToWait_t	 TimeToWait;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENDCX2SetupFailure_IEs_t;
-typedef struct ENDCConfigurationUpdate_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ENDCConfigurationUpdate_IEs__value {
-		ENDCConfigurationUpdate_IEs__value_PR present;
-		union ENDCConfigurationUpdate_IEs__value_u {
-			InitiatingNodeType_EndcConfigUpdate_t	 InitiatingNodeType_EndcConfigUpdate;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENDCConfigurationUpdate_IEs_t;
-typedef struct ENB_ENDCConfigUpdateIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ENB_ENDCConfigUpdateIEs__value {
-		ENB_ENDCConfigUpdateIEs__value_PR present;
-		union ENB_ENDCConfigUpdateIEs__value_u {
-			CellAssistanceInformation_t	 CellAssistanceInformation;
-			ServedEUTRAcellsENDCX2ManagementList_t	 ServedEUTRAcellsENDCX2ManagementList;
-			ServedEUTRAcellsToModifyListENDCConfUpd_t	 ServedEUTRAcellsToModifyListENDCConfUpd;
-			ServedEUTRAcellsToDeleteListENDCConfUpd_t	 ServedEUTRAcellsToDeleteListENDCConfUpd;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENB_ENDCConfigUpdateIEs_t;
-typedef struct En_gNB_ENDCConfigUpdateIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct En_gNB_ENDCConfigUpdateIEs__value {
-		En_gNB_ENDCConfigUpdateIEs__value_PR present;
-		union En_gNB_ENDCConfigUpdateIEs__value_u {
-			ServedNRcellsENDCX2ManagementList_t	 ServedNRcellsENDCX2ManagementList;
-			ServedNRcellsToModifyENDCConfUpdList_t	 ServedNRcellsToModifyENDCConfUpdList;
-			ServedNRcellsToDeleteENDCConfUpdList_t	 ServedNRcellsToDeleteENDCConfUpdList;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} En_gNB_ENDCConfigUpdateIEs_t;
-typedef struct ENDCConfigurationUpdateAcknowledge_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ENDCConfigurationUpdateAcknowledge_IEs__value {
-		ENDCConfigurationUpdateAcknowledge_IEs__value_PR present;
-		union ENDCConfigurationUpdateAcknowledge_IEs__value_u {
-			RespondingNodeType_EndcConfigUpdate_t	 RespondingNodeType_EndcConfigUpdate;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENDCConfigurationUpdateAcknowledge_IEs_t;
-typedef struct ENB_ENDCConfigUpdateAckIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ENB_ENDCConfigUpdateAckIEs__value {
-		ENB_ENDCConfigUpdateAckIEs__value_PR present;
-		union ENB_ENDCConfigUpdateAckIEs__value_u {
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENB_ENDCConfigUpdateAckIEs_t;
-typedef struct En_gNB_ENDCConfigUpdateAckIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct En_gNB_ENDCConfigUpdateAckIEs__value {
-		En_gNB_ENDCConfigUpdateAckIEs__value_PR present;
-		union En_gNB_ENDCConfigUpdateAckIEs__value_u {
-			ServedNRcellsENDCX2ManagementList_t	 ServedNRcellsENDCX2ManagementList;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} En_gNB_ENDCConfigUpdateAckIEs_t;
-typedef struct ENDCConfigurationUpdateFailure_IEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct ENDCConfigurationUpdateFailure_IEs__value {
-		ENDCConfigurationUpdateFailure_IEs__value_PR present;
-		union ENDCConfigurationUpdateFailure_IEs__value_u {
-			Cause_t	 Cause;
-			CriticalityDiagnostics_t	 CriticalityDiagnostics;
-			TimeToWait_t	 TimeToWait;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ENDCConfigurationUpdateFailure_IEs_t;
-typedef struct GNBStatusIndicationIEs {
-	ProtocolIE_ID_t	 id;
-	Criticality_t	 criticality;
-	struct GNBStatusIndicationIEs__value {
-		GNBStatusIndicationIEs__value_PR present;
-		union GNBStatusIndicationIEs__value_u {
-			GNBOverloadInformation_t	 GNBOverloadInformation;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} GNBStatusIndicationIEs_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_ItemIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_ItemIEs_1[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_ItemIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICaction_Admitted_ItemIEs_specs_5;
-extern asn_TYPE_member_t asn_MBR_RICaction_Admitted_ItemIEs_5[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_ItemIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9;
-extern asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_ItemIEs_9[3];
-extern asn_TYPE_descriptor_t asn_DEF_RANfunction_ItemIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RANfunction_ItemIEs_specs_13;
-extern asn_TYPE_member_t asn_MBR_RANfunction_ItemIEs_13[3];
-extern asn_TYPE_descriptor_t asn_DEF_RANfunctionID_ItemIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RANfunctionID_ItemIEs_specs_17;
-extern asn_TYPE_member_t asn_MBR_RANfunctionID_ItemIEs_17[3];
-extern asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_ItemIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RANfunctionIDcause_ItemIEs_specs_21;
-extern asn_TYPE_member_t asn_MBR_RANfunctionIDcause_ItemIEs_21[3];
-extern asn_TYPE_descriptor_t asn_DEF_CellInformation_ItemIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CellInformation_ItemIEs_specs_25;
-extern asn_TYPE_member_t asn_MBR_CellInformation_ItemIEs_25[3];
-extern asn_TYPE_descriptor_t asn_DEF_CellToReport_ItemIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CellToReport_ItemIEs_specs_29;
-extern asn_TYPE_member_t asn_MBR_CellToReport_ItemIEs_29[3];
-extern asn_TYPE_descriptor_t asn_DEF_MeasurementInitiationResult_ItemIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_MeasurementInitiationResult_ItemIEs_specs_33;
-extern asn_TYPE_member_t asn_MBR_MeasurementInitiationResult_ItemIEs_33[3];
-extern asn_TYPE_descriptor_t asn_DEF_MeasurementFailureCause_ItemIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_MeasurementFailureCause_ItemIEs_specs_37;
-extern asn_TYPE_member_t asn_MBR_MeasurementFailureCause_ItemIEs_37[3];
-extern asn_TYPE_descriptor_t asn_DEF_CompleteFailureCauseInformation_ItemIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CompleteFailureCauseInformation_ItemIEs_specs_41;
-extern asn_TYPE_member_t asn_MBR_CompleteFailureCauseInformation_ItemIEs_41[3];
-extern asn_TYPE_descriptor_t asn_DEF_CellMeasurementResult_ItemIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_CellMeasurementResult_ItemIEs_specs_45;
-extern asn_TYPE_member_t asn_MBR_CellMeasurementResult_ItemIEs_45[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_IEs_specs_49;
-extern asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_IEs_49[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_IEs_specs_53;
-extern asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_IEs_53[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_IEs_specs_57;
-extern asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_IEs_57[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_61;
-extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_IEs_61[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_65;
-extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_IEs_65[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_69;
-extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_IEs_69[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICindication_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICindication_IEs_specs_73;
-extern asn_TYPE_member_t asn_MBR_RICindication_IEs_73[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_IEs_specs_77;
-extern asn_TYPE_member_t asn_MBR_RICcontrolRequest_IEs_77[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_IEs_specs_81;
-extern asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_IEs_81[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_IEs_specs_85;
-extern asn_TYPE_member_t asn_MBR_RICcontrolFailure_IEs_85[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_IEs_specs_89;
-extern asn_TYPE_member_t asn_MBR_RICserviceUpdate_IEs_89[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_93;
-extern asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_IEs_93[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_IEs_specs_97;
-extern asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_IEs_97[3];
-extern asn_TYPE_descriptor_t asn_DEF_RICserviceQuery_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_IEs_specs_101;
-extern asn_TYPE_member_t asn_MBR_RICserviceQuery_IEs_101[3];
-extern asn_TYPE_descriptor_t asn_DEF_ErrorIndication_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ErrorIndication_IEs_specs_105;
-extern asn_TYPE_member_t asn_MBR_ErrorIndication_IEs_105[3];
-extern asn_TYPE_descriptor_t asn_DEF_ResetRequest_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResetRequest_IEs_specs_109;
-extern asn_TYPE_member_t asn_MBR_ResetRequest_IEs_109[3];
-extern asn_TYPE_descriptor_t asn_DEF_ResetResponse_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResetResponse_IEs_specs_113;
-extern asn_TYPE_member_t asn_MBR_ResetResponse_IEs_113[3];
-extern asn_TYPE_descriptor_t asn_DEF_X2SetupRequest_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_X2SetupRequest_IEs_specs_117;
-extern asn_TYPE_member_t asn_MBR_X2SetupRequest_IEs_117[3];
-extern asn_TYPE_descriptor_t asn_DEF_X2SetupResponse_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_X2SetupResponse_IEs_specs_121;
-extern asn_TYPE_member_t asn_MBR_X2SetupResponse_IEs_121[3];
-extern asn_TYPE_descriptor_t asn_DEF_X2SetupFailure_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_X2SetupFailure_IEs_specs_125;
-extern asn_TYPE_member_t asn_MBR_X2SetupFailure_IEs_125[3];
-extern asn_TYPE_descriptor_t asn_DEF_LoadInformation_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_LoadInformation_IEs_specs_129;
-extern asn_TYPE_member_t asn_MBR_LoadInformation_IEs_129[3];
-extern asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdate_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationUpdate_IEs_specs_133;
-extern asn_TYPE_member_t asn_MBR_ENBConfigurationUpdate_IEs_133[3];
-extern asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdateAcknowledge_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationUpdateAcknowledge_IEs_specs_137;
-extern asn_TYPE_member_t asn_MBR_ENBConfigurationUpdateAcknowledge_IEs_137[3];
-extern asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdateFailure_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationUpdateFailure_IEs_specs_141;
-extern asn_TYPE_member_t asn_MBR_ENBConfigurationUpdateFailure_IEs_141[3];
-extern asn_TYPE_descriptor_t asn_DEF_ResourceStatusRequest_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusRequest_IEs_specs_145;
-extern asn_TYPE_member_t asn_MBR_ResourceStatusRequest_IEs_145[3];
-extern asn_TYPE_descriptor_t asn_DEF_ResourceStatusResponse_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusResponse_IEs_specs_149;
-extern asn_TYPE_member_t asn_MBR_ResourceStatusResponse_IEs_149[3];
-extern asn_TYPE_descriptor_t asn_DEF_ResourceStatusFailure_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusFailure_IEs_specs_153;
-extern asn_TYPE_member_t asn_MBR_ResourceStatusFailure_IEs_153[3];
-extern asn_TYPE_descriptor_t asn_DEF_ResourceStatusUpdate_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusUpdate_IEs_specs_157;
-extern asn_TYPE_member_t asn_MBR_ResourceStatusUpdate_IEs_157[3];
-extern asn_TYPE_descriptor_t asn_DEF_SeNBReconfigurationComplete_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_SeNBReconfigurationComplete_IEs_specs_161;
-extern asn_TYPE_member_t asn_MBR_SeNBReconfigurationComplete_IEs_161[3];
-extern asn_TYPE_descriptor_t asn_DEF_ENDCX2SetupRequest_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENDCX2SetupRequest_IEs_specs_165;
-extern asn_TYPE_member_t asn_MBR_ENDCX2SetupRequest_IEs_165[3];
-extern asn_TYPE_descriptor_t asn_DEF_ENB_ENDCX2SetupReqIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENB_ENDCX2SetupReqIEs_specs_169;
-extern asn_TYPE_member_t asn_MBR_ENB_ENDCX2SetupReqIEs_169[3];
-extern asn_TYPE_descriptor_t asn_DEF_En_gNB_ENDCX2SetupReqIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_En_gNB_ENDCX2SetupReqIEs_specs_173;
-extern asn_TYPE_member_t asn_MBR_En_gNB_ENDCX2SetupReqIEs_173[3];
-extern asn_TYPE_descriptor_t asn_DEF_ENDCX2SetupResponse_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENDCX2SetupResponse_IEs_specs_177;
-extern asn_TYPE_member_t asn_MBR_ENDCX2SetupResponse_IEs_177[3];
-extern asn_TYPE_descriptor_t asn_DEF_ENB_ENDCX2SetupReqAckIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENB_ENDCX2SetupReqAckIEs_specs_181;
-extern asn_TYPE_member_t asn_MBR_ENB_ENDCX2SetupReqAckIEs_181[3];
-extern asn_TYPE_descriptor_t asn_DEF_En_gNB_ENDCX2SetupReqAckIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_En_gNB_ENDCX2SetupReqAckIEs_specs_185;
-extern asn_TYPE_member_t asn_MBR_En_gNB_ENDCX2SetupReqAckIEs_185[3];
-extern asn_TYPE_descriptor_t asn_DEF_ENDCX2SetupFailure_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENDCX2SetupFailure_IEs_specs_189;
-extern asn_TYPE_member_t asn_MBR_ENDCX2SetupFailure_IEs_189[3];
-extern asn_TYPE_descriptor_t asn_DEF_ENDCConfigurationUpdate_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENDCConfigurationUpdate_IEs_specs_193;
-extern asn_TYPE_member_t asn_MBR_ENDCConfigurationUpdate_IEs_193[3];
-extern asn_TYPE_descriptor_t asn_DEF_ENB_ENDCConfigUpdateIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENB_ENDCConfigUpdateIEs_specs_197;
-extern asn_TYPE_member_t asn_MBR_ENB_ENDCConfigUpdateIEs_197[3];
-extern asn_TYPE_descriptor_t asn_DEF_En_gNB_ENDCConfigUpdateIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_En_gNB_ENDCConfigUpdateIEs_specs_201;
-extern asn_TYPE_member_t asn_MBR_En_gNB_ENDCConfigUpdateIEs_201[3];
-extern asn_TYPE_descriptor_t asn_DEF_ENDCConfigurationUpdateAcknowledge_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENDCConfigurationUpdateAcknowledge_IEs_specs_205;
-extern asn_TYPE_member_t asn_MBR_ENDCConfigurationUpdateAcknowledge_IEs_205[3];
-extern asn_TYPE_descriptor_t asn_DEF_ENB_ENDCConfigUpdateAckIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENB_ENDCConfigUpdateAckIEs_specs_209;
-extern asn_TYPE_member_t asn_MBR_ENB_ENDCConfigUpdateAckIEs_209[3];
-extern asn_TYPE_descriptor_t asn_DEF_En_gNB_ENDCConfigUpdateAckIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_En_gNB_ENDCConfigUpdateAckIEs_specs_213;
-extern asn_TYPE_member_t asn_MBR_En_gNB_ENDCConfigUpdateAckIEs_213[3];
-extern asn_TYPE_descriptor_t asn_DEF_ENDCConfigurationUpdateFailure_IEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_ENDCConfigurationUpdateFailure_IEs_specs_217;
-extern asn_TYPE_member_t asn_MBR_ENDCConfigurationUpdateFailure_IEs_217[3];
-extern asn_TYPE_descriptor_t asn_DEF_GNBStatusIndicationIEs;
-extern asn_SEQUENCE_specifics_t asn_SPC_GNBStatusIndicationIEs_specs_221;
-extern asn_TYPE_member_t asn_MBR_GNBStatusIndicationIEs_221[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ProtocolIE_Field_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ProtocolIE-ID.c b/3rdparty/libe2ap/ProtocolIE-ID.c
deleted file mode 100644
index ea5c3ae..0000000
--- a/3rdparty/libe2ap/ProtocolIE-ID.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-CommonDataTypes"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ProtocolIE-ID.h"
-
-int
-ProtocolIE_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_ProtocolIE_ID_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_ID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ID = {
-	"ProtocolIE-ID",
-	"ProtocolIE-ID",
-	&asn_OP_NativeInteger,
-	asn_DEF_ProtocolIE_ID_tags_1,
-	sizeof(asn_DEF_ProtocolIE_ID_tags_1)
-		/sizeof(asn_DEF_ProtocolIE_ID_tags_1[0]), /* 1 */
-	asn_DEF_ProtocolIE_ID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_ID_tags_1)
-		/sizeof(asn_DEF_ProtocolIE_ID_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ProtocolIE_ID_constr_1, ProtocolIE_ID_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/ProtocolIE-ID.h b/3rdparty/libe2ap/ProtocolIE-ID.h
deleted file mode 100644
index 558b9c1..0000000
--- a/3rdparty/libe2ap/ProtocolIE-ID.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-CommonDataTypes"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ProtocolIE_ID_H_
-#define	_ProtocolIE_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ProtocolIE-ID */
-typedef long	 ProtocolIE_ID_t;
-
-/* Implementation */
-#define ProtocolIE_ID_id_RANfunction_Item	((ProtocolIE_ID_t)60001)
-#define ProtocolIE_ID_id_RANfunctionDefinition	((ProtocolIE_ID_t)60002)
-#define ProtocolIE_ID_id_RANfunctionID	((ProtocolIE_ID_t)60003)
-#define ProtocolIE_ID_id_RANfunctionID_Item	((ProtocolIE_ID_t)60004)
-#define ProtocolIE_ID_id_RANfunctionIEcause_Item	((ProtocolIE_ID_t)60005)
-#define ProtocolIE_ID_id_RANfunctionsAccepted	((ProtocolIE_ID_t)60006)
-#define ProtocolIE_ID_id_RANfunctionsAdded	((ProtocolIE_ID_t)60007)
-#define ProtocolIE_ID_id_RANfunctionsDeleted	((ProtocolIE_ID_t)60008)
-#define ProtocolIE_ID_id_RANfunctionsModified	((ProtocolIE_ID_t)60009)
-#define ProtocolIE_ID_id_RANfunctionsRejected	((ProtocolIE_ID_t)60010)
-#define ProtocolIE_ID_id_RICaction_ToBeSetup_Item	((ProtocolIE_ID_t)60011)
-#define ProtocolIE_ID_id_RICactions_Admitted	((ProtocolIE_ID_t)60012)
-#define ProtocolIE_ID_id_RICaction_Admitted_Item	((ProtocolIE_ID_t)60013)
-#define ProtocolIE_ID_id_RICactions_NotAdmitted	((ProtocolIE_ID_t)60014)
-#define ProtocolIE_ID_id_RICaction_NotAdmitted_Item	((ProtocolIE_ID_t)60015)
-#define ProtocolIE_ID_id_RICactionDefinition	((ProtocolIE_ID_t)60016)
-#define ProtocolIE_ID_id_RICactionID	((ProtocolIE_ID_t)60017)
-#define ProtocolIE_ID_id_RICactionType	((ProtocolIE_ID_t)60018)
-#define ProtocolIE_ID_id_RICcallProcessID	((ProtocolIE_ID_t)60019)
-#define ProtocolIE_ID_id_RICcause	((ProtocolIE_ID_t)60020)
-#define ProtocolIE_ID_id_RICcontrolAckRequest	((ProtocolIE_ID_t)60021)
-#define ProtocolIE_ID_id_RICcontrolHeader	((ProtocolIE_ID_t)60022)
-#define ProtocolIE_ID_id_RICcontrolMessage	((ProtocolIE_ID_t)60023)
-#define ProtocolIE_ID_id_RICcontrolStatus	((ProtocolIE_ID_t)60024)
-#define ProtocolIE_ID_id_RICeventTriggerDefinition	((ProtocolIE_ID_t)60025)
-#define ProtocolIE_ID_id_RICindicationHeader	((ProtocolIE_ID_t)60026)
-#define ProtocolIE_ID_id_RICindicationMessage	((ProtocolIE_ID_t)60027)
-#define ProtocolIE_ID_id_RICindicationSN	((ProtocolIE_ID_t)60028)
-#define ProtocolIE_ID_id_RICindicationType	((ProtocolIE_ID_t)60029)
-#define ProtocolIE_ID_id_RICrequestID	((ProtocolIE_ID_t)60030)
-#define ProtocolIE_ID_id_RICrequestorID	((ProtocolIE_ID_t)60031)
-#define ProtocolIE_ID_id_RICrequestSequenceNumber	((ProtocolIE_ID_t)60032)
-#define ProtocolIE_ID_id_RICsubscription	((ProtocolIE_ID_t)60033)
-#define ProtocolIE_ID_id_RICsubsequentAction	((ProtocolIE_ID_t)60034)
-#define ProtocolIE_ID_id_RICsubsequentActionType	((ProtocolIE_ID_t)60035)
-#define ProtocolIE_ID_id_RICtimeToWait	((ProtocolIE_ID_t)60036)
-extern asn_per_constraints_t asn_PER_type_ProtocolIE_ID_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ID;
-asn_struct_free_f ProtocolIE_ID_free;
-asn_struct_print_f ProtocolIE_ID_print;
-asn_constr_check_f ProtocolIE_ID_constraint;
-ber_type_decoder_f ProtocolIE_ID_decode_ber;
-der_type_encoder_f ProtocolIE_ID_encode_der;
-xer_type_decoder_f ProtocolIE_ID_decode_xer;
-xer_type_encoder_f ProtocolIE_ID_encode_xer;
-per_type_decoder_f ProtocolIE_ID_decode_uper;
-per_type_encoder_f ProtocolIE_ID_encode_uper;
-per_type_decoder_f ProtocolIE_ID_decode_aper;
-per_type_encoder_f ProtocolIE_ID_encode_aper;
-#define ProtocolIE_ID_id_Cause	((ProtocolIE_ID_t)5)
-#define ProtocolIE_ID_id_CellInformation	((ProtocolIE_ID_t)6)
-#define ProtocolIE_ID_id_CellInformation_Item	((ProtocolIE_ID_t)7)
-#define ProtocolIE_ID_id_New_eNB_UE_X2AP_ID	((ProtocolIE_ID_t)9)
-#define ProtocolIE_ID_id_Old_eNB_UE_X2AP_ID	((ProtocolIE_ID_t)10)
-#define ProtocolIE_ID_id_CriticalityDiagnostics	((ProtocolIE_ID_t)17)
-#define ProtocolIE_ID_id_ServedCells	((ProtocolIE_ID_t)20)
-#define ProtocolIE_ID_id_GlobalENB_ID	((ProtocolIE_ID_t)21)
-#define ProtocolIE_ID_id_TimeToWait	((ProtocolIE_ID_t)22)
-#define ProtocolIE_ID_id_GUGroupIDList	((ProtocolIE_ID_t)24)
-#define ProtocolIE_ID_id_ServedCellsToAdd	((ProtocolIE_ID_t)25)
-#define ProtocolIE_ID_id_ServedCellsToModify	((ProtocolIE_ID_t)26)
-#define ProtocolIE_ID_id_ServedCellsToDelete	((ProtocolIE_ID_t)27)
-#define ProtocolIE_ID_id_Registration_Request	((ProtocolIE_ID_t)28)
-#define ProtocolIE_ID_id_CellToReport	((ProtocolIE_ID_t)29)
-#define ProtocolIE_ID_id_ReportingPeriodicity	((ProtocolIE_ID_t)30)
-#define ProtocolIE_ID_id_CellToReport_Item	((ProtocolIE_ID_t)31)
-#define ProtocolIE_ID_id_CellMeasurementResult	((ProtocolIE_ID_t)32)
-#define ProtocolIE_ID_id_CellMeasurementResult_Item	((ProtocolIE_ID_t)33)
-#define ProtocolIE_ID_id_GUGroupIDToAddList	((ProtocolIE_ID_t)34)
-#define ProtocolIE_ID_id_GUGroupIDToDeleteList	((ProtocolIE_ID_t)35)
-#define ProtocolIE_ID_id_ReportCharacteristics	((ProtocolIE_ID_t)38)
-#define ProtocolIE_ID_id_ENB1_Measurement_ID	((ProtocolIE_ID_t)39)
-#define ProtocolIE_ID_id_ENB2_Measurement_ID	((ProtocolIE_ID_t)40)
-#define ProtocolIE_ID_id_Number_of_Antennaports	((ProtocolIE_ID_t)41)
-#define ProtocolIE_ID_id_CompositeAvailableCapacityGroup	((ProtocolIE_ID_t)42)
-#define ProtocolIE_ID_id_PRACH_Configuration	((ProtocolIE_ID_t)55)
-#define ProtocolIE_ID_id_MBSFN_Subframe_Info	((ProtocolIE_ID_t)56)
-#define ProtocolIE_ID_id_DeactivationIndication	((ProtocolIE_ID_t)59)
-#define ProtocolIE_ID_id_ABSInformation	((ProtocolIE_ID_t)61)
-#define ProtocolIE_ID_id_InvokeIndication	((ProtocolIE_ID_t)62)
-#define ProtocolIE_ID_id_ABS_Status	((ProtocolIE_ID_t)63)
-#define ProtocolIE_ID_id_PartialSuccessIndicator	((ProtocolIE_ID_t)64)
-#define ProtocolIE_ID_id_MeasurementInitiationResult_List	((ProtocolIE_ID_t)65)
-#define ProtocolIE_ID_id_MeasurementInitiationResult_Item	((ProtocolIE_ID_t)66)
-#define ProtocolIE_ID_id_MeasurementFailureCause_Item	((ProtocolIE_ID_t)67)
-#define ProtocolIE_ID_id_CompleteFailureCauseInformation_List	((ProtocolIE_ID_t)68)
-#define ProtocolIE_ID_id_CompleteFailureCauseInformation_Item	((ProtocolIE_ID_t)69)
-#define ProtocolIE_ID_id_CSG_Id	((ProtocolIE_ID_t)70)
-#define ProtocolIE_ID_id_NeighbourTAC	((ProtocolIE_ID_t)76)
-#define ProtocolIE_ID_id_MBMS_Service_Area_List	((ProtocolIE_ID_t)79)
-#define ProtocolIE_ID_id_MultibandInfoList	((ProtocolIE_ID_t)84)
-#define ProtocolIE_ID_id_eARFCNExtension	((ProtocolIE_ID_t)94)
-#define ProtocolIE_ID_id_UL_EARFCNExtension	((ProtocolIE_ID_t)95)
-#define ProtocolIE_ID_id_DL_EARFCNExtension	((ProtocolIE_ID_t)96)
-#define ProtocolIE_ID_id_AdditionalSpecialSubframe_Info	((ProtocolIE_ID_t)97)
-#define ProtocolIE_ID_id_IntendedULDLConfiguration	((ProtocolIE_ID_t)99)
-#define ProtocolIE_ID_id_ExtendedULInterferenceOverloadInfo	((ProtocolIE_ID_t)100)
-#define ProtocolIE_ID_id_DynamicDLTransmissionInformation	((ProtocolIE_ID_t)106)
-#define ProtocolIE_ID_id_CoMPInformation	((ProtocolIE_ID_t)108)
-#define ProtocolIE_ID_id_ReportingPeriodicityRSRPMR	((ProtocolIE_ID_t)109)
-#define ProtocolIE_ID_id_RSRPMRList	((ProtocolIE_ID_t)110)
-#define ProtocolIE_ID_id_MeNB_UE_X2AP_ID	((ProtocolIE_ID_t)111)
-#define ProtocolIE_ID_id_SeNB_UE_X2AP_ID	((ProtocolIE_ID_t)112)
-#define ProtocolIE_ID_id_ResponseInformationSeNBReconfComp	((ProtocolIE_ID_t)123)
-#define ProtocolIE_ID_id_CoverageModificationList	((ProtocolIE_ID_t)143)
-#define ProtocolIE_ID_id_ReportingPeriodicityCSIR	((ProtocolIE_ID_t)145)
-#define ProtocolIE_ID_id_CSIReportList	((ProtocolIE_ID_t)146)
-#define ProtocolIE_ID_id_UEID	((ProtocolIE_ID_t)147)
-#define ProtocolIE_ID_id_enhancedRNTP	((ProtocolIE_ID_t)148)
-#define ProtocolIE_ID_id_New_eNB_UE_X2AP_ID_Extension	((ProtocolIE_ID_t)155)
-#define ProtocolIE_ID_id_Old_eNB_UE_X2AP_ID_Extension	((ProtocolIE_ID_t)156)
-#define ProtocolIE_ID_id_MeNB_UE_X2AP_ID_Extension	((ProtocolIE_ID_t)157)
-#define ProtocolIE_ID_id_SeNB_UE_X2AP_ID_Extension	((ProtocolIE_ID_t)158)
-#define ProtocolIE_ID_id_LHN_ID	((ProtocolIE_ID_t)159)
-#define ProtocolIE_ID_id_FreqBandIndicatorPriority	((ProtocolIE_ID_t)160)
-#define ProtocolIE_ID_id_CellReportingIndicator	((ProtocolIE_ID_t)170)
-#define ProtocolIE_ID_id_OffsetOfNbiotChannelNumberToDL_EARFCN	((ProtocolIE_ID_t)177)
-#define ProtocolIE_ID_id_OffsetOfNbiotChannelNumberToUL_EARFCN	((ProtocolIE_ID_t)178)
-#define ProtocolIE_ID_id_AdditionalSpecialSubframeExtension_Info	((ProtocolIE_ID_t)179)
-#define ProtocolIE_ID_id_BandwidthReducedSI	((ProtocolIE_ID_t)180)
-#define ProtocolIE_ID_id_DL_scheduling_PDCCH_CCE_usage	((ProtocolIE_ID_t)193)
-#define ProtocolIE_ID_id_UL_scheduling_PDCCH_CCE_usage	((ProtocolIE_ID_t)194)
-#define ProtocolIE_ID_id_SgNB_UE_X2AP_ID	((ProtocolIE_ID_t)207)
-#define ProtocolIE_ID_id_ResponseInformationSgNBReconfComp	((ProtocolIE_ID_t)214)
-#define ProtocolIE_ID_id_InitiatingNodeType_EndcX2Setup	((ProtocolIE_ID_t)244)
-#define ProtocolIE_ID_id_InitiatingNodeType_EndcConfigUpdate	((ProtocolIE_ID_t)245)
-#define ProtocolIE_ID_id_RespondingNodeType_EndcX2Setup	((ProtocolIE_ID_t)246)
-#define ProtocolIE_ID_id_RespondingNodeType_EndcConfigUpdate	((ProtocolIE_ID_t)247)
-#define ProtocolIE_ID_id_ServedEUTRAcellsENDCX2ManagementList	((ProtocolIE_ID_t)250)
-#define ProtocolIE_ID_id_CellAssistanceInformation	((ProtocolIE_ID_t)251)
-#define ProtocolIE_ID_id_Globalen_gNB_ID	((ProtocolIE_ID_t)252)
-#define ProtocolIE_ID_id_ServedNRcellsENDCX2ManagementList	((ProtocolIE_ID_t)253)
-#define ProtocolIE_ID_id_ServedEUTRAcellsToModifyListENDCConfUpd	((ProtocolIE_ID_t)259)
-#define ProtocolIE_ID_id_ServedEUTRAcellsToDeleteListENDCConfUpd	((ProtocolIE_ID_t)260)
-#define ProtocolIE_ID_id_ServedNRcellsToModifyListENDCConfUpd	((ProtocolIE_ID_t)261)
-#define ProtocolIE_ID_id_ServedNRcellsToDeleteListENDCConfUpd	((ProtocolIE_ID_t)262)
-#define ProtocolIE_ID_id_Old_SgNB_UE_X2AP_ID	((ProtocolIE_ID_t)264)
-#define ProtocolIE_ID_id_NRS_NSSS_PowerOffset	((ProtocolIE_ID_t)282)
-#define ProtocolIE_ID_id_NSSS_NumOccasionDifferentPrecoder	((ProtocolIE_ID_t)283)
-#define ProtocolIE_ID_id_ProtectedEUTRAResourceIndication	((ProtocolIE_ID_t)284)
-#define ProtocolIE_ID_id_GNBOverloadInformation	((ProtocolIE_ID_t)310)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ProtocolIE_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ProtocolIE-Single-Container.c b/3rdparty/libe2ap/ProtocolIE-Single-Container.c
deleted file mode 100644
index ddc70c0..0000000
--- a/3rdparty/libe2ap/ProtocolIE-Single-Container.c
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-Containers"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ProtocolIE-Single-Container.h"
-
-/*
- * This type is implemented using RICaction_ToBeSetup_ItemIEs,
- * so here we adjust the DEF accordingly.
- */
-/*
- * This type is implemented using RICaction_Admitted_ItemIEs,
- * so here we adjust the DEF accordingly.
- */
-/*
- * This type is implemented using RICaction_NotAdmitted_ItemIEs,
- * so here we adjust the DEF accordingly.
- */
-/*
- * This type is implemented using RANfunction_ItemIEs,
- * so here we adjust the DEF accordingly.
- */
-/*
- * This type is implemented using RANfunctionID_ItemIEs,
- * so here we adjust the DEF accordingly.
- */
-/*
- * This type is implemented using RANfunctionIDcause_ItemIEs,
- * so here we adjust the DEF accordingly.
- */
-/*
- * This type is implemented using CellInformation_ItemIEs,
- * so here we adjust the DEF accordingly.
- */
-/*
- * This type is implemented using CellToReport_ItemIEs,
- * so here we adjust the DEF accordingly.
- */
-/*
- * This type is implemented using MeasurementInitiationResult_ItemIEs,
- * so here we adjust the DEF accordingly.
- */
-/*
- * This type is implemented using MeasurementFailureCause_ItemIEs,
- * so here we adjust the DEF accordingly.
- */
-/*
- * This type is implemented using CompleteFailureCauseInformation_ItemIEs,
- * so here we adjust the DEF accordingly.
- */
-/*
- * This type is implemented using CellMeasurementResult_ItemIEs,
- * so here we adjust the DEF accordingly.
- */
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Single_Container_8810P0_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P0 = {
-	"ProtocolIE-Single-Container",
-	"ProtocolIE-Single-Container",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtocolIE_Single_Container_8810P0_tags_1,
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P0_tags_1)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P0_tags_1[0]), /* 1 */
-	asn_DEF_ProtocolIE_Single_Container_8810P0_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P0_tags_1)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P0_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICaction_ToBeSetup_ItemIEs_1,
-	3,	/* Elements count */
-	&asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1	/* Additional specs */
-};
-
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Single_Container_8810P1_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P1 = {
-	"ProtocolIE-Single-Container",
-	"ProtocolIE-Single-Container",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtocolIE_Single_Container_8810P1_tags_2,
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P1_tags_2)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P1_tags_2[0]), /* 1 */
-	asn_DEF_ProtocolIE_Single_Container_8810P1_tags_2,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P1_tags_2)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P1_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICaction_Admitted_ItemIEs_5,
-	3,	/* Elements count */
-	&asn_SPC_RICaction_Admitted_ItemIEs_specs_5	/* Additional specs */
-};
-
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Single_Container_8810P2_tags_3[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P2 = {
-	"ProtocolIE-Single-Container",
-	"ProtocolIE-Single-Container",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtocolIE_Single_Container_8810P2_tags_3,
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P2_tags_3)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P2_tags_3[0]), /* 1 */
-	asn_DEF_ProtocolIE_Single_Container_8810P2_tags_3,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P2_tags_3)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P2_tags_3[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICaction_NotAdmitted_ItemIEs_9,
-	3,	/* Elements count */
-	&asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9	/* Additional specs */
-};
-
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Single_Container_8810P3_tags_4[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P3 = {
-	"ProtocolIE-Single-Container",
-	"ProtocolIE-Single-Container",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtocolIE_Single_Container_8810P3_tags_4,
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P3_tags_4)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P3_tags_4[0]), /* 1 */
-	asn_DEF_ProtocolIE_Single_Container_8810P3_tags_4,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P3_tags_4)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P3_tags_4[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RANfunction_ItemIEs_13,
-	3,	/* Elements count */
-	&asn_SPC_RANfunction_ItemIEs_specs_13	/* Additional specs */
-};
-
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Single_Container_8810P4_tags_5[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P4 = {
-	"ProtocolIE-Single-Container",
-	"ProtocolIE-Single-Container",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtocolIE_Single_Container_8810P4_tags_5,
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P4_tags_5)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P4_tags_5[0]), /* 1 */
-	asn_DEF_ProtocolIE_Single_Container_8810P4_tags_5,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P4_tags_5)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P4_tags_5[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RANfunctionID_ItemIEs_17,
-	3,	/* Elements count */
-	&asn_SPC_RANfunctionID_ItemIEs_specs_17	/* Additional specs */
-};
-
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Single_Container_8810P5_tags_6[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P5 = {
-	"ProtocolIE-Single-Container",
-	"ProtocolIE-Single-Container",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtocolIE_Single_Container_8810P5_tags_6,
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P5_tags_6)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P5_tags_6[0]), /* 1 */
-	asn_DEF_ProtocolIE_Single_Container_8810P5_tags_6,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P5_tags_6)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P5_tags_6[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RANfunctionIDcause_ItemIEs_21,
-	3,	/* Elements count */
-	&asn_SPC_RANfunctionIDcause_ItemIEs_specs_21	/* Additional specs */
-};
-
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Single_Container_8810P6_tags_7[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P6 = {
-	"ProtocolIE-Single-Container",
-	"ProtocolIE-Single-Container",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtocolIE_Single_Container_8810P6_tags_7,
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P6_tags_7)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P6_tags_7[0]), /* 1 */
-	asn_DEF_ProtocolIE_Single_Container_8810P6_tags_7,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P6_tags_7)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P6_tags_7[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellInformation_ItemIEs_25,
-	3,	/* Elements count */
-	&asn_SPC_CellInformation_ItemIEs_specs_25	/* Additional specs */
-};
-
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Single_Container_8810P7_tags_8[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P7 = {
-	"ProtocolIE-Single-Container",
-	"ProtocolIE-Single-Container",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtocolIE_Single_Container_8810P7_tags_8,
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P7_tags_8)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P7_tags_8[0]), /* 1 */
-	asn_DEF_ProtocolIE_Single_Container_8810P7_tags_8,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P7_tags_8)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P7_tags_8[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellToReport_ItemIEs_29,
-	3,	/* Elements count */
-	&asn_SPC_CellToReport_ItemIEs_specs_29	/* Additional specs */
-};
-
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Single_Container_8810P8_tags_9[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P8 = {
-	"ProtocolIE-Single-Container",
-	"ProtocolIE-Single-Container",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtocolIE_Single_Container_8810P8_tags_9,
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P8_tags_9)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P8_tags_9[0]), /* 1 */
-	asn_DEF_ProtocolIE_Single_Container_8810P8_tags_9,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P8_tags_9)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P8_tags_9[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_MeasurementInitiationResult_ItemIEs_33,
-	3,	/* Elements count */
-	&asn_SPC_MeasurementInitiationResult_ItemIEs_specs_33	/* Additional specs */
-};
-
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Single_Container_8810P9_tags_10[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P9 = {
-	"ProtocolIE-Single-Container",
-	"ProtocolIE-Single-Container",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtocolIE_Single_Container_8810P9_tags_10,
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P9_tags_10)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P9_tags_10[0]), /* 1 */
-	asn_DEF_ProtocolIE_Single_Container_8810P9_tags_10,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P9_tags_10)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P9_tags_10[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_MeasurementFailureCause_ItemIEs_37,
-	3,	/* Elements count */
-	&asn_SPC_MeasurementFailureCause_ItemIEs_specs_37	/* Additional specs */
-};
-
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Single_Container_8810P10_tags_11[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P10 = {
-	"ProtocolIE-Single-Container",
-	"ProtocolIE-Single-Container",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtocolIE_Single_Container_8810P10_tags_11,
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P10_tags_11)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P10_tags_11[0]), /* 1 */
-	asn_DEF_ProtocolIE_Single_Container_8810P10_tags_11,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P10_tags_11)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P10_tags_11[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CompleteFailureCauseInformation_ItemIEs_41,
-	3,	/* Elements count */
-	&asn_SPC_CompleteFailureCauseInformation_ItemIEs_specs_41	/* Additional specs */
-};
-
-static const ber_tlv_tag_t asn_DEF_ProtocolIE_Single_Container_8810P11_tags_12[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P11 = {
-	"ProtocolIE-Single-Container",
-	"ProtocolIE-Single-Container",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ProtocolIE_Single_Container_8810P11_tags_12,
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P11_tags_12)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P11_tags_12[0]), /* 1 */
-	asn_DEF_ProtocolIE_Single_Container_8810P11_tags_12,	/* Same as above */
-	sizeof(asn_DEF_ProtocolIE_Single_Container_8810P11_tags_12)
-		/sizeof(asn_DEF_ProtocolIE_Single_Container_8810P11_tags_12[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_CellMeasurementResult_ItemIEs_45,
-	3,	/* Elements count */
-	&asn_SPC_CellMeasurementResult_ItemIEs_specs_45	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ProtocolIE-Single-Container.h b/3rdparty/libe2ap/ProtocolIE-Single-Container.h
deleted file mode 100644
index 5053515..0000000
--- a/3rdparty/libe2ap/ProtocolIE-Single-Container.h
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-Containers"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ProtocolIE_Single_Container_H_
-#define	_ProtocolIE_Single_Container_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Field.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ProtocolIE-Single-Container */
-typedef RICaction_ToBeSetup_ItemIEs_t	 ProtocolIE_Single_Container_8810P0_t;
-typedef RICaction_Admitted_ItemIEs_t	 ProtocolIE_Single_Container_8810P1_t;
-typedef RICaction_NotAdmitted_ItemIEs_t	 ProtocolIE_Single_Container_8810P2_t;
-typedef RANfunction_ItemIEs_t	 ProtocolIE_Single_Container_8810P3_t;
-typedef RANfunctionID_ItemIEs_t	 ProtocolIE_Single_Container_8810P4_t;
-typedef RANfunctionIDcause_ItemIEs_t	 ProtocolIE_Single_Container_8810P5_t;
-typedef CellInformation_ItemIEs_t	 ProtocolIE_Single_Container_8810P6_t;
-typedef CellToReport_ItemIEs_t	 ProtocolIE_Single_Container_8810P7_t;
-typedef MeasurementInitiationResult_ItemIEs_t	 ProtocolIE_Single_Container_8810P8_t;
-typedef MeasurementFailureCause_ItemIEs_t	 ProtocolIE_Single_Container_8810P9_t;
-typedef CompleteFailureCauseInformation_ItemIEs_t	 ProtocolIE_Single_Container_8810P10_t;
-typedef CellMeasurementResult_ItemIEs_t	 ProtocolIE_Single_Container_8810P11_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P0;
-asn_struct_free_f ProtocolIE_Single_Container_8810P0_free;
-asn_struct_print_f ProtocolIE_Single_Container_8810P0_print;
-asn_constr_check_f ProtocolIE_Single_Container_8810P0_constraint;
-ber_type_decoder_f ProtocolIE_Single_Container_8810P0_decode_ber;
-der_type_encoder_f ProtocolIE_Single_Container_8810P0_encode_der;
-xer_type_decoder_f ProtocolIE_Single_Container_8810P0_decode_xer;
-xer_type_encoder_f ProtocolIE_Single_Container_8810P0_encode_xer;
-per_type_decoder_f ProtocolIE_Single_Container_8810P0_decode_uper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P0_encode_uper;
-per_type_decoder_f ProtocolIE_Single_Container_8810P0_decode_aper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P0_encode_aper;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P1;
-asn_struct_free_f ProtocolIE_Single_Container_8810P1_free;
-asn_struct_print_f ProtocolIE_Single_Container_8810P1_print;
-asn_constr_check_f ProtocolIE_Single_Container_8810P1_constraint;
-ber_type_decoder_f ProtocolIE_Single_Container_8810P1_decode_ber;
-der_type_encoder_f ProtocolIE_Single_Container_8810P1_encode_der;
-xer_type_decoder_f ProtocolIE_Single_Container_8810P1_decode_xer;
-xer_type_encoder_f ProtocolIE_Single_Container_8810P1_encode_xer;
-per_type_decoder_f ProtocolIE_Single_Container_8810P1_decode_uper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P1_encode_uper;
-per_type_decoder_f ProtocolIE_Single_Container_8810P1_decode_aper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P1_encode_aper;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P2;
-asn_struct_free_f ProtocolIE_Single_Container_8810P2_free;
-asn_struct_print_f ProtocolIE_Single_Container_8810P2_print;
-asn_constr_check_f ProtocolIE_Single_Container_8810P2_constraint;
-ber_type_decoder_f ProtocolIE_Single_Container_8810P2_decode_ber;
-der_type_encoder_f ProtocolIE_Single_Container_8810P2_encode_der;
-xer_type_decoder_f ProtocolIE_Single_Container_8810P2_decode_xer;
-xer_type_encoder_f ProtocolIE_Single_Container_8810P2_encode_xer;
-per_type_decoder_f ProtocolIE_Single_Container_8810P2_decode_uper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P2_encode_uper;
-per_type_decoder_f ProtocolIE_Single_Container_8810P2_decode_aper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P2_encode_aper;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P3;
-asn_struct_free_f ProtocolIE_Single_Container_8810P3_free;
-asn_struct_print_f ProtocolIE_Single_Container_8810P3_print;
-asn_constr_check_f ProtocolIE_Single_Container_8810P3_constraint;
-ber_type_decoder_f ProtocolIE_Single_Container_8810P3_decode_ber;
-der_type_encoder_f ProtocolIE_Single_Container_8810P3_encode_der;
-xer_type_decoder_f ProtocolIE_Single_Container_8810P3_decode_xer;
-xer_type_encoder_f ProtocolIE_Single_Container_8810P3_encode_xer;
-per_type_decoder_f ProtocolIE_Single_Container_8810P3_decode_uper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P3_encode_uper;
-per_type_decoder_f ProtocolIE_Single_Container_8810P3_decode_aper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P3_encode_aper;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P4;
-asn_struct_free_f ProtocolIE_Single_Container_8810P4_free;
-asn_struct_print_f ProtocolIE_Single_Container_8810P4_print;
-asn_constr_check_f ProtocolIE_Single_Container_8810P4_constraint;
-ber_type_decoder_f ProtocolIE_Single_Container_8810P4_decode_ber;
-der_type_encoder_f ProtocolIE_Single_Container_8810P4_encode_der;
-xer_type_decoder_f ProtocolIE_Single_Container_8810P4_decode_xer;
-xer_type_encoder_f ProtocolIE_Single_Container_8810P4_encode_xer;
-per_type_decoder_f ProtocolIE_Single_Container_8810P4_decode_uper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P4_encode_uper;
-per_type_decoder_f ProtocolIE_Single_Container_8810P4_decode_aper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P4_encode_aper;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P5;
-asn_struct_free_f ProtocolIE_Single_Container_8810P5_free;
-asn_struct_print_f ProtocolIE_Single_Container_8810P5_print;
-asn_constr_check_f ProtocolIE_Single_Container_8810P5_constraint;
-ber_type_decoder_f ProtocolIE_Single_Container_8810P5_decode_ber;
-der_type_encoder_f ProtocolIE_Single_Container_8810P5_encode_der;
-xer_type_decoder_f ProtocolIE_Single_Container_8810P5_decode_xer;
-xer_type_encoder_f ProtocolIE_Single_Container_8810P5_encode_xer;
-per_type_decoder_f ProtocolIE_Single_Container_8810P5_decode_uper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P5_encode_uper;
-per_type_decoder_f ProtocolIE_Single_Container_8810P5_decode_aper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P5_encode_aper;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P6;
-asn_struct_free_f ProtocolIE_Single_Container_8810P6_free;
-asn_struct_print_f ProtocolIE_Single_Container_8810P6_print;
-asn_constr_check_f ProtocolIE_Single_Container_8810P6_constraint;
-ber_type_decoder_f ProtocolIE_Single_Container_8810P6_decode_ber;
-der_type_encoder_f ProtocolIE_Single_Container_8810P6_encode_der;
-xer_type_decoder_f ProtocolIE_Single_Container_8810P6_decode_xer;
-xer_type_encoder_f ProtocolIE_Single_Container_8810P6_encode_xer;
-per_type_decoder_f ProtocolIE_Single_Container_8810P6_decode_uper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P6_encode_uper;
-per_type_decoder_f ProtocolIE_Single_Container_8810P6_decode_aper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P6_encode_aper;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P7;
-asn_struct_free_f ProtocolIE_Single_Container_8810P7_free;
-asn_struct_print_f ProtocolIE_Single_Container_8810P7_print;
-asn_constr_check_f ProtocolIE_Single_Container_8810P7_constraint;
-ber_type_decoder_f ProtocolIE_Single_Container_8810P7_decode_ber;
-der_type_encoder_f ProtocolIE_Single_Container_8810P7_encode_der;
-xer_type_decoder_f ProtocolIE_Single_Container_8810P7_decode_xer;
-xer_type_encoder_f ProtocolIE_Single_Container_8810P7_encode_xer;
-per_type_decoder_f ProtocolIE_Single_Container_8810P7_decode_uper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P7_encode_uper;
-per_type_decoder_f ProtocolIE_Single_Container_8810P7_decode_aper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P7_encode_aper;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P8;
-asn_struct_free_f ProtocolIE_Single_Container_8810P8_free;
-asn_struct_print_f ProtocolIE_Single_Container_8810P8_print;
-asn_constr_check_f ProtocolIE_Single_Container_8810P8_constraint;
-ber_type_decoder_f ProtocolIE_Single_Container_8810P8_decode_ber;
-der_type_encoder_f ProtocolIE_Single_Container_8810P8_encode_der;
-xer_type_decoder_f ProtocolIE_Single_Container_8810P8_decode_xer;
-xer_type_encoder_f ProtocolIE_Single_Container_8810P8_encode_xer;
-per_type_decoder_f ProtocolIE_Single_Container_8810P8_decode_uper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P8_encode_uper;
-per_type_decoder_f ProtocolIE_Single_Container_8810P8_decode_aper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P8_encode_aper;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P9;
-asn_struct_free_f ProtocolIE_Single_Container_8810P9_free;
-asn_struct_print_f ProtocolIE_Single_Container_8810P9_print;
-asn_constr_check_f ProtocolIE_Single_Container_8810P9_constraint;
-ber_type_decoder_f ProtocolIE_Single_Container_8810P9_decode_ber;
-der_type_encoder_f ProtocolIE_Single_Container_8810P9_encode_der;
-xer_type_decoder_f ProtocolIE_Single_Container_8810P9_decode_xer;
-xer_type_encoder_f ProtocolIE_Single_Container_8810P9_encode_xer;
-per_type_decoder_f ProtocolIE_Single_Container_8810P9_decode_uper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P9_encode_uper;
-per_type_decoder_f ProtocolIE_Single_Container_8810P9_decode_aper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P9_encode_aper;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P10;
-asn_struct_free_f ProtocolIE_Single_Container_8810P10_free;
-asn_struct_print_f ProtocolIE_Single_Container_8810P10_print;
-asn_constr_check_f ProtocolIE_Single_Container_8810P10_constraint;
-ber_type_decoder_f ProtocolIE_Single_Container_8810P10_decode_ber;
-der_type_encoder_f ProtocolIE_Single_Container_8810P10_encode_der;
-xer_type_decoder_f ProtocolIE_Single_Container_8810P10_decode_xer;
-xer_type_encoder_f ProtocolIE_Single_Container_8810P10_encode_xer;
-per_type_decoder_f ProtocolIE_Single_Container_8810P10_decode_uper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P10_encode_uper;
-per_type_decoder_f ProtocolIE_Single_Container_8810P10_decode_aper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P10_encode_aper;
-extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Single_Container_8810P11;
-asn_struct_free_f ProtocolIE_Single_Container_8810P11_free;
-asn_struct_print_f ProtocolIE_Single_Container_8810P11_print;
-asn_constr_check_f ProtocolIE_Single_Container_8810P11_constraint;
-ber_type_decoder_f ProtocolIE_Single_Container_8810P11_decode_ber;
-der_type_encoder_f ProtocolIE_Single_Container_8810P11_encode_der;
-xer_type_decoder_f ProtocolIE_Single_Container_8810P11_decode_xer;
-xer_type_encoder_f ProtocolIE_Single_Container_8810P11_encode_xer;
-per_type_decoder_f ProtocolIE_Single_Container_8810P11_decode_uper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P11_encode_uper;
-per_type_decoder_f ProtocolIE_Single_Container_8810P11_decode_aper;
-per_type_encoder_f ProtocolIE_Single_Container_8810P11_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ProtocolIE_Single_Container_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RANfunction-Item.c b/3rdparty/libe2ap/RANfunction-Item.c
deleted file mode 100644
index e9de5b7..0000000
--- a/3rdparty/libe2ap/RANfunction-Item.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RANfunction-Item.h"
-
-static asn_TYPE_member_t asn_MBR_RANfunction_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RANfunction_Item, ranFunctionID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RANfunctionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ranFunctionID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RANfunction_Item, ranFunctionDefinition),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RANfunctionDefinition,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ranFunctionDefinition"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RANfunction_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RANfunction_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranFunctionID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ranFunctionDefinition */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_RANfunction_Item_specs_1 = {
-	sizeof(struct RANfunction_Item),
-	offsetof(struct RANfunction_Item, _asn_ctx),
-	asn_MAP_RANfunction_Item_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RANfunction_Item = {
-	"RANfunction-Item",
-	"RANfunction-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RANfunction_Item_tags_1,
-	sizeof(asn_DEF_RANfunction_Item_tags_1)
-		/sizeof(asn_DEF_RANfunction_Item_tags_1[0]), /* 1 */
-	asn_DEF_RANfunction_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RANfunction_Item_tags_1)
-		/sizeof(asn_DEF_RANfunction_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RANfunction_Item_1,
-	2,	/* Elements count */
-	&asn_SPC_RANfunction_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RANfunction-Item.h b/3rdparty/libe2ap/RANfunction-Item.h
deleted file mode 100644
index 6ca4ea3..0000000
--- a/3rdparty/libe2ap/RANfunction-Item.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RANfunction_Item_H_
-#define	_RANfunction_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "RANfunctionID.h"
-#include "RANfunctionDefinition.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RANfunction-Item */
-typedef struct RANfunction_Item {
-	RANfunctionID_t	 ranFunctionID;
-	RANfunctionDefinition_t	 ranFunctionDefinition;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RANfunction_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RANfunction_Item;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RANfunction_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RANfunctionDefinition.c b/3rdparty/libe2ap/RANfunctionDefinition.c
deleted file mode 100644
index ac4127d..0000000
--- a/3rdparty/libe2ap/RANfunctionDefinition.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RANfunctionDefinition.h"
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-static const ber_tlv_tag_t asn_DEF_RANfunctionDefinition_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RANfunctionDefinition = {
-	"RANfunctionDefinition",
-	"RANfunctionDefinition",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_RANfunctionDefinition_tags_1,
-	sizeof(asn_DEF_RANfunctionDefinition_tags_1)
-		/sizeof(asn_DEF_RANfunctionDefinition_tags_1[0]), /* 1 */
-	asn_DEF_RANfunctionDefinition_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RANfunctionDefinition_tags_1)
-		/sizeof(asn_DEF_RANfunctionDefinition_tags_1[0]), /* 1 */
-	{ 0, 0, OCTET_STRING_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RANfunctionDefinition.h b/3rdparty/libe2ap/RANfunctionDefinition.h
deleted file mode 100644
index b1ea6f3..0000000
--- a/3rdparty/libe2ap/RANfunctionDefinition.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RANfunctionDefinition_H_
-#define	_RANfunctionDefinition_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RANfunctionDefinition */
-typedef OCTET_STRING_t	 RANfunctionDefinition_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RANfunctionDefinition;
-asn_struct_free_f RANfunctionDefinition_free;
-asn_struct_print_f RANfunctionDefinition_print;
-asn_constr_check_f RANfunctionDefinition_constraint;
-ber_type_decoder_f RANfunctionDefinition_decode_ber;
-der_type_encoder_f RANfunctionDefinition_encode_der;
-xer_type_decoder_f RANfunctionDefinition_decode_xer;
-xer_type_encoder_f RANfunctionDefinition_encode_xer;
-per_type_decoder_f RANfunctionDefinition_decode_uper;
-per_type_encoder_f RANfunctionDefinition_encode_uper;
-per_type_decoder_f RANfunctionDefinition_decode_aper;
-per_type_encoder_f RANfunctionDefinition_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RANfunctionDefinition_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RANfunctionID-Item.c b/3rdparty/libe2ap/RANfunctionID-Item.c
deleted file mode 100644
index 370eb41..0000000
--- a/3rdparty/libe2ap/RANfunctionID-Item.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RANfunctionID-Item.h"
-
-static asn_TYPE_member_t asn_MBR_RANfunctionID_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_Item, ranFunctionID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RANfunctionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ranFunctionID"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RANfunctionID_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RANfunctionID_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* ranFunctionID */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_RANfunctionID_Item_specs_1 = {
-	sizeof(struct RANfunctionID_Item),
-	offsetof(struct RANfunctionID_Item, _asn_ctx),
-	asn_MAP_RANfunctionID_Item_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RANfunctionID_Item = {
-	"RANfunctionID-Item",
-	"RANfunctionID-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RANfunctionID_Item_tags_1,
-	sizeof(asn_DEF_RANfunctionID_Item_tags_1)
-		/sizeof(asn_DEF_RANfunctionID_Item_tags_1[0]), /* 1 */
-	asn_DEF_RANfunctionID_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RANfunctionID_Item_tags_1)
-		/sizeof(asn_DEF_RANfunctionID_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RANfunctionID_Item_1,
-	1,	/* Elements count */
-	&asn_SPC_RANfunctionID_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RANfunctionID-Item.h b/3rdparty/libe2ap/RANfunctionID-Item.h
deleted file mode 100644
index 715aa4f..0000000
--- a/3rdparty/libe2ap/RANfunctionID-Item.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RANfunctionID_Item_H_
-#define	_RANfunctionID_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "RANfunctionID.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RANfunctionID-Item */
-typedef struct RANfunctionID_Item {
-	RANfunctionID_t	 ranFunctionID;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RANfunctionID_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RANfunctionID_Item;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RANfunctionID_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RANfunctionID.c b/3rdparty/libe2ap/RANfunctionID.c
deleted file mode 100644
index d393410..0000000
--- a/3rdparty/libe2ap/RANfunctionID.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RANfunctionID.h"
-
-int
-RANfunctionID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 4095)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_RANfunctionID_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 12,  12,  0,  4095 }	/* (0..4095) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_RANfunctionID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RANfunctionID = {
-	"RANfunctionID",
-	"RANfunctionID",
-	&asn_OP_NativeInteger,
-	asn_DEF_RANfunctionID_tags_1,
-	sizeof(asn_DEF_RANfunctionID_tags_1)
-		/sizeof(asn_DEF_RANfunctionID_tags_1[0]), /* 1 */
-	asn_DEF_RANfunctionID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RANfunctionID_tags_1)
-		/sizeof(asn_DEF_RANfunctionID_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RANfunctionID_constr_1, RANfunctionID_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/RANfunctionID.h b/3rdparty/libe2ap/RANfunctionID.h
deleted file mode 100644
index 15e0fcb..0000000
--- a/3rdparty/libe2ap/RANfunctionID.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RANfunctionID_H_
-#define	_RANfunctionID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RANfunctionID */
-typedef long	 RANfunctionID_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_RANfunctionID_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_RANfunctionID;
-asn_struct_free_f RANfunctionID_free;
-asn_struct_print_f RANfunctionID_print;
-asn_constr_check_f RANfunctionID_constraint;
-ber_type_decoder_f RANfunctionID_decode_ber;
-der_type_encoder_f RANfunctionID_encode_der;
-xer_type_decoder_f RANfunctionID_decode_xer;
-xer_type_encoder_f RANfunctionID_encode_xer;
-per_type_decoder_f RANfunctionID_decode_uper;
-per_type_encoder_f RANfunctionID_encode_uper;
-per_type_decoder_f RANfunctionID_decode_aper;
-per_type_encoder_f RANfunctionID_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RANfunctionID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RANfunctionIDcause-Item.c b/3rdparty/libe2ap/RANfunctionIDcause-Item.c
deleted file mode 100644
index 28e560d..0000000
--- a/3rdparty/libe2ap/RANfunctionIDcause-Item.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RANfunctionIDcause-Item.h"
-
-static asn_TYPE_member_t asn_MBR_RANfunctionIDcause_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_Item, ranFunctionID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RANfunctionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ranFunctionID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_Item, ricCause),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_RICcause,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ricCause"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RANfunctionIDcause_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RANfunctionIDcause_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranFunctionID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ricCause */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_RANfunctionIDcause_Item_specs_1 = {
-	sizeof(struct RANfunctionIDcause_Item),
-	offsetof(struct RANfunctionIDcause_Item, _asn_ctx),
-	asn_MAP_RANfunctionIDcause_Item_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_Item = {
-	"RANfunctionIDcause-Item",
-	"RANfunctionIDcause-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RANfunctionIDcause_Item_tags_1,
-	sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1)
-		/sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1[0]), /* 1 */
-	asn_DEF_RANfunctionIDcause_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1)
-		/sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RANfunctionIDcause_Item_1,
-	2,	/* Elements count */
-	&asn_SPC_RANfunctionIDcause_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RANfunctionIDcause-Item.h b/3rdparty/libe2ap/RANfunctionIDcause-Item.h
deleted file mode 100644
index fa9271b..0000000
--- a/3rdparty/libe2ap/RANfunctionIDcause-Item.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RANfunctionIDcause_Item_H_
-#define	_RANfunctionIDcause_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "RANfunctionID.h"
-#include "RICcause.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RANfunctionIDcause-Item */
-typedef struct RANfunctionIDcause_Item {
-	RANfunctionID_t	 ranFunctionID;
-	RICcause_t	 ricCause;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RANfunctionIDcause_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_Item;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RANfunctionIDcause_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RANfunctions-List.c b/3rdparty/libe2ap/RANfunctions-List.c
deleted file mode 100644
index 98fe612..0000000
--- a/3rdparty/libe2ap/RANfunctions-List.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RANfunctions-List.h"
-
-#include "ProtocolIE-Single-Container.h"
-static asn_per_constraints_t asn_PER_type_RANfunctions_List_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 9,  9,  0,  256 }	/* (SIZE(0..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_RANfunctions_List_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtocolIE_Single_Container_8810P3,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RANfunctions_List_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_RANfunctions_List_specs_1 = {
-	sizeof(struct RANfunctions_List),
-	offsetof(struct RANfunctions_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_RANfunctions_List = {
-	"RANfunctions-List",
-	"RANfunctions-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_RANfunctions_List_tags_1,
-	sizeof(asn_DEF_RANfunctions_List_tags_1)
-		/sizeof(asn_DEF_RANfunctions_List_tags_1[0]), /* 1 */
-	asn_DEF_RANfunctions_List_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RANfunctions_List_tags_1)
-		/sizeof(asn_DEF_RANfunctions_List_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RANfunctions_List_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_RANfunctions_List_1,
-	1,	/* Single element */
-	&asn_SPC_RANfunctions_List_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RANfunctions-List.h b/3rdparty/libe2ap/RANfunctions-List.h
deleted file mode 100644
index d9eab2f..0000000
--- a/3rdparty/libe2ap/RANfunctions-List.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RANfunctions_List_H_
-#define	_RANfunctions_List_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolIE_Single_Container;
-
-/* RANfunctions-List */
-typedef struct RANfunctions_List {
-	A_SEQUENCE_OF(struct ProtocolIE_Single_Container) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RANfunctions_List_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RANfunctions_List;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RANfunctions_List_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RANfunctionsID-List.c b/3rdparty/libe2ap/RANfunctionsID-List.c
deleted file mode 100644
index f673f6f..0000000
--- a/3rdparty/libe2ap/RANfunctionsID-List.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RANfunctionsID-List.h"
-
-#include "ProtocolIE-Single-Container.h"
-static asn_per_constraints_t asn_PER_type_RANfunctionsID_List_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 9,  9,  0,  256 }	/* (SIZE(0..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_RANfunctionsID_List_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtocolIE_Single_Container_8810P4,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RANfunctionsID_List_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_RANfunctionsID_List_specs_1 = {
-	sizeof(struct RANfunctionsID_List),
-	offsetof(struct RANfunctionsID_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_RANfunctionsID_List = {
-	"RANfunctionsID-List",
-	"RANfunctionsID-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_RANfunctionsID_List_tags_1,
-	sizeof(asn_DEF_RANfunctionsID_List_tags_1)
-		/sizeof(asn_DEF_RANfunctionsID_List_tags_1[0]), /* 1 */
-	asn_DEF_RANfunctionsID_List_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RANfunctionsID_List_tags_1)
-		/sizeof(asn_DEF_RANfunctionsID_List_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RANfunctionsID_List_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_RANfunctionsID_List_1,
-	1,	/* Single element */
-	&asn_SPC_RANfunctionsID_List_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RANfunctionsID-List.h b/3rdparty/libe2ap/RANfunctionsID-List.h
deleted file mode 100644
index ee7261a..0000000
--- a/3rdparty/libe2ap/RANfunctionsID-List.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RANfunctionsID_List_H_
-#define	_RANfunctionsID_List_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolIE_Single_Container;
-
-/* RANfunctionsID-List */
-typedef struct RANfunctionsID_List {
-	A_SEQUENCE_OF(struct ProtocolIE_Single_Container) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RANfunctionsID_List_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RANfunctionsID_List;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RANfunctionsID_List_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RANfunctionsIDcause-List.c b/3rdparty/libe2ap/RANfunctionsIDcause-List.c
deleted file mode 100644
index 54b16d1..0000000
--- a/3rdparty/libe2ap/RANfunctionsIDcause-List.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RANfunctionsIDcause-List.h"
-
-#include "ProtocolIE-Single-Container.h"
-static asn_per_constraints_t asn_PER_type_RANfunctionsIDcause_List_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 9,  9,  0,  256 }	/* (SIZE(0..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_RANfunctionsIDcause_List_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtocolIE_Single_Container_8810P5,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RANfunctionsIDcause_List_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_RANfunctionsIDcause_List_specs_1 = {
-	sizeof(struct RANfunctionsIDcause_List),
-	offsetof(struct RANfunctionsIDcause_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_RANfunctionsIDcause_List = {
-	"RANfunctionsIDcause-List",
-	"RANfunctionsIDcause-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_RANfunctionsIDcause_List_tags_1,
-	sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1)
-		/sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1[0]), /* 1 */
-	asn_DEF_RANfunctionsIDcause_List_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1)
-		/sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RANfunctionsIDcause_List_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_RANfunctionsIDcause_List_1,
-	1,	/* Single element */
-	&asn_SPC_RANfunctionsIDcause_List_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RANfunctionsIDcause-List.h b/3rdparty/libe2ap/RANfunctionsIDcause-List.h
deleted file mode 100644
index 440b295..0000000
--- a/3rdparty/libe2ap/RANfunctionsIDcause-List.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RANfunctionsIDcause_List_H_
-#define	_RANfunctionsIDcause_List_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolIE_Single_Container;
-
-/* RANfunctionsIDcause-List */
-typedef struct RANfunctionsIDcause_List {
-	A_SEQUENCE_OF(struct ProtocolIE_Single_Container) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RANfunctionsIDcause_List_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RANfunctionsIDcause_List;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RANfunctionsIDcause_List_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICInitiatingMessage.c b/3rdparty/libe2ap/RICInitiatingMessage.c
deleted file mode 100644
index 784b994..0000000
--- a/3rdparty/libe2ap/RICInitiatingMessage.c
+++ /dev/null
@@ -1,508 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Descriptions"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICInitiatingMessage.h"
-
-static const long asn_VAL_1_id_ricSubscription = 201;
-static const long asn_VAL_1_reject = 0;
-static const long asn_VAL_2_id_ricSubscriptionDelete = 202;
-static const long asn_VAL_2_reject = 0;
-static const long asn_VAL_3_id_ricServiceUpdate = 203;
-static const long asn_VAL_3_reject = 0;
-static const long asn_VAL_4_id_ricControl = 204;
-static const long asn_VAL_4_reject = 0;
-static const long asn_VAL_5_id_x2Setup = 6;
-static const long asn_VAL_5_reject = 0;
-static const long asn_VAL_6_id_endcX2Setup = 36;
-static const long asn_VAL_6_reject = 0;
-static const long asn_VAL_7_id_resourceStatusReportingInitiation = 9;
-static const long asn_VAL_7_reject = 0;
-static const long asn_VAL_8_id_eNBConfigurationUpdate = 8;
-static const long asn_VAL_8_reject = 0;
-static const long asn_VAL_9_id_endcConfigurationUpdate = 37;
-static const long asn_VAL_9_reject = 0;
-static const long asn_VAL_10_id_reset = 7;
-static const long asn_VAL_10_reject = 0;
-static const long asn_VAL_11_id_ricIndication = 205;
-static const long asn_VAL_11_ignore = 1;
-static const long asn_VAL_12_id_ricServiceQuery = 206;
-static const long asn_VAL_12_ignore = 1;
-static const long asn_VAL_13_id_loadIndication = 2;
-static const long asn_VAL_13_ignore = 1;
-static const long asn_VAL_14_id_gNBStatusIndication = 45;
-static const long asn_VAL_14_ignore = 1;
-static const long asn_VAL_15_id_resourceStatusReporting = 10;
-static const long asn_VAL_15_ignore = 1;
-static const long asn_VAL_16_id_errorIndication = 3;
-static const long asn_VAL_16_ignore = 1;
-static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = {
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionResponse },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_1_id_ricSubscription },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_1_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionDeleteRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionDeleteResponse },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionDeleteFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_2_id_ricSubscriptionDelete },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_2_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICserviceUpdate },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICserviceUpdateAcknowledge },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICserviceUpdateFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_3_id_ricServiceUpdate },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_3_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICcontrolRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICcontrolAcknowledge },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICcontrolFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_4_id_ricControl },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_4_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_X2SetupRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_X2SetupResponse },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_X2SetupFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_5_id_x2Setup },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_5_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ENDCX2SetupRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ENDCX2SetupResponse },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_ENDCX2SetupFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_6_id_endcX2Setup },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ResourceStatusRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ResourceStatusResponse },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_ResourceStatusFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_7_id_resourceStatusReportingInitiation },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ENBConfigurationUpdate },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ENBConfigurationUpdateAcknowledge },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_ENBConfigurationUpdateFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_8_id_eNBConfigurationUpdate },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ENDCConfigurationUpdate },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ENDCConfigurationUpdateAcknowledge },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_ENDCConfigurationUpdateFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_9_id_endcConfigurationUpdate },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ResetRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ResetResponse },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_10_id_reset },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_10_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICindication },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_11_id_ricIndication },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_11_ignore },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICserviceQuery },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_12_id_ricServiceQuery },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_12_ignore },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_LoadInformation },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_13_id_loadIndication },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_13_ignore },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_GNBStatusIndication },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_14_id_gNBStatusIndication },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_14_ignore },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ResourceStatusUpdate },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_15_id_resourceStatusReporting },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_15_ignore },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ErrorIndication },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_16_id_errorIndication },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_16_ignore }
-};
-static const asn_ioc_set_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1[] = {
-	{ 16, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows }
-};
-static int
-memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 255)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICInitiatingMessage_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1;
-	size_t constraining_column = 3; /* &procedureCode */
-	size_t for_column = 4; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICInitiatingMessage, procedureCode));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICInitiatingMessage_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1;
-	size_t constraining_column = 3; /* &procedureCode */
-	size_t for_column = 0; /* &InitiatingMessage */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICInitiatingMessage, procedureCode));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_per_constraints_t asn_PER_memb_procedureCode_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 8,  8,  0,  255 }	/* (0..255) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_value_4[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.RICsubscriptionRequest),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICsubscriptionRequest,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICsubscriptionRequest"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.RICsubscriptionDeleteRequest),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICsubscriptionDeleteRequest,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICsubscriptionDeleteRequest"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.RICserviceUpdate),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICserviceUpdate,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICserviceUpdate"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.RICcontrolRequest),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICcontrolRequest,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICcontrolRequest"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.X2SetupRequest),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_X2SetupRequest,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"X2SetupRequest"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.ENDCX2SetupRequest),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENDCX2SetupRequest,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ENDCX2SetupRequest"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.ResourceStatusRequest),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ResourceStatusRequest,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ResourceStatusRequest"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.ENBConfigurationUpdate),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENBConfigurationUpdate,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ENBConfigurationUpdate"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.ENDCConfigurationUpdate),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENDCConfigurationUpdate,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ENDCConfigurationUpdate"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.ResetRequest),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ResetRequest,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ResetRequest"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.RICindication),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICindication,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICindication"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.RICserviceQuery),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICserviceQuery,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICserviceQuery"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.LoadInformation),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_LoadInformation,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"LoadInformation"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.GNBStatusIndication),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_GNBStatusIndication,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"GNBStatusIndication"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.ResourceStatusUpdate),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ResourceStatusUpdate,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ResourceStatusUpdate"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage__value, choice.ErrorIndication),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ErrorIndication,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ErrorIndication"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 15 }, /* RICsubscriptionRequest */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 14 }, /* RICsubscriptionDeleteRequest */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 13 }, /* RICserviceUpdate */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 12 }, /* RICcontrolRequest */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 11 }, /* X2SetupRequest */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 5, -5, 10 }, /* ENDCX2SetupRequest */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 6, -6, 9 }, /* ResourceStatusRequest */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 7, -7, 8 }, /* ENBConfigurationUpdate */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 8, -8, 7 }, /* ENDCConfigurationUpdate */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 9, -9, 6 }, /* ResetRequest */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 10, -10, 5 }, /* RICindication */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 11, -11, 4 }, /* RICserviceQuery */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 12, -12, 3 }, /* LoadInformation */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 13, -13, 2 }, /* GNBStatusIndication */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 14, -14, 1 }, /* ResourceStatusUpdate */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 15, -15, 0 } /* ErrorIndication */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = {
-	sizeof(struct RICInitiatingMessage__value),
-	offsetof(struct RICInitiatingMessage__value, _asn_ctx),
-	offsetof(struct RICInitiatingMessage__value, present),
-	sizeof(((struct RICInitiatingMessage__value *)0)->present),
-	asn_MAP_value_tag2el_4,
-	16,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_4 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_4,
-	16,	/* Elements count */
-	&asn_SPC_value_specs_4	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICInitiatingMessage_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage, procedureCode),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProcedureCode,
-		0,
-		{ 0, &asn_PER_memb_procedureCode_constr_2,  memb_procedureCode_constraint_1 },
-		0, 0, /* No default value */
-		"procedureCode"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICInitiatingMessage_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_3,  memb_criticality_constraint_1 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICInitiatingMessage, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_4,
-		select_RICInitiatingMessage_value_type,
-		{ 0, &asn_PER_memb_value_constr_4,  memb_value_constraint_1 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICInitiatingMessage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICInitiatingMessage_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICInitiatingMessage_specs_1 = {
-	sizeof(struct RICInitiatingMessage),
-	offsetof(struct RICInitiatingMessage, _asn_ctx),
-	asn_MAP_RICInitiatingMessage_tag2el_1,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICInitiatingMessage = {
-	"RICInitiatingMessage",
-	"RICInitiatingMessage",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICInitiatingMessage_tags_1,
-	sizeof(asn_DEF_RICInitiatingMessage_tags_1)
-		/sizeof(asn_DEF_RICInitiatingMessage_tags_1[0]), /* 1 */
-	asn_DEF_RICInitiatingMessage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICInitiatingMessage_tags_1)
-		/sizeof(asn_DEF_RICInitiatingMessage_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICInitiatingMessage_1,
-	3,	/* Elements count */
-	&asn_SPC_RICInitiatingMessage_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICInitiatingMessage.h b/3rdparty/libe2ap/RICInitiatingMessage.h
deleted file mode 100644
index 87af291..0000000
--- a/3rdparty/libe2ap/RICInitiatingMessage.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Descriptions"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICInitiatingMessage_H_
-#define	_RICInitiatingMessage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProcedureCode.h"
-#include "Criticality.h"
-#include "ANY.h"
-#include "asn_ioc.h"
-#include "RICsubscriptionRequest.h"
-#include "RICsubscriptionResponse.h"
-#include "RICsubscriptionFailure.h"
-#include "RICsubscriptionDeleteRequest.h"
-#include "RICsubscriptionDeleteResponse.h"
-#include "RICsubscriptionDeleteFailure.h"
-#include "RICserviceUpdate.h"
-#include "RICserviceUpdateAcknowledge.h"
-#include "RICserviceUpdateFailure.h"
-#include "RICcontrolRequest.h"
-#include "RICcontrolAcknowledge.h"
-#include "RICcontrolFailure.h"
-#include "X2SetupRequest.h"
-#include "X2SetupResponse.h"
-#include "X2SetupFailure.h"
-#include "ENDCX2SetupRequest.h"
-#include "ENDCX2SetupResponse.h"
-#include "ENDCX2SetupFailure.h"
-#include "ResourceStatusRequest.h"
-#include "ResourceStatusResponse.h"
-#include "ResourceStatusFailure.h"
-#include "ENBConfigurationUpdate.h"
-#include "ENBConfigurationUpdateAcknowledge.h"
-#include "ENBConfigurationUpdateFailure.h"
-#include "ENDCConfigurationUpdate.h"
-#include "ENDCConfigurationUpdateAcknowledge.h"
-#include "ENDCConfigurationUpdateFailure.h"
-#include "ResetRequest.h"
-#include "ResetResponse.h"
-#include "RICindication.h"
-#include "RICserviceQuery.h"
-#include "LoadInformation.h"
-#include "GNBStatusIndication.h"
-#include "ResourceStatusUpdate.h"
-#include "ErrorIndication.h"
-#include "OPEN_TYPE.h"
-#include "constr_CHOICE.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RICInitiatingMessage__value_PR {
-	RICInitiatingMessage__value_PR_NOTHING,	/* No components present */
-	RICInitiatingMessage__value_PR_RICsubscriptionRequest,
-	RICInitiatingMessage__value_PR_RICsubscriptionDeleteRequest,
-	RICInitiatingMessage__value_PR_RICserviceUpdate,
-	RICInitiatingMessage__value_PR_RICcontrolRequest,
-	RICInitiatingMessage__value_PR_X2SetupRequest,
-	RICInitiatingMessage__value_PR_ENDCX2SetupRequest,
-	RICInitiatingMessage__value_PR_ResourceStatusRequest,
-	RICInitiatingMessage__value_PR_ENBConfigurationUpdate,
-	RICInitiatingMessage__value_PR_ENDCConfigurationUpdate,
-	RICInitiatingMessage__value_PR_ResetRequest,
-	RICInitiatingMessage__value_PR_RICindication,
-	RICInitiatingMessage__value_PR_RICserviceQuery,
-	RICInitiatingMessage__value_PR_LoadInformation,
-	RICInitiatingMessage__value_PR_GNBStatusIndication,
-	RICInitiatingMessage__value_PR_ResourceStatusUpdate,
-	RICInitiatingMessage__value_PR_ErrorIndication
-} RICInitiatingMessage__value_PR;
-
-/* RICInitiatingMessage */
-typedef struct RICInitiatingMessage {
-	ProcedureCode_t	 procedureCode;
-	Criticality_t	 criticality;
-	struct RICInitiatingMessage__value {
-		RICInitiatingMessage__value_PR present;
-		union RICInitiatingMessage__value_u {
-			RICsubscriptionRequest_t	 RICsubscriptionRequest;
-			RICsubscriptionDeleteRequest_t	 RICsubscriptionDeleteRequest;
-			RICserviceUpdate_t	 RICserviceUpdate;
-			RICcontrolRequest_t	 RICcontrolRequest;
-			X2SetupRequest_t	 X2SetupRequest;
-			ENDCX2SetupRequest_t	 ENDCX2SetupRequest;
-			ResourceStatusRequest_t	 ResourceStatusRequest;
-			ENBConfigurationUpdate_t	 ENBConfigurationUpdate;
-			ENDCConfigurationUpdate_t	 ENDCConfigurationUpdate;
-			ResetRequest_t	 ResetRequest;
-			RICindication_t	 RICindication;
-			RICserviceQuery_t	 RICserviceQuery;
-			LoadInformation_t	 LoadInformation;
-			GNBStatusIndication_t	 GNBStatusIndication;
-			ResourceStatusUpdate_t	 ResourceStatusUpdate;
-			ErrorIndication_t	 ErrorIndication;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICInitiatingMessage_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICInitiatingMessage;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICInitiatingMessage_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICInitiatingMessage_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICInitiatingMessage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICSuccessfulOutcome.c b/3rdparty/libe2ap/RICSuccessfulOutcome.c
deleted file mode 100644
index 350b0f6..0000000
--- a/3rdparty/libe2ap/RICSuccessfulOutcome.c
+++ /dev/null
@@ -1,448 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Descriptions"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICSuccessfulOutcome.h"
-
-static const long asn_VAL_1_id_ricSubscription = 201;
-static const long asn_VAL_1_reject = 0;
-static const long asn_VAL_2_id_ricSubscriptionDelete = 202;
-static const long asn_VAL_2_reject = 0;
-static const long asn_VAL_3_id_ricServiceUpdate = 203;
-static const long asn_VAL_3_reject = 0;
-static const long asn_VAL_4_id_ricControl = 204;
-static const long asn_VAL_4_reject = 0;
-static const long asn_VAL_5_id_x2Setup = 6;
-static const long asn_VAL_5_reject = 0;
-static const long asn_VAL_6_id_endcX2Setup = 36;
-static const long asn_VAL_6_reject = 0;
-static const long asn_VAL_7_id_resourceStatusReportingInitiation = 9;
-static const long asn_VAL_7_reject = 0;
-static const long asn_VAL_8_id_eNBConfigurationUpdate = 8;
-static const long asn_VAL_8_reject = 0;
-static const long asn_VAL_9_id_endcConfigurationUpdate = 37;
-static const long asn_VAL_9_reject = 0;
-static const long asn_VAL_10_id_reset = 7;
-static const long asn_VAL_10_reject = 0;
-static const long asn_VAL_11_id_ricIndication = 205;
-static const long asn_VAL_11_ignore = 1;
-static const long asn_VAL_12_id_ricServiceQuery = 206;
-static const long asn_VAL_12_ignore = 1;
-static const long asn_VAL_13_id_loadIndication = 2;
-static const long asn_VAL_13_ignore = 1;
-static const long asn_VAL_14_id_gNBStatusIndication = 45;
-static const long asn_VAL_14_ignore = 1;
-static const long asn_VAL_15_id_resourceStatusReporting = 10;
-static const long asn_VAL_15_ignore = 1;
-static const long asn_VAL_16_id_errorIndication = 3;
-static const long asn_VAL_16_ignore = 1;
-static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = {
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionResponse },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_1_id_ricSubscription },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_1_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionDeleteRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionDeleteResponse },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionDeleteFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_2_id_ricSubscriptionDelete },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_2_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICserviceUpdate },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICserviceUpdateAcknowledge },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICserviceUpdateFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_3_id_ricServiceUpdate },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_3_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICcontrolRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICcontrolAcknowledge },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICcontrolFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_4_id_ricControl },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_4_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_X2SetupRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_X2SetupResponse },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_X2SetupFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_5_id_x2Setup },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_5_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ENDCX2SetupRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ENDCX2SetupResponse },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_ENDCX2SetupFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_6_id_endcX2Setup },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ResourceStatusRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ResourceStatusResponse },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_ResourceStatusFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_7_id_resourceStatusReportingInitiation },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ENBConfigurationUpdate },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ENBConfigurationUpdateAcknowledge },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_ENBConfigurationUpdateFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_8_id_eNBConfigurationUpdate },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ENDCConfigurationUpdate },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ENDCConfigurationUpdateAcknowledge },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_ENDCConfigurationUpdateFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_9_id_endcConfigurationUpdate },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ResetRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ResetResponse },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_10_id_reset },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_10_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICindication },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_11_id_ricIndication },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_11_ignore },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICserviceQuery },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_12_id_ricServiceQuery },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_12_ignore },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_LoadInformation },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_13_id_loadIndication },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_13_ignore },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_GNBStatusIndication },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_14_id_gNBStatusIndication },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_14_ignore },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ResourceStatusUpdate },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_15_id_resourceStatusReporting },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_15_ignore },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ErrorIndication },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_16_id_errorIndication },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_16_ignore }
-};
-static const asn_ioc_set_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1[] = {
-	{ 16, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows }
-};
-static int
-memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 255)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICSuccessfulOutcome_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1;
-	size_t constraining_column = 3; /* &procedureCode */
-	size_t for_column = 4; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICSuccessfulOutcome, procedureCode));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICSuccessfulOutcome_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1;
-	size_t constraining_column = 3; /* &procedureCode */
-	size_t for_column = 1; /* &SuccessfulOutcome */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICSuccessfulOutcome, procedureCode));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_per_constraints_t asn_PER_memb_procedureCode_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 8,  8,  0,  255 }	/* (0..255) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_value_4[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICSuccessfulOutcome__value, choice.RICsubscriptionResponse),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICsubscriptionResponse,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICsubscriptionResponse"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICSuccessfulOutcome__value, choice.RICsubscriptionDeleteResponse),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICsubscriptionDeleteResponse,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICsubscriptionDeleteResponse"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICSuccessfulOutcome__value, choice.RICserviceUpdateAcknowledge),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICserviceUpdateAcknowledge,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICserviceUpdateAcknowledge"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICSuccessfulOutcome__value, choice.RICcontrolAcknowledge),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICcontrolAcknowledge,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICcontrolAcknowledge"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICSuccessfulOutcome__value, choice.X2SetupResponse),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_X2SetupResponse,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"X2SetupResponse"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICSuccessfulOutcome__value, choice.ENDCX2SetupResponse),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENDCX2SetupResponse,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ENDCX2SetupResponse"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICSuccessfulOutcome__value, choice.ResourceStatusResponse),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ResourceStatusResponse,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ResourceStatusResponse"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICSuccessfulOutcome__value, choice.ENBConfigurationUpdateAcknowledge),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENBConfigurationUpdateAcknowledge,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ENBConfigurationUpdateAcknowledge"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICSuccessfulOutcome__value, choice.ENDCConfigurationUpdateAcknowledge),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENDCConfigurationUpdateAcknowledge,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ENDCConfigurationUpdateAcknowledge"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICSuccessfulOutcome__value, choice.ResetResponse),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ResetResponse,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ResetResponse"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 9 }, /* RICsubscriptionResponse */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 8 }, /* RICsubscriptionDeleteResponse */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 7 }, /* RICserviceUpdateAcknowledge */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 6 }, /* RICcontrolAcknowledge */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 5 }, /* X2SetupResponse */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 5, -5, 4 }, /* ENDCX2SetupResponse */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 6, -6, 3 }, /* ResourceStatusResponse */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 7, -7, 2 }, /* ENBConfigurationUpdateAcknowledge */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 8, -8, 1 }, /* ENDCConfigurationUpdateAcknowledge */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 9, -9, 0 } /* ResetResponse */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = {
-	sizeof(struct RICSuccessfulOutcome__value),
-	offsetof(struct RICSuccessfulOutcome__value, _asn_ctx),
-	offsetof(struct RICSuccessfulOutcome__value, present),
-	sizeof(((struct RICSuccessfulOutcome__value *)0)->present),
-	asn_MAP_value_tag2el_4,
-	10,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_4 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_4,
-	10,	/* Elements count */
-	&asn_SPC_value_specs_4	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICSuccessfulOutcome_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICSuccessfulOutcome, procedureCode),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProcedureCode,
-		0,
-		{ 0, &asn_PER_memb_procedureCode_constr_2,  memb_procedureCode_constraint_1 },
-		0, 0, /* No default value */
-		"procedureCode"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICSuccessfulOutcome, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICSuccessfulOutcome_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_3,  memb_criticality_constraint_1 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICSuccessfulOutcome, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_4,
-		select_RICSuccessfulOutcome_value_type,
-		{ 0, &asn_PER_memb_value_constr_4,  memb_value_constraint_1 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICSuccessfulOutcome_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICSuccessfulOutcome_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICSuccessfulOutcome_specs_1 = {
-	sizeof(struct RICSuccessfulOutcome),
-	offsetof(struct RICSuccessfulOutcome, _asn_ctx),
-	asn_MAP_RICSuccessfulOutcome_tag2el_1,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICSuccessfulOutcome = {
-	"RICSuccessfulOutcome",
-	"RICSuccessfulOutcome",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICSuccessfulOutcome_tags_1,
-	sizeof(asn_DEF_RICSuccessfulOutcome_tags_1)
-		/sizeof(asn_DEF_RICSuccessfulOutcome_tags_1[0]), /* 1 */
-	asn_DEF_RICSuccessfulOutcome_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICSuccessfulOutcome_tags_1)
-		/sizeof(asn_DEF_RICSuccessfulOutcome_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICSuccessfulOutcome_1,
-	3,	/* Elements count */
-	&asn_SPC_RICSuccessfulOutcome_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICSuccessfulOutcome.h b/3rdparty/libe2ap/RICSuccessfulOutcome.h
deleted file mode 100644
index 88d62af..0000000
--- a/3rdparty/libe2ap/RICSuccessfulOutcome.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Descriptions"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICSuccessfulOutcome_H_
-#define	_RICSuccessfulOutcome_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProcedureCode.h"
-#include "Criticality.h"
-#include "ANY.h"
-#include "asn_ioc.h"
-#include "RICsubscriptionRequest.h"
-#include "RICsubscriptionResponse.h"
-#include "RICsubscriptionFailure.h"
-#include "RICsubscriptionDeleteRequest.h"
-#include "RICsubscriptionDeleteResponse.h"
-#include "RICsubscriptionDeleteFailure.h"
-#include "RICserviceUpdate.h"
-#include "RICserviceUpdateAcknowledge.h"
-#include "RICserviceUpdateFailure.h"
-#include "RICcontrolRequest.h"
-#include "RICcontrolAcknowledge.h"
-#include "RICcontrolFailure.h"
-#include "X2SetupRequest.h"
-#include "X2SetupResponse.h"
-#include "X2SetupFailure.h"
-#include "ENDCX2SetupRequest.h"
-#include "ENDCX2SetupResponse.h"
-#include "ENDCX2SetupFailure.h"
-#include "ResourceStatusRequest.h"
-#include "ResourceStatusResponse.h"
-#include "ResourceStatusFailure.h"
-#include "ENBConfigurationUpdate.h"
-#include "ENBConfigurationUpdateAcknowledge.h"
-#include "ENBConfigurationUpdateFailure.h"
-#include "ENDCConfigurationUpdate.h"
-#include "ENDCConfigurationUpdateAcknowledge.h"
-#include "ENDCConfigurationUpdateFailure.h"
-#include "ResetRequest.h"
-#include "ResetResponse.h"
-#include "RICindication.h"
-#include "RICserviceQuery.h"
-#include "LoadInformation.h"
-#include "GNBStatusIndication.h"
-#include "ResourceStatusUpdate.h"
-#include "ErrorIndication.h"
-#include "OPEN_TYPE.h"
-#include "constr_CHOICE.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RICSuccessfulOutcome__value_PR {
-	RICSuccessfulOutcome__value_PR_NOTHING,	/* No components present */
-	RICSuccessfulOutcome__value_PR_RICsubscriptionResponse,
-	RICSuccessfulOutcome__value_PR_RICsubscriptionDeleteResponse,
-	RICSuccessfulOutcome__value_PR_RICserviceUpdateAcknowledge,
-	RICSuccessfulOutcome__value_PR_RICcontrolAcknowledge,
-	RICSuccessfulOutcome__value_PR_X2SetupResponse,
-	RICSuccessfulOutcome__value_PR_ENDCX2SetupResponse,
-	RICSuccessfulOutcome__value_PR_ResourceStatusResponse,
-	RICSuccessfulOutcome__value_PR_ENBConfigurationUpdateAcknowledge,
-	RICSuccessfulOutcome__value_PR_ENDCConfigurationUpdateAcknowledge,
-	RICSuccessfulOutcome__value_PR_ResetResponse
-} RICSuccessfulOutcome__value_PR;
-
-/* RICSuccessfulOutcome */
-typedef struct RICSuccessfulOutcome {
-	ProcedureCode_t	 procedureCode;
-	Criticality_t	 criticality;
-	struct RICSuccessfulOutcome__value {
-		RICSuccessfulOutcome__value_PR present;
-		union RICSuccessfulOutcome__value_u {
-			RICsubscriptionResponse_t	 RICsubscriptionResponse;
-			RICsubscriptionDeleteResponse_t	 RICsubscriptionDeleteResponse;
-			RICserviceUpdateAcknowledge_t	 RICserviceUpdateAcknowledge;
-			RICcontrolAcknowledge_t	 RICcontrolAcknowledge;
-			X2SetupResponse_t	 X2SetupResponse;
-			ENDCX2SetupResponse_t	 ENDCX2SetupResponse;
-			ResourceStatusResponse_t	 ResourceStatusResponse;
-			ENBConfigurationUpdateAcknowledge_t	 ENBConfigurationUpdateAcknowledge;
-			ENDCConfigurationUpdateAcknowledge_t	 ENDCConfigurationUpdateAcknowledge;
-			ResetResponse_t	 ResetResponse;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICSuccessfulOutcome_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICSuccessfulOutcome;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICSuccessfulOutcome_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICSuccessfulOutcome_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICSuccessfulOutcome_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICUnsuccessfulOutcome.c b/3rdparty/libe2ap/RICUnsuccessfulOutcome.c
deleted file mode 100644
index a71c709..0000000
--- a/3rdparty/libe2ap/RICUnsuccessfulOutcome.c
+++ /dev/null
@@ -1,438 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Descriptions"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICUnsuccessfulOutcome.h"
-
-static const long asn_VAL_1_id_ricSubscription = 201;
-static const long asn_VAL_1_reject = 0;
-static const long asn_VAL_2_id_ricSubscriptionDelete = 202;
-static const long asn_VAL_2_reject = 0;
-static const long asn_VAL_3_id_ricServiceUpdate = 203;
-static const long asn_VAL_3_reject = 0;
-static const long asn_VAL_4_id_ricControl = 204;
-static const long asn_VAL_4_reject = 0;
-static const long asn_VAL_5_id_x2Setup = 6;
-static const long asn_VAL_5_reject = 0;
-static const long asn_VAL_6_id_endcX2Setup = 36;
-static const long asn_VAL_6_reject = 0;
-static const long asn_VAL_7_id_resourceStatusReportingInitiation = 9;
-static const long asn_VAL_7_reject = 0;
-static const long asn_VAL_8_id_eNBConfigurationUpdate = 8;
-static const long asn_VAL_8_reject = 0;
-static const long asn_VAL_9_id_endcConfigurationUpdate = 37;
-static const long asn_VAL_9_reject = 0;
-static const long asn_VAL_10_id_reset = 7;
-static const long asn_VAL_10_reject = 0;
-static const long asn_VAL_11_id_ricIndication = 205;
-static const long asn_VAL_11_ignore = 1;
-static const long asn_VAL_12_id_ricServiceQuery = 206;
-static const long asn_VAL_12_ignore = 1;
-static const long asn_VAL_13_id_loadIndication = 2;
-static const long asn_VAL_13_ignore = 1;
-static const long asn_VAL_14_id_gNBStatusIndication = 45;
-static const long asn_VAL_14_ignore = 1;
-static const long asn_VAL_15_id_resourceStatusReporting = 10;
-static const long asn_VAL_15_ignore = 1;
-static const long asn_VAL_16_id_errorIndication = 3;
-static const long asn_VAL_16_ignore = 1;
-static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = {
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionResponse },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_1_id_ricSubscription },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_1_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICsubscriptionDeleteRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionDeleteResponse },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICsubscriptionDeleteFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_2_id_ricSubscriptionDelete },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_2_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICserviceUpdate },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICserviceUpdateAcknowledge },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICserviceUpdateFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_3_id_ricServiceUpdate },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_3_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICcontrolRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_RICcontrolAcknowledge },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_RICcontrolFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_4_id_ricControl },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_4_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_X2SetupRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_X2SetupResponse },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_X2SetupFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_5_id_x2Setup },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_5_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ENDCX2SetupRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ENDCX2SetupResponse },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_ENDCX2SetupFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_6_id_endcX2Setup },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ResourceStatusRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ResourceStatusResponse },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_ResourceStatusFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_7_id_resourceStatusReportingInitiation },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ENBConfigurationUpdate },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ENBConfigurationUpdateAcknowledge },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_ENBConfigurationUpdateFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_8_id_eNBConfigurationUpdate },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ENDCConfigurationUpdate },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ENDCConfigurationUpdateAcknowledge },
-	{ "&UnsuccessfulOutcome", aioc__type, &asn_DEF_ENDCConfigurationUpdateFailure },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_9_id_endcConfigurationUpdate },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ResetRequest },
-	{ "&SuccessfulOutcome", aioc__type, &asn_DEF_ResetResponse },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_10_id_reset },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_10_reject },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICindication },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_11_id_ricIndication },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_11_ignore },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_RICserviceQuery },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_12_id_ricServiceQuery },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_12_ignore },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_LoadInformation },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_13_id_loadIndication },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_13_ignore },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_GNBStatusIndication },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_14_id_gNBStatusIndication },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_14_ignore },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ResourceStatusUpdate },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_15_id_resourceStatusReporting },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_15_ignore },
-	{ "&InitiatingMessage", aioc__type, &asn_DEF_ErrorIndication },
-	{ "&SuccessfulOutcome",  },
-	{ "&UnsuccessfulOutcome",  },
-	{ "&procedureCode", aioc__value, &asn_DEF_ProcedureCode, &asn_VAL_16_id_errorIndication },
-	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_16_ignore }
-};
-static const asn_ioc_set_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1[] = {
-	{ 16, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows }
-};
-static int
-memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 255)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_type_selector_result_t
-select_RICUnsuccessfulOutcome_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1;
-	size_t constraining_column = 3; /* &procedureCode */
-	size_t for_column = 4; /* &criticality */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICUnsuccessfulOutcome, procedureCode));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_type_selector_result_t
-select_RICUnsuccessfulOutcome_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
-	asn_type_selector_result_t result = {0, 0};
-	const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1;
-	size_t constraining_column = 3; /* &procedureCode */
-	size_t for_column = 2; /* &UnsuccessfulOutcome */
-	size_t row, presence_index = 0;
-	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICUnsuccessfulOutcome, procedureCode));
-	
-	for(row=0; row < itable->rows_count; row++) {
-	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
-	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
-	
-	    if(type_cell->cell_kind == aioc__undefined)
-	        continue;
-	
-	    presence_index++;
-	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
-	        result.type_descriptor = type_cell->type_descriptor;
-	        result.presence_index = presence_index;
-	        break;
-	    }
-	}
-	
-	return result;
-}
-
-static int
-memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	if(1 /* No applicable constraints whatsoever */) {
-		/* Nothing is here. See below */
-	}
-	
-	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
-}
-
-static asn_per_constraints_t asn_PER_memb_procedureCode_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 8,  8,  0,  255 }	/* (0..255) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_value_4[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICUnsuccessfulOutcome__value, choice.RICsubscriptionFailure),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICsubscriptionFailure,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICsubscriptionFailure"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICUnsuccessfulOutcome__value, choice.RICsubscriptionDeleteFailure),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICsubscriptionDeleteFailure,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICsubscriptionDeleteFailure"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICUnsuccessfulOutcome__value, choice.RICserviceUpdateFailure),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICserviceUpdateFailure,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICserviceUpdateFailure"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICUnsuccessfulOutcome__value, choice.RICcontrolFailure),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_RICcontrolFailure,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"RICcontrolFailure"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICUnsuccessfulOutcome__value, choice.X2SetupFailure),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_X2SetupFailure,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"X2SetupFailure"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICUnsuccessfulOutcome__value, choice.ENDCX2SetupFailure),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENDCX2SetupFailure,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ENDCX2SetupFailure"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICUnsuccessfulOutcome__value, choice.ResourceStatusFailure),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ResourceStatusFailure,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ResourceStatusFailure"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICUnsuccessfulOutcome__value, choice.ENBConfigurationUpdateFailure),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENBConfigurationUpdateFailure,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ENBConfigurationUpdateFailure"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICUnsuccessfulOutcome__value, choice.ENDCConfigurationUpdateFailure),
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ENDCConfigurationUpdateFailure,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ENDCConfigurationUpdateFailure"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = {
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 8 }, /* RICsubscriptionFailure */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 7 }, /* RICsubscriptionDeleteFailure */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 6 }, /* RICserviceUpdateFailure */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 5 }, /* RICcontrolFailure */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 4 }, /* X2SetupFailure */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 5, -5, 3 }, /* ENDCX2SetupFailure */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 6, -6, 2 }, /* ResourceStatusFailure */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 7, -7, 1 }, /* ENBConfigurationUpdateFailure */
-    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 8, -8, 0 } /* ENDCConfigurationUpdateFailure */
-};
-static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = {
-	sizeof(struct RICUnsuccessfulOutcome__value),
-	offsetof(struct RICUnsuccessfulOutcome__value, _asn_ctx),
-	offsetof(struct RICUnsuccessfulOutcome__value, present),
-	sizeof(((struct RICUnsuccessfulOutcome__value *)0)->present),
-	asn_MAP_value_tag2el_4,
-	9,	/* Count of tags in the map */
-	0, 0,
-	-1	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_value_4 = {
-	"value",
-	"value",
-	&asn_OP_OPEN_TYPE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, 0, OPEN_TYPE_constraint },
-	asn_MBR_value_4,
-	9,	/* Elements count */
-	&asn_SPC_value_specs_4	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RICUnsuccessfulOutcome_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICUnsuccessfulOutcome, procedureCode),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProcedureCode,
-		0,
-		{ 0, &asn_PER_memb_procedureCode_constr_2,  memb_procedureCode_constraint_1 },
-		0, 0, /* No default value */
-		"procedureCode"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICUnsuccessfulOutcome, criticality),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Criticality,
-		select_RICUnsuccessfulOutcome_criticality_type,
-		{ 0, &asn_PER_memb_criticality_constr_3,  memb_criticality_constraint_1 },
-		0, 0, /* No default value */
-		"criticality"
-		},
-	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICUnsuccessfulOutcome, value),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_value_4,
-		select_RICUnsuccessfulOutcome_value_type,
-		{ 0, &asn_PER_memb_value_constr_4,  memb_value_constraint_1 },
-		0, 0, /* No default value */
-		"value"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICUnsuccessfulOutcome_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICUnsuccessfulOutcome_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICUnsuccessfulOutcome_specs_1 = {
-	sizeof(struct RICUnsuccessfulOutcome),
-	offsetof(struct RICUnsuccessfulOutcome, _asn_ctx),
-	asn_MAP_RICUnsuccessfulOutcome_tag2el_1,
-	3,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	-1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICUnsuccessfulOutcome = {
-	"RICUnsuccessfulOutcome",
-	"RICUnsuccessfulOutcome",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICUnsuccessfulOutcome_tags_1,
-	sizeof(asn_DEF_RICUnsuccessfulOutcome_tags_1)
-		/sizeof(asn_DEF_RICUnsuccessfulOutcome_tags_1[0]), /* 1 */
-	asn_DEF_RICUnsuccessfulOutcome_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICUnsuccessfulOutcome_tags_1)
-		/sizeof(asn_DEF_RICUnsuccessfulOutcome_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICUnsuccessfulOutcome_1,
-	3,	/* Elements count */
-	&asn_SPC_RICUnsuccessfulOutcome_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICUnsuccessfulOutcome.h b/3rdparty/libe2ap/RICUnsuccessfulOutcome.h
deleted file mode 100644
index 154962e..0000000
--- a/3rdparty/libe2ap/RICUnsuccessfulOutcome.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Descriptions"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICUnsuccessfulOutcome_H_
-#define	_RICUnsuccessfulOutcome_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProcedureCode.h"
-#include "Criticality.h"
-#include "ANY.h"
-#include "asn_ioc.h"
-#include "RICsubscriptionRequest.h"
-#include "RICsubscriptionResponse.h"
-#include "RICsubscriptionFailure.h"
-#include "RICsubscriptionDeleteRequest.h"
-#include "RICsubscriptionDeleteResponse.h"
-#include "RICsubscriptionDeleteFailure.h"
-#include "RICserviceUpdate.h"
-#include "RICserviceUpdateAcknowledge.h"
-#include "RICserviceUpdateFailure.h"
-#include "RICcontrolRequest.h"
-#include "RICcontrolAcknowledge.h"
-#include "RICcontrolFailure.h"
-#include "X2SetupRequest.h"
-#include "X2SetupResponse.h"
-#include "X2SetupFailure.h"
-#include "ENDCX2SetupRequest.h"
-#include "ENDCX2SetupResponse.h"
-#include "ENDCX2SetupFailure.h"
-#include "ResourceStatusRequest.h"
-#include "ResourceStatusResponse.h"
-#include "ResourceStatusFailure.h"
-#include "ENBConfigurationUpdate.h"
-#include "ENBConfigurationUpdateAcknowledge.h"
-#include "ENBConfigurationUpdateFailure.h"
-#include "ENDCConfigurationUpdate.h"
-#include "ENDCConfigurationUpdateAcknowledge.h"
-#include "ENDCConfigurationUpdateFailure.h"
-#include "ResetRequest.h"
-#include "ResetResponse.h"
-#include "RICindication.h"
-#include "RICserviceQuery.h"
-#include "LoadInformation.h"
-#include "GNBStatusIndication.h"
-#include "ResourceStatusUpdate.h"
-#include "ErrorIndication.h"
-#include "OPEN_TYPE.h"
-#include "constr_CHOICE.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RICUnsuccessfulOutcome__value_PR {
-	RICUnsuccessfulOutcome__value_PR_NOTHING,	/* No components present */
-	RICUnsuccessfulOutcome__value_PR_RICsubscriptionFailure,
-	RICUnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure,
-	RICUnsuccessfulOutcome__value_PR_RICserviceUpdateFailure,
-	RICUnsuccessfulOutcome__value_PR_RICcontrolFailure,
-	RICUnsuccessfulOutcome__value_PR_X2SetupFailure,
-	RICUnsuccessfulOutcome__value_PR_ENDCX2SetupFailure,
-	RICUnsuccessfulOutcome__value_PR_ResourceStatusFailure,
-	RICUnsuccessfulOutcome__value_PR_ENBConfigurationUpdateFailure,
-	RICUnsuccessfulOutcome__value_PR_ENDCConfigurationUpdateFailure
-} RICUnsuccessfulOutcome__value_PR;
-
-/* RICUnsuccessfulOutcome */
-typedef struct RICUnsuccessfulOutcome {
-	ProcedureCode_t	 procedureCode;
-	Criticality_t	 criticality;
-	struct RICUnsuccessfulOutcome__value {
-		RICUnsuccessfulOutcome__value_PR present;
-		union RICUnsuccessfulOutcome__value_u {
-			RICsubscriptionFailure_t	 RICsubscriptionFailure;
-			RICsubscriptionDeleteFailure_t	 RICsubscriptionDeleteFailure;
-			RICserviceUpdateFailure_t	 RICserviceUpdateFailure;
-			RICcontrolFailure_t	 RICcontrolFailure;
-			X2SetupFailure_t	 X2SetupFailure;
-			ENDCX2SetupFailure_t	 ENDCX2SetupFailure;
-			ResourceStatusFailure_t	 ResourceStatusFailure;
-			ENBConfigurationUpdateFailure_t	 ENBConfigurationUpdateFailure;
-			ENDCConfigurationUpdateFailure_t	 ENDCConfigurationUpdateFailure;
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} value;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICUnsuccessfulOutcome_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICUnsuccessfulOutcome;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICUnsuccessfulOutcome_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICUnsuccessfulOutcome_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICUnsuccessfulOutcome_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICaction-Admitted-Item.c b/3rdparty/libe2ap/RICaction-Admitted-Item.c
deleted file mode 100644
index 67d0c92..0000000
--- a/3rdparty/libe2ap/RICaction-Admitted-Item.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICaction-Admitted-Item.h"
-
-static asn_TYPE_member_t asn_MBR_RICaction_Admitted_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_Item, ricActionID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RICactionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ricActionID"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICaction_Admitted_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICaction_Admitted_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* ricActionID */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_RICaction_Admitted_Item_specs_1 = {
-	sizeof(struct RICaction_Admitted_Item),
-	offsetof(struct RICaction_Admitted_Item, _asn_ctx),
-	asn_MAP_RICaction_Admitted_Item_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_Item = {
-	"RICaction-Admitted-Item",
-	"RICaction-Admitted-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICaction_Admitted_Item_tags_1,
-	sizeof(asn_DEF_RICaction_Admitted_Item_tags_1)
-		/sizeof(asn_DEF_RICaction_Admitted_Item_tags_1[0]), /* 1 */
-	asn_DEF_RICaction_Admitted_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICaction_Admitted_Item_tags_1)
-		/sizeof(asn_DEF_RICaction_Admitted_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICaction_Admitted_Item_1,
-	1,	/* Elements count */
-	&asn_SPC_RICaction_Admitted_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICaction-Admitted-Item.h b/3rdparty/libe2ap/RICaction-Admitted-Item.h
deleted file mode 100644
index 7dede37..0000000
--- a/3rdparty/libe2ap/RICaction-Admitted-Item.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICaction_Admitted_Item_H_
-#define	_RICaction_Admitted_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "RICactionID.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICaction-Admitted-Item */
-typedef struct RICaction_Admitted_Item {
-	RICactionID_t	 ricActionID;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICaction_Admitted_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_Item;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICaction_Admitted_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICaction-Admitted-List.c b/3rdparty/libe2ap/RICaction-Admitted-List.c
deleted file mode 100644
index 85f54e2..0000000
--- a/3rdparty/libe2ap/RICaction-Admitted-List.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICaction-Admitted-List.h"
-
-#include "ProtocolIE-Single-Container.h"
-static asn_per_constraints_t asn_PER_type_RICaction_Admitted_List_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 4,  4,  1,  16 }	/* (SIZE(1..16)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_RICaction_Admitted_List_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtocolIE_Single_Container_8810P1,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICaction_Admitted_List_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_RICaction_Admitted_List_specs_1 = {
-	sizeof(struct RICaction_Admitted_List),
-	offsetof(struct RICaction_Admitted_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_List = {
-	"RICaction-Admitted-List",
-	"RICaction-Admitted-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_RICaction_Admitted_List_tags_1,
-	sizeof(asn_DEF_RICaction_Admitted_List_tags_1)
-		/sizeof(asn_DEF_RICaction_Admitted_List_tags_1[0]), /* 1 */
-	asn_DEF_RICaction_Admitted_List_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICaction_Admitted_List_tags_1)
-		/sizeof(asn_DEF_RICaction_Admitted_List_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RICaction_Admitted_List_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_RICaction_Admitted_List_1,
-	1,	/* Single element */
-	&asn_SPC_RICaction_Admitted_List_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICaction-Admitted-List.h b/3rdparty/libe2ap/RICaction-Admitted-List.h
deleted file mode 100644
index 476b31d..0000000
--- a/3rdparty/libe2ap/RICaction-Admitted-List.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICaction_Admitted_List_H_
-#define	_RICaction_Admitted_List_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolIE_Single_Container;
-
-/* RICaction-Admitted-List */
-typedef struct RICaction_Admitted_List {
-	A_SEQUENCE_OF(struct ProtocolIE_Single_Container) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICaction_Admitted_List_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_List;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICaction_Admitted_List_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICaction-NotAdmitted-Item.c b/3rdparty/libe2ap/RICaction-NotAdmitted-Item.c
deleted file mode 100644
index 0033ad6..0000000
--- a/3rdparty/libe2ap/RICaction-NotAdmitted-Item.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICaction-NotAdmitted-Item.h"
-
-static asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_Item, ricActionID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RICactionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ricActionID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_Item, ricCause),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_RICcause,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ricCause"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICaction_NotAdmitted_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICaction_NotAdmitted_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricActionID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ricCause */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_RICaction_NotAdmitted_Item_specs_1 = {
-	sizeof(struct RICaction_NotAdmitted_Item),
-	offsetof(struct RICaction_NotAdmitted_Item, _asn_ctx),
-	asn_MAP_RICaction_NotAdmitted_Item_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_Item = {
-	"RICaction-NotAdmitted-Item",
-	"RICaction-NotAdmitted-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICaction_NotAdmitted_Item_tags_1,
-	sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1)
-		/sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1[0]), /* 1 */
-	asn_DEF_RICaction_NotAdmitted_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1)
-		/sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICaction_NotAdmitted_Item_1,
-	2,	/* Elements count */
-	&asn_SPC_RICaction_NotAdmitted_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICaction-NotAdmitted-Item.h b/3rdparty/libe2ap/RICaction-NotAdmitted-Item.h
deleted file mode 100644
index 060488c..0000000
--- a/3rdparty/libe2ap/RICaction-NotAdmitted-Item.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICaction_NotAdmitted_Item_H_
-#define	_RICaction_NotAdmitted_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "RICactionID.h"
-#include "RICcause.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICaction-NotAdmitted-Item */
-typedef struct RICaction_NotAdmitted_Item {
-	RICactionID_t	 ricActionID;
-	RICcause_t	 ricCause;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICaction_NotAdmitted_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_Item;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICaction_NotAdmitted_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICaction-NotAdmitted-List.c b/3rdparty/libe2ap/RICaction-NotAdmitted-List.c
deleted file mode 100644
index e9f0334..0000000
--- a/3rdparty/libe2ap/RICaction-NotAdmitted-List.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICaction-NotAdmitted-List.h"
-
-#include "ProtocolIE-Single-Container.h"
-static asn_per_constraints_t asn_PER_type_RICaction_NotAdmitted_List_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 5,  5,  0,  16 }	/* (SIZE(0..16)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_List_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtocolIE_Single_Container_8810P2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICaction_NotAdmitted_List_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_RICaction_NotAdmitted_List_specs_1 = {
-	sizeof(struct RICaction_NotAdmitted_List),
-	offsetof(struct RICaction_NotAdmitted_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_List = {
-	"RICaction-NotAdmitted-List",
-	"RICaction-NotAdmitted-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_RICaction_NotAdmitted_List_tags_1,
-	sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1)
-		/sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1[0]), /* 1 */
-	asn_DEF_RICaction_NotAdmitted_List_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1)
-		/sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RICaction_NotAdmitted_List_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_RICaction_NotAdmitted_List_1,
-	1,	/* Single element */
-	&asn_SPC_RICaction_NotAdmitted_List_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICaction-NotAdmitted-List.h b/3rdparty/libe2ap/RICaction-NotAdmitted-List.h
deleted file mode 100644
index 14c7c4b..0000000
--- a/3rdparty/libe2ap/RICaction-NotAdmitted-List.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICaction_NotAdmitted_List_H_
-#define	_RICaction_NotAdmitted_List_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolIE_Single_Container;
-
-/* RICaction-NotAdmitted-List */
-typedef struct RICaction_NotAdmitted_List {
-	A_SEQUENCE_OF(struct ProtocolIE_Single_Container) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICaction_NotAdmitted_List_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_List;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICaction_NotAdmitted_List_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICaction-ToBeSetup-Item.c b/3rdparty/libe2ap/RICaction-ToBeSetup-Item.c
deleted file mode 100644
index 06a039b..0000000
--- a/3rdparty/libe2ap/RICaction-ToBeSetup-Item.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICaction-ToBeSetup-Item.h"
-
-#include "RICsubsequentAction.h"
-static asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_Item, ricActionID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RICactionID,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ricActionID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_Item, ricActionType),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RICactionType,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ricActionType"
-		},
-	{ ATF_POINTER, 2, offsetof(struct RICaction_ToBeSetup_Item, ricActionDefinition),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RICactionDefinition,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ricActionDefinition"
-		},
-	{ ATF_POINTER, 1, offsetof(struct RICaction_ToBeSetup_Item, ricSubsequentAction),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RICsubsequentAction,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ricSubsequentAction"
-		},
-};
-static const int asn_MAP_RICaction_ToBeSetup_Item_oms_1[] = { 2, 3 };
-static const ber_tlv_tag_t asn_DEF_RICaction_ToBeSetup_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICaction_ToBeSetup_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricActionID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ricActionType */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ricActionDefinition */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* ricSubsequentAction */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_RICaction_ToBeSetup_Item_specs_1 = {
-	sizeof(struct RICaction_ToBeSetup_Item),
-	offsetof(struct RICaction_ToBeSetup_Item, _asn_ctx),
-	asn_MAP_RICaction_ToBeSetup_Item_tag2el_1,
-	4,	/* Count of tags in the map */
-	asn_MAP_RICaction_ToBeSetup_Item_oms_1,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_Item = {
-	"RICaction-ToBeSetup-Item",
-	"RICaction-ToBeSetup-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICaction_ToBeSetup_Item_tags_1,
-	sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1)
-		/sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1[0]), /* 1 */
-	asn_DEF_RICaction_ToBeSetup_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1)
-		/sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICaction_ToBeSetup_Item_1,
-	4,	/* Elements count */
-	&asn_SPC_RICaction_ToBeSetup_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICaction-ToBeSetup-Item.h b/3rdparty/libe2ap/RICaction-ToBeSetup-Item.h
deleted file mode 100644
index f16fcc8..0000000
--- a/3rdparty/libe2ap/RICaction-ToBeSetup-Item.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICaction_ToBeSetup_Item_H_
-#define	_RICaction_ToBeSetup_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "RICactionID.h"
-#include "RICactionType.h"
-#include "RICactionDefinition.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct RICsubsequentAction;
-
-/* RICaction-ToBeSetup-Item */
-typedef struct RICaction_ToBeSetup_Item {
-	RICactionID_t	 ricActionID;
-	RICactionType_t	 ricActionType;
-	RICactionDefinition_t	*ricActionDefinition;	/* OPTIONAL */
-	struct RICsubsequentAction	*ricSubsequentAction;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICaction_ToBeSetup_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_Item;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICaction_ToBeSetup_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICactionDefinition.c b/3rdparty/libe2ap/RICactionDefinition.c
deleted file mode 100644
index 6d92365..0000000
--- a/3rdparty/libe2ap/RICactionDefinition.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICactionDefinition.h"
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-static const ber_tlv_tag_t asn_DEF_RICactionDefinition_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RICactionDefinition = {
-	"RICactionDefinition",
-	"RICactionDefinition",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_RICactionDefinition_tags_1,
-	sizeof(asn_DEF_RICactionDefinition_tags_1)
-		/sizeof(asn_DEF_RICactionDefinition_tags_1[0]), /* 1 */
-	asn_DEF_RICactionDefinition_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICactionDefinition_tags_1)
-		/sizeof(asn_DEF_RICactionDefinition_tags_1[0]), /* 1 */
-	{ 0, 0, OCTET_STRING_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICactionDefinition.h b/3rdparty/libe2ap/RICactionDefinition.h
deleted file mode 100644
index 56ee56c..0000000
--- a/3rdparty/libe2ap/RICactionDefinition.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICactionDefinition_H_
-#define	_RICactionDefinition_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICactionDefinition */
-typedef OCTET_STRING_t	 RICactionDefinition_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICactionDefinition;
-asn_struct_free_f RICactionDefinition_free;
-asn_struct_print_f RICactionDefinition_print;
-asn_constr_check_f RICactionDefinition_constraint;
-ber_type_decoder_f RICactionDefinition_decode_ber;
-der_type_encoder_f RICactionDefinition_encode_der;
-xer_type_decoder_f RICactionDefinition_decode_xer;
-xer_type_encoder_f RICactionDefinition_encode_xer;
-per_type_decoder_f RICactionDefinition_decode_uper;
-per_type_encoder_f RICactionDefinition_encode_uper;
-per_type_decoder_f RICactionDefinition_decode_aper;
-per_type_encoder_f RICactionDefinition_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICactionDefinition_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICactionID.c b/3rdparty/libe2ap/RICactionID.c
deleted file mode 100644
index ce51b5e..0000000
--- a/3rdparty/libe2ap/RICactionID.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICactionID.h"
-
-int
-RICactionID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 255)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_RICactionID_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 8,  8,  0,  255 }	/* (0..255) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_RICactionID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RICactionID = {
-	"RICactionID",
-	"RICactionID",
-	&asn_OP_NativeInteger,
-	asn_DEF_RICactionID_tags_1,
-	sizeof(asn_DEF_RICactionID_tags_1)
-		/sizeof(asn_DEF_RICactionID_tags_1[0]), /* 1 */
-	asn_DEF_RICactionID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICactionID_tags_1)
-		/sizeof(asn_DEF_RICactionID_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RICactionID_constr_1, RICactionID_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/RICactionID.h b/3rdparty/libe2ap/RICactionID.h
deleted file mode 100644
index ac4f35e..0000000
--- a/3rdparty/libe2ap/RICactionID.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICactionID_H_
-#define	_RICactionID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICactionID */
-typedef long	 RICactionID_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_RICactionID_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_RICactionID;
-asn_struct_free_f RICactionID_free;
-asn_struct_print_f RICactionID_print;
-asn_constr_check_f RICactionID_constraint;
-ber_type_decoder_f RICactionID_decode_ber;
-der_type_encoder_f RICactionID_encode_der;
-xer_type_decoder_f RICactionID_decode_xer;
-xer_type_encoder_f RICactionID_encode_xer;
-per_type_decoder_f RICactionID_decode_uper;
-per_type_encoder_f RICactionID_encode_uper;
-per_type_decoder_f RICactionID_decode_aper;
-per_type_encoder_f RICactionID_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICactionID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICactionType.c b/3rdparty/libe2ap/RICactionType.c
deleted file mode 100644
index 51a56d8..0000000
--- a/3rdparty/libe2ap/RICactionType.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICactionType.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_RICactionType_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_RICactionType_value2enum_1[] = {
-	{ 0,	6,	"report" },
-	{ 1,	6,	"insert" },
-	{ 2,	6,	"policy" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_RICactionType_enum2value_1[] = {
-	1,	/* insert(1) */
-	2,	/* policy(2) */
-	0	/* report(0) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_RICactionType_specs_1 = {
-	asn_MAP_RICactionType_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_RICactionType_enum2value_1,	/* N => "tag"; sorted by N */
-	3,	/* Number of elements in the maps */
-	4,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_RICactionType_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RICactionType = {
-	"RICactionType",
-	"RICactionType",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_RICactionType_tags_1,
-	sizeof(asn_DEF_RICactionType_tags_1)
-		/sizeof(asn_DEF_RICactionType_tags_1[0]), /* 1 */
-	asn_DEF_RICactionType_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICactionType_tags_1)
-		/sizeof(asn_DEF_RICactionType_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RICactionType_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_RICactionType_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICactionType.h b/3rdparty/libe2ap/RICactionType.h
deleted file mode 100644
index e22c470..0000000
--- a/3rdparty/libe2ap/RICactionType.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICactionType_H_
-#define	_RICactionType_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RICactionType {
-	RICactionType_report	= 0,
-	RICactionType_insert	= 1,
-	RICactionType_policy	= 2
-	/*
-	 * Enumeration is extensible
-	 */
-} e_RICactionType;
-
-/* RICactionType */
-typedef long	 RICactionType_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_RICactionType_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_RICactionType;
-extern const asn_INTEGER_specifics_t asn_SPC_RICactionType_specs_1;
-asn_struct_free_f RICactionType_free;
-asn_struct_print_f RICactionType_print;
-asn_constr_check_f RICactionType_constraint;
-ber_type_decoder_f RICactionType_decode_ber;
-der_type_encoder_f RICactionType_encode_der;
-xer_type_decoder_f RICactionType_decode_xer;
-xer_type_encoder_f RICactionType_encode_xer;
-per_type_decoder_f RICactionType_decode_uper;
-per_type_encoder_f RICactionType_encode_uper;
-per_type_decoder_f RICactionType_decode_aper;
-per_type_encoder_f RICactionType_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICactionType_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICactions-ToBeSetup-List.c b/3rdparty/libe2ap/RICactions-ToBeSetup-List.c
deleted file mode 100644
index 6855e64..0000000
--- a/3rdparty/libe2ap/RICactions-ToBeSetup-List.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICactions-ToBeSetup-List.h"
-
-#include "ProtocolIE-Single-Container.h"
-asn_per_constraints_t asn_PER_type_RICactions_ToBeSetup_List_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 4,  4,  1,  16 }	/* (SIZE(1..16)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_RICactions_ToBeSetup_List_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ProtocolIE_Single_Container_8810P0,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICactions_ToBeSetup_List_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_RICactions_ToBeSetup_List_specs_1 = {
-	sizeof(struct RICactions_ToBeSetup_List),
-	offsetof(struct RICactions_ToBeSetup_List, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_RICactions_ToBeSetup_List = {
-	"RICactions-ToBeSetup-List",
-	"RICactions-ToBeSetup-List",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_RICactions_ToBeSetup_List_tags_1,
-	sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1)
-		/sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1[0]), /* 1 */
-	asn_DEF_RICactions_ToBeSetup_List_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1)
-		/sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RICactions_ToBeSetup_List_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_RICactions_ToBeSetup_List_1,
-	1,	/* Single element */
-	&asn_SPC_RICactions_ToBeSetup_List_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICactions-ToBeSetup-List.h b/3rdparty/libe2ap/RICactions-ToBeSetup-List.h
deleted file mode 100644
index d00a769..0000000
--- a/3rdparty/libe2ap/RICactions-ToBeSetup-List.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICactions_ToBeSetup_List_H_
-#define	_RICactions_ToBeSetup_List_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolIE_Single_Container;
-
-/* RICactions-ToBeSetup-List */
-typedef struct RICactions_ToBeSetup_List {
-	A_SEQUENCE_OF(struct ProtocolIE_Single_Container) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICactions_ToBeSetup_List_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICactions_ToBeSetup_List;
-extern asn_SET_OF_specifics_t asn_SPC_RICactions_ToBeSetup_List_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICactions_ToBeSetup_List_1[1];
-extern asn_per_constraints_t asn_PER_type_RICactions_ToBeSetup_List_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICactions_ToBeSetup_List_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICcallProcessID.c b/3rdparty/libe2ap/RICcallProcessID.c
deleted file mode 100644
index 609fa11..0000000
--- a/3rdparty/libe2ap/RICcallProcessID.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICcallProcessID.h"
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-static const ber_tlv_tag_t asn_DEF_RICcallProcessID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RICcallProcessID = {
-	"RICcallProcessID",
-	"RICcallProcessID",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_RICcallProcessID_tags_1,
-	sizeof(asn_DEF_RICcallProcessID_tags_1)
-		/sizeof(asn_DEF_RICcallProcessID_tags_1[0]), /* 1 */
-	asn_DEF_RICcallProcessID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICcallProcessID_tags_1)
-		/sizeof(asn_DEF_RICcallProcessID_tags_1[0]), /* 1 */
-	{ 0, 0, OCTET_STRING_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICcallProcessID.h b/3rdparty/libe2ap/RICcallProcessID.h
deleted file mode 100644
index b6f22e9..0000000
--- a/3rdparty/libe2ap/RICcallProcessID.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICcallProcessID_H_
-#define	_RICcallProcessID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICcallProcessID */
-typedef OCTET_STRING_t	 RICcallProcessID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICcallProcessID;
-asn_struct_free_f RICcallProcessID_free;
-asn_struct_print_f RICcallProcessID_print;
-asn_constr_check_f RICcallProcessID_constraint;
-ber_type_decoder_f RICcallProcessID_decode_ber;
-der_type_encoder_f RICcallProcessID_encode_der;
-xer_type_decoder_f RICcallProcessID_decode_xer;
-xer_type_encoder_f RICcallProcessID_encode_xer;
-per_type_decoder_f RICcallProcessID_decode_uper;
-per_type_encoder_f RICcallProcessID_encode_uper;
-per_type_decoder_f RICcallProcessID_decode_aper;
-per_type_encoder_f RICcallProcessID_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICcallProcessID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICcause.c b/3rdparty/libe2ap/RICcause.c
deleted file mode 100644
index 52d4cd2..0000000
--- a/3rdparty/libe2ap/RICcause.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICcause.h"
-
-asn_per_constraints_t asn_PER_type_RICcause_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  4 }	/* (0..4,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_RICcause_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcause, choice.radioNetwork),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CauseRadioNetwork,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"radioNetwork"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcause, choice.transport),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CauseTransport,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"transport"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcause, choice.protocol),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CauseProtocol,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocol"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcause, choice.misc),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CauseMisc,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"misc"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcause, choice.ric),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CauseRIC,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ric"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICcause_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* radioNetwork */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* transport */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* protocol */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* misc */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* ric */
-};
-asn_CHOICE_specifics_t asn_SPC_RICcause_specs_1 = {
-	sizeof(struct RICcause),
-	offsetof(struct RICcause, _asn_ctx),
-	offsetof(struct RICcause, present),
-	sizeof(((struct RICcause *)0)->present),
-	asn_MAP_RICcause_tag2el_1,
-	5,	/* Count of tags in the map */
-	0, 0,
-	5	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_RICcause = {
-	"RICcause",
-	"RICcause",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_RICcause_constr_1, CHOICE_constraint },
-	asn_MBR_RICcause_1,
-	5,	/* Elements count */
-	&asn_SPC_RICcause_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICcause.h b/3rdparty/libe2ap/RICcause.h
deleted file mode 100644
index 0cb9ebe..0000000
--- a/3rdparty/libe2ap/RICcause.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICcause_H_
-#define	_RICcause_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "CauseRadioNetwork.h"
-#include "CauseTransport.h"
-#include "CauseProtocol.h"
-#include "CauseMisc.h"
-#include "CauseRIC.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RICcause_PR {
-	RICcause_PR_NOTHING,	/* No components present */
-	RICcause_PR_radioNetwork,
-	RICcause_PR_transport,
-	RICcause_PR_protocol,
-	RICcause_PR_misc,
-	RICcause_PR_ric
-	/* Extensions may appear below */
-	
-} RICcause_PR;
-
-/* RICcause */
-typedef struct RICcause {
-	RICcause_PR present;
-	union RICcause_u {
-		CauseRadioNetwork_t	 radioNetwork;
-		CauseTransport_t	 transport;
-		CauseProtocol_t	 protocol;
-		CauseMisc_t	 misc;
-		CauseRIC_t	 ric;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICcause_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICcause;
-extern asn_CHOICE_specifics_t asn_SPC_RICcause_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICcause_1[5];
-extern asn_per_constraints_t asn_PER_type_RICcause_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICcause_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICcontrolAckRequest.c b/3rdparty/libe2ap/RICcontrolAckRequest.c
deleted file mode 100644
index badcd75..0000000
--- a/3rdparty/libe2ap/RICcontrolAckRequest.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICcontrolAckRequest.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_RICcontrolAckRequest_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_RICcontrolAckRequest_value2enum_1[] = {
-	{ 0,	5,	"noAck" },
-	{ 1,	3,	"ack" },
-	{ 2,	4,	"nAck" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_RICcontrolAckRequest_enum2value_1[] = {
-	1,	/* ack(1) */
-	2,	/* nAck(2) */
-	0	/* noAck(0) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_RICcontrolAckRequest_specs_1 = {
-	asn_MAP_RICcontrolAckRequest_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_RICcontrolAckRequest_enum2value_1,	/* N => "tag"; sorted by N */
-	3,	/* Number of elements in the maps */
-	4,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_RICcontrolAckRequest_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RICcontrolAckRequest = {
-	"RICcontrolAckRequest",
-	"RICcontrolAckRequest",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_RICcontrolAckRequest_tags_1,
-	sizeof(asn_DEF_RICcontrolAckRequest_tags_1)
-		/sizeof(asn_DEF_RICcontrolAckRequest_tags_1[0]), /* 1 */
-	asn_DEF_RICcontrolAckRequest_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICcontrolAckRequest_tags_1)
-		/sizeof(asn_DEF_RICcontrolAckRequest_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RICcontrolAckRequest_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_RICcontrolAckRequest_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICcontrolAckRequest.h b/3rdparty/libe2ap/RICcontrolAckRequest.h
deleted file mode 100644
index e6d1f70..0000000
--- a/3rdparty/libe2ap/RICcontrolAckRequest.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICcontrolAckRequest_H_
-#define	_RICcontrolAckRequest_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RICcontrolAckRequest {
-	RICcontrolAckRequest_noAck	= 0,
-	RICcontrolAckRequest_ack	= 1,
-	RICcontrolAckRequest_nAck	= 2
-	/*
-	 * Enumeration is extensible
-	 */
-} e_RICcontrolAckRequest;
-
-/* RICcontrolAckRequest */
-typedef long	 RICcontrolAckRequest_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICcontrolAckRequest;
-asn_struct_free_f RICcontrolAckRequest_free;
-asn_struct_print_f RICcontrolAckRequest_print;
-asn_constr_check_f RICcontrolAckRequest_constraint;
-ber_type_decoder_f RICcontrolAckRequest_decode_ber;
-der_type_encoder_f RICcontrolAckRequest_encode_der;
-xer_type_decoder_f RICcontrolAckRequest_decode_xer;
-xer_type_encoder_f RICcontrolAckRequest_encode_xer;
-per_type_decoder_f RICcontrolAckRequest_decode_uper;
-per_type_encoder_f RICcontrolAckRequest_encode_uper;
-per_type_decoder_f RICcontrolAckRequest_decode_aper;
-per_type_encoder_f RICcontrolAckRequest_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICcontrolAckRequest_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICcontrolAcknowledge.c b/3rdparty/libe2ap/RICcontrolAcknowledge.c
deleted file mode 100644
index b5b85c8..0000000
--- a/3rdparty/libe2ap/RICcontrolAcknowledge.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICcontrolAcknowledge.h"
-
-asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P8,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICcontrolAcknowledge_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICcontrolAcknowledge_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_specs_1 = {
-	sizeof(struct RICcontrolAcknowledge),
-	offsetof(struct RICcontrolAcknowledge, _asn_ctx),
-	asn_MAP_RICcontrolAcknowledge_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge = {
-	"RICcontrolAcknowledge",
-	"RICcontrolAcknowledge",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICcontrolAcknowledge_tags_1,
-	sizeof(asn_DEF_RICcontrolAcknowledge_tags_1)
-		/sizeof(asn_DEF_RICcontrolAcknowledge_tags_1[0]), /* 1 */
-	asn_DEF_RICcontrolAcknowledge_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICcontrolAcknowledge_tags_1)
-		/sizeof(asn_DEF_RICcontrolAcknowledge_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICcontrolAcknowledge_1,
-	1,	/* Elements count */
-	&asn_SPC_RICcontrolAcknowledge_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICcontrolAcknowledge.h b/3rdparty/libe2ap/RICcontrolAcknowledge.h
deleted file mode 100644
index 7710758..0000000
--- a/3rdparty/libe2ap/RICcontrolAcknowledge.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICcontrolAcknowledge_H_
-#define	_RICcontrolAcknowledge_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICcontrolAcknowledge */
-typedef struct RICcontrolAcknowledge {
-	ProtocolIE_Container_8807P8_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICcontrolAcknowledge_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICcontrolAcknowledge_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICcontrolFailure.c b/3rdparty/libe2ap/RICcontrolFailure.c
deleted file mode 100644
index defe962..0000000
--- a/3rdparty/libe2ap/RICcontrolFailure.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICcontrolFailure.h"
-
-asn_TYPE_member_t asn_MBR_RICcontrolFailure_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P9,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICcontrolFailure_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICcontrolFailure_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_specs_1 = {
-	sizeof(struct RICcontrolFailure),
-	offsetof(struct RICcontrolFailure, _asn_ctx),
-	asn_MAP_RICcontrolFailure_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure = {
-	"RICcontrolFailure",
-	"RICcontrolFailure",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICcontrolFailure_tags_1,
-	sizeof(asn_DEF_RICcontrolFailure_tags_1)
-		/sizeof(asn_DEF_RICcontrolFailure_tags_1[0]), /* 1 */
-	asn_DEF_RICcontrolFailure_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICcontrolFailure_tags_1)
-		/sizeof(asn_DEF_RICcontrolFailure_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICcontrolFailure_1,
-	1,	/* Elements count */
-	&asn_SPC_RICcontrolFailure_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICcontrolFailure.h b/3rdparty/libe2ap/RICcontrolFailure.h
deleted file mode 100644
index a52a3af..0000000
--- a/3rdparty/libe2ap/RICcontrolFailure.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICcontrolFailure_H_
-#define	_RICcontrolFailure_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICcontrolFailure */
-typedef struct RICcontrolFailure {
-	ProtocolIE_Container_8807P9_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICcontrolFailure_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICcontrolFailure_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICcontrolFailure_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICcontrolHeader.c b/3rdparty/libe2ap/RICcontrolHeader.c
deleted file mode 100644
index ef42e27..0000000
--- a/3rdparty/libe2ap/RICcontrolHeader.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICcontrolHeader.h"
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-static const ber_tlv_tag_t asn_DEF_RICcontrolHeader_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RICcontrolHeader = {
-	"RICcontrolHeader",
-	"RICcontrolHeader",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_RICcontrolHeader_tags_1,
-	sizeof(asn_DEF_RICcontrolHeader_tags_1)
-		/sizeof(asn_DEF_RICcontrolHeader_tags_1[0]), /* 1 */
-	asn_DEF_RICcontrolHeader_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICcontrolHeader_tags_1)
-		/sizeof(asn_DEF_RICcontrolHeader_tags_1[0]), /* 1 */
-	{ 0, 0, OCTET_STRING_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICcontrolHeader.h b/3rdparty/libe2ap/RICcontrolHeader.h
deleted file mode 100644
index a729331..0000000
--- a/3rdparty/libe2ap/RICcontrolHeader.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICcontrolHeader_H_
-#define	_RICcontrolHeader_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICcontrolHeader */
-typedef OCTET_STRING_t	 RICcontrolHeader_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICcontrolHeader;
-asn_struct_free_f RICcontrolHeader_free;
-asn_struct_print_f RICcontrolHeader_print;
-asn_constr_check_f RICcontrolHeader_constraint;
-ber_type_decoder_f RICcontrolHeader_decode_ber;
-der_type_encoder_f RICcontrolHeader_encode_der;
-xer_type_decoder_f RICcontrolHeader_decode_xer;
-xer_type_encoder_f RICcontrolHeader_encode_xer;
-per_type_decoder_f RICcontrolHeader_decode_uper;
-per_type_encoder_f RICcontrolHeader_encode_uper;
-per_type_decoder_f RICcontrolHeader_decode_aper;
-per_type_encoder_f RICcontrolHeader_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICcontrolHeader_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICcontrolMessage.c b/3rdparty/libe2ap/RICcontrolMessage.c
deleted file mode 100644
index b2b5b76..0000000
--- a/3rdparty/libe2ap/RICcontrolMessage.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICcontrolMessage.h"
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-static const ber_tlv_tag_t asn_DEF_RICcontrolMessage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RICcontrolMessage = {
-	"RICcontrolMessage",
-	"RICcontrolMessage",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_RICcontrolMessage_tags_1,
-	sizeof(asn_DEF_RICcontrolMessage_tags_1)
-		/sizeof(asn_DEF_RICcontrolMessage_tags_1[0]), /* 1 */
-	asn_DEF_RICcontrolMessage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICcontrolMessage_tags_1)
-		/sizeof(asn_DEF_RICcontrolMessage_tags_1[0]), /* 1 */
-	{ 0, 0, OCTET_STRING_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICcontrolMessage.h b/3rdparty/libe2ap/RICcontrolMessage.h
deleted file mode 100644
index e62a3b9..0000000
--- a/3rdparty/libe2ap/RICcontrolMessage.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICcontrolMessage_H_
-#define	_RICcontrolMessage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICcontrolMessage */
-typedef OCTET_STRING_t	 RICcontrolMessage_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICcontrolMessage;
-asn_struct_free_f RICcontrolMessage_free;
-asn_struct_print_f RICcontrolMessage_print;
-asn_constr_check_f RICcontrolMessage_constraint;
-ber_type_decoder_f RICcontrolMessage_decode_ber;
-der_type_encoder_f RICcontrolMessage_encode_der;
-xer_type_decoder_f RICcontrolMessage_decode_xer;
-xer_type_encoder_f RICcontrolMessage_encode_xer;
-per_type_decoder_f RICcontrolMessage_decode_uper;
-per_type_encoder_f RICcontrolMessage_encode_uper;
-per_type_decoder_f RICcontrolMessage_decode_aper;
-per_type_encoder_f RICcontrolMessage_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICcontrolMessage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICcontrolRequest.c b/3rdparty/libe2ap/RICcontrolRequest.c
deleted file mode 100644
index eec2ce1..0000000
--- a/3rdparty/libe2ap/RICcontrolRequest.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICcontrolRequest.h"
-
-asn_TYPE_member_t asn_MBR_RICcontrolRequest_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P7,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICcontrolRequest_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICcontrolRequest_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_specs_1 = {
-	sizeof(struct RICcontrolRequest),
-	offsetof(struct RICcontrolRequest, _asn_ctx),
-	asn_MAP_RICcontrolRequest_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest = {
-	"RICcontrolRequest",
-	"RICcontrolRequest",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICcontrolRequest_tags_1,
-	sizeof(asn_DEF_RICcontrolRequest_tags_1)
-		/sizeof(asn_DEF_RICcontrolRequest_tags_1[0]), /* 1 */
-	asn_DEF_RICcontrolRequest_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICcontrolRequest_tags_1)
-		/sizeof(asn_DEF_RICcontrolRequest_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICcontrolRequest_1,
-	1,	/* Elements count */
-	&asn_SPC_RICcontrolRequest_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICcontrolRequest.h b/3rdparty/libe2ap/RICcontrolRequest.h
deleted file mode 100644
index 93dba67..0000000
--- a/3rdparty/libe2ap/RICcontrolRequest.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICcontrolRequest_H_
-#define	_RICcontrolRequest_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICcontrolRequest */
-typedef struct RICcontrolRequest {
-	ProtocolIE_Container_8807P7_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICcontrolRequest_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICcontrolRequest_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICcontrolRequest_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICcontrolStatus.c b/3rdparty/libe2ap/RICcontrolStatus.c
deleted file mode 100644
index 5549be4..0000000
--- a/3rdparty/libe2ap/RICcontrolStatus.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICcontrolStatus.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_RICcontrolStatus_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_RICcontrolStatus_value2enum_1[] = {
-	{ 0,	7,	"success" },
-	{ 1,	8,	"rejected" },
-	{ 2,	6,	"failed" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_RICcontrolStatus_enum2value_1[] = {
-	2,	/* failed(2) */
-	1,	/* rejected(1) */
-	0	/* success(0) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_RICcontrolStatus_specs_1 = {
-	asn_MAP_RICcontrolStatus_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_RICcontrolStatus_enum2value_1,	/* N => "tag"; sorted by N */
-	3,	/* Number of elements in the maps */
-	4,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_RICcontrolStatus_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RICcontrolStatus = {
-	"RICcontrolStatus",
-	"RICcontrolStatus",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_RICcontrolStatus_tags_1,
-	sizeof(asn_DEF_RICcontrolStatus_tags_1)
-		/sizeof(asn_DEF_RICcontrolStatus_tags_1[0]), /* 1 */
-	asn_DEF_RICcontrolStatus_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICcontrolStatus_tags_1)
-		/sizeof(asn_DEF_RICcontrolStatus_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RICcontrolStatus_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_RICcontrolStatus_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICcontrolStatus.h b/3rdparty/libe2ap/RICcontrolStatus.h
deleted file mode 100644
index 590c9b9..0000000
--- a/3rdparty/libe2ap/RICcontrolStatus.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICcontrolStatus_H_
-#define	_RICcontrolStatus_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RICcontrolStatus {
-	RICcontrolStatus_success	= 0,
-	RICcontrolStatus_rejected	= 1,
-	RICcontrolStatus_failed	= 2
-	/*
-	 * Enumeration is extensible
-	 */
-} e_RICcontrolStatus;
-
-/* RICcontrolStatus */
-typedef long	 RICcontrolStatus_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICcontrolStatus;
-asn_struct_free_f RICcontrolStatus_free;
-asn_struct_print_f RICcontrolStatus_print;
-asn_constr_check_f RICcontrolStatus_constraint;
-ber_type_decoder_f RICcontrolStatus_decode_ber;
-der_type_encoder_f RICcontrolStatus_encode_der;
-xer_type_decoder_f RICcontrolStatus_decode_xer;
-xer_type_encoder_f RICcontrolStatus_encode_xer;
-per_type_decoder_f RICcontrolStatus_decode_uper;
-per_type_encoder_f RICcontrolStatus_encode_uper;
-per_type_decoder_f RICcontrolStatus_decode_aper;
-per_type_encoder_f RICcontrolStatus_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICcontrolStatus_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICeventTriggerDefinition.c b/3rdparty/libe2ap/RICeventTriggerDefinition.c
deleted file mode 100644
index bd8e1a5..0000000
--- a/3rdparty/libe2ap/RICeventTriggerDefinition.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICeventTriggerDefinition.h"
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-static const ber_tlv_tag_t asn_DEF_RICeventTriggerDefinition_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RICeventTriggerDefinition = {
-	"RICeventTriggerDefinition",
-	"RICeventTriggerDefinition",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_RICeventTriggerDefinition_tags_1,
-	sizeof(asn_DEF_RICeventTriggerDefinition_tags_1)
-		/sizeof(asn_DEF_RICeventTriggerDefinition_tags_1[0]), /* 1 */
-	asn_DEF_RICeventTriggerDefinition_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICeventTriggerDefinition_tags_1)
-		/sizeof(asn_DEF_RICeventTriggerDefinition_tags_1[0]), /* 1 */
-	{ 0, 0, OCTET_STRING_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICeventTriggerDefinition.h b/3rdparty/libe2ap/RICeventTriggerDefinition.h
deleted file mode 100644
index 00197b1..0000000
--- a/3rdparty/libe2ap/RICeventTriggerDefinition.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICeventTriggerDefinition_H_
-#define	_RICeventTriggerDefinition_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICeventTriggerDefinition */
-typedef OCTET_STRING_t	 RICeventTriggerDefinition_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICeventTriggerDefinition;
-asn_struct_free_f RICeventTriggerDefinition_free;
-asn_struct_print_f RICeventTriggerDefinition_print;
-asn_constr_check_f RICeventTriggerDefinition_constraint;
-ber_type_decoder_f RICeventTriggerDefinition_decode_ber;
-der_type_encoder_f RICeventTriggerDefinition_encode_der;
-xer_type_decoder_f RICeventTriggerDefinition_decode_xer;
-xer_type_encoder_f RICeventTriggerDefinition_encode_xer;
-per_type_decoder_f RICeventTriggerDefinition_decode_uper;
-per_type_encoder_f RICeventTriggerDefinition_encode_uper;
-per_type_decoder_f RICeventTriggerDefinition_decode_aper;
-per_type_encoder_f RICeventTriggerDefinition_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICeventTriggerDefinition_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICindication.c b/3rdparty/libe2ap/RICindication.c
deleted file mode 100644
index 86d17bf..0000000
--- a/3rdparty/libe2ap/RICindication.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICindication.h"
-
-asn_TYPE_member_t asn_MBR_RICindication_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICindication, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P6,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICindication_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICindication_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICindication_specs_1 = {
-	sizeof(struct RICindication),
-	offsetof(struct RICindication, _asn_ctx),
-	asn_MAP_RICindication_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICindication = {
-	"RICindication",
-	"RICindication",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICindication_tags_1,
-	sizeof(asn_DEF_RICindication_tags_1)
-		/sizeof(asn_DEF_RICindication_tags_1[0]), /* 1 */
-	asn_DEF_RICindication_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICindication_tags_1)
-		/sizeof(asn_DEF_RICindication_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICindication_1,
-	1,	/* Elements count */
-	&asn_SPC_RICindication_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICindication.h b/3rdparty/libe2ap/RICindication.h
deleted file mode 100644
index bb597e0..0000000
--- a/3rdparty/libe2ap/RICindication.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICindication_H_
-#define	_RICindication_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICindication */
-typedef struct RICindication {
-	ProtocolIE_Container_8807P6_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICindication_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICindication;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICindication_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICindication_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICindication_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICindicationHeader.c b/3rdparty/libe2ap/RICindicationHeader.c
deleted file mode 100644
index ad2a4b6..0000000
--- a/3rdparty/libe2ap/RICindicationHeader.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICindicationHeader.h"
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-static const ber_tlv_tag_t asn_DEF_RICindicationHeader_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RICindicationHeader = {
-	"RICindicationHeader",
-	"RICindicationHeader",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_RICindicationHeader_tags_1,
-	sizeof(asn_DEF_RICindicationHeader_tags_1)
-		/sizeof(asn_DEF_RICindicationHeader_tags_1[0]), /* 1 */
-	asn_DEF_RICindicationHeader_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICindicationHeader_tags_1)
-		/sizeof(asn_DEF_RICindicationHeader_tags_1[0]), /* 1 */
-	{ 0, 0, OCTET_STRING_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICindicationHeader.h b/3rdparty/libe2ap/RICindicationHeader.h
deleted file mode 100644
index b15236a..0000000
--- a/3rdparty/libe2ap/RICindicationHeader.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICindicationHeader_H_
-#define	_RICindicationHeader_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICindicationHeader */
-typedef OCTET_STRING_t	 RICindicationHeader_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICindicationHeader;
-asn_struct_free_f RICindicationHeader_free;
-asn_struct_print_f RICindicationHeader_print;
-asn_constr_check_f RICindicationHeader_constraint;
-ber_type_decoder_f RICindicationHeader_decode_ber;
-der_type_encoder_f RICindicationHeader_encode_der;
-xer_type_decoder_f RICindicationHeader_decode_xer;
-xer_type_encoder_f RICindicationHeader_encode_xer;
-per_type_decoder_f RICindicationHeader_decode_uper;
-per_type_encoder_f RICindicationHeader_encode_uper;
-per_type_decoder_f RICindicationHeader_decode_aper;
-per_type_encoder_f RICindicationHeader_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICindicationHeader_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICindicationMessage.c b/3rdparty/libe2ap/RICindicationMessage.c
deleted file mode 100644
index 0e35d94..0000000
--- a/3rdparty/libe2ap/RICindicationMessage.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICindicationMessage.h"
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-static const ber_tlv_tag_t asn_DEF_RICindicationMessage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RICindicationMessage = {
-	"RICindicationMessage",
-	"RICindicationMessage",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_RICindicationMessage_tags_1,
-	sizeof(asn_DEF_RICindicationMessage_tags_1)
-		/sizeof(asn_DEF_RICindicationMessage_tags_1[0]), /* 1 */
-	asn_DEF_RICindicationMessage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICindicationMessage_tags_1)
-		/sizeof(asn_DEF_RICindicationMessage_tags_1[0]), /* 1 */
-	{ 0, 0, OCTET_STRING_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICindicationMessage.h b/3rdparty/libe2ap/RICindicationMessage.h
deleted file mode 100644
index 0676ce7..0000000
--- a/3rdparty/libe2ap/RICindicationMessage.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICindicationMessage_H_
-#define	_RICindicationMessage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICindicationMessage */
-typedef OCTET_STRING_t	 RICindicationMessage_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICindicationMessage;
-asn_struct_free_f RICindicationMessage_free;
-asn_struct_print_f RICindicationMessage_print;
-asn_constr_check_f RICindicationMessage_constraint;
-ber_type_decoder_f RICindicationMessage_decode_ber;
-der_type_encoder_f RICindicationMessage_encode_der;
-xer_type_decoder_f RICindicationMessage_decode_xer;
-xer_type_encoder_f RICindicationMessage_encode_xer;
-per_type_decoder_f RICindicationMessage_decode_uper;
-per_type_encoder_f RICindicationMessage_encode_uper;
-per_type_decoder_f RICindicationMessage_decode_aper;
-per_type_encoder_f RICindicationMessage_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICindicationMessage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICindicationSN.c b/3rdparty/libe2ap/RICindicationSN.c
deleted file mode 100644
index b908f0b..0000000
--- a/3rdparty/libe2ap/RICindicationSN.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICindicationSN.h"
-
-int
-RICindicationSN_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_RICindicationSN_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_RICindicationSN_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RICindicationSN = {
-	"RICindicationSN",
-	"RICindicationSN",
-	&asn_OP_NativeInteger,
-	asn_DEF_RICindicationSN_tags_1,
-	sizeof(asn_DEF_RICindicationSN_tags_1)
-		/sizeof(asn_DEF_RICindicationSN_tags_1[0]), /* 1 */
-	asn_DEF_RICindicationSN_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICindicationSN_tags_1)
-		/sizeof(asn_DEF_RICindicationSN_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RICindicationSN_constr_1, RICindicationSN_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/RICindicationSN.h b/3rdparty/libe2ap/RICindicationSN.h
deleted file mode 100644
index dcaee6d..0000000
--- a/3rdparty/libe2ap/RICindicationSN.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICindicationSN_H_
-#define	_RICindicationSN_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICindicationSN */
-typedef long	 RICindicationSN_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICindicationSN;
-asn_struct_free_f RICindicationSN_free;
-asn_struct_print_f RICindicationSN_print;
-asn_constr_check_f RICindicationSN_constraint;
-ber_type_decoder_f RICindicationSN_decode_ber;
-der_type_encoder_f RICindicationSN_encode_der;
-xer_type_decoder_f RICindicationSN_decode_xer;
-xer_type_encoder_f RICindicationSN_encode_xer;
-per_type_decoder_f RICindicationSN_decode_uper;
-per_type_encoder_f RICindicationSN_encode_uper;
-per_type_decoder_f RICindicationSN_decode_aper;
-per_type_encoder_f RICindicationSN_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICindicationSN_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICindicationType.c b/3rdparty/libe2ap/RICindicationType.c
deleted file mode 100644
index aedf87f..0000000
--- a/3rdparty/libe2ap/RICindicationType.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICindicationType.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_RICindicationType_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_RICindicationType_value2enum_1[] = {
-	{ 0,	6,	"report" },
-	{ 1,	6,	"insert" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_RICindicationType_enum2value_1[] = {
-	1,	/* insert(1) */
-	0	/* report(0) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_RICindicationType_specs_1 = {
-	asn_MAP_RICindicationType_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_RICindicationType_enum2value_1,	/* N => "tag"; sorted by N */
-	2,	/* Number of elements in the maps */
-	3,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_RICindicationType_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RICindicationType = {
-	"RICindicationType",
-	"RICindicationType",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_RICindicationType_tags_1,
-	sizeof(asn_DEF_RICindicationType_tags_1)
-		/sizeof(asn_DEF_RICindicationType_tags_1[0]), /* 1 */
-	asn_DEF_RICindicationType_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICindicationType_tags_1)
-		/sizeof(asn_DEF_RICindicationType_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RICindicationType_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_RICindicationType_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICindicationType.h b/3rdparty/libe2ap/RICindicationType.h
deleted file mode 100644
index bf107ba..0000000
--- a/3rdparty/libe2ap/RICindicationType.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICindicationType_H_
-#define	_RICindicationType_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RICindicationType {
-	RICindicationType_report	= 0,
-	RICindicationType_insert	= 1
-	/*
-	 * Enumeration is extensible
-	 */
-} e_RICindicationType;
-
-/* RICindicationType */
-typedef long	 RICindicationType_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICindicationType;
-asn_struct_free_f RICindicationType_free;
-asn_struct_print_f RICindicationType_print;
-asn_constr_check_f RICindicationType_constraint;
-ber_type_decoder_f RICindicationType_decode_ber;
-der_type_encoder_f RICindicationType_encode_der;
-xer_type_decoder_f RICindicationType_decode_xer;
-xer_type_encoder_f RICindicationType_encode_xer;
-per_type_decoder_f RICindicationType_decode_uper;
-per_type_encoder_f RICindicationType_encode_uper;
-per_type_decoder_f RICindicationType_decode_aper;
-per_type_encoder_f RICindicationType_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICindicationType_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICrequestID.c b/3rdparty/libe2ap/RICrequestID.c
deleted file mode 100644
index 709bee5..0000000
--- a/3rdparty/libe2ap/RICrequestID.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICrequestID.h"
-
-static int
-memb_ricRequestorID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_ricRequestSequenceNumber_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 65535)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_ricRequestorID_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_ricRequestSequenceNumber_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_RICrequestID_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICrequestID, ricRequestorID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_ricRequestorID_constr_2,  memb_ricRequestorID_constraint_1 },
-		0, 0, /* No default value */
-		"ricRequestorID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICrequestID, ricRequestSequenceNumber),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_ricRequestSequenceNumber_constr_3,  memb_ricRequestSequenceNumber_constraint_1 },
-		0, 0, /* No default value */
-		"ricRequestSequenceNumber"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICrequestID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICrequestID_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricRequestorID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ricRequestSequenceNumber */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_RICrequestID_specs_1 = {
-	sizeof(struct RICrequestID),
-	offsetof(struct RICrequestID, _asn_ctx),
-	asn_MAP_RICrequestID_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICrequestID = {
-	"RICrequestID",
-	"RICrequestID",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICrequestID_tags_1,
-	sizeof(asn_DEF_RICrequestID_tags_1)
-		/sizeof(asn_DEF_RICrequestID_tags_1[0]), /* 1 */
-	asn_DEF_RICrequestID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICrequestID_tags_1)
-		/sizeof(asn_DEF_RICrequestID_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICrequestID_1,
-	2,	/* Elements count */
-	&asn_SPC_RICrequestID_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICrequestID.h b/3rdparty/libe2ap/RICrequestID.h
deleted file mode 100644
index 99e33b5..0000000
--- a/3rdparty/libe2ap/RICrequestID.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICrequestID_H_
-#define	_RICrequestID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICrequestID */
-typedef struct RICrequestID {
-	long	 ricRequestorID;
-	long	 ricRequestSequenceNumber;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICrequestID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICrequestID;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICrequestID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICserviceQuery.c b/3rdparty/libe2ap/RICserviceQuery.c
deleted file mode 100644
index 8bae73c..0000000
--- a/3rdparty/libe2ap/RICserviceQuery.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICserviceQuery.h"
-
-asn_TYPE_member_t asn_MBR_RICserviceQuery_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P13,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICserviceQuery_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICserviceQuery_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_specs_1 = {
-	sizeof(struct RICserviceQuery),
-	offsetof(struct RICserviceQuery, _asn_ctx),
-	asn_MAP_RICserviceQuery_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICserviceQuery = {
-	"RICserviceQuery",
-	"RICserviceQuery",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICserviceQuery_tags_1,
-	sizeof(asn_DEF_RICserviceQuery_tags_1)
-		/sizeof(asn_DEF_RICserviceQuery_tags_1[0]), /* 1 */
-	asn_DEF_RICserviceQuery_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICserviceQuery_tags_1)
-		/sizeof(asn_DEF_RICserviceQuery_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICserviceQuery_1,
-	1,	/* Elements count */
-	&asn_SPC_RICserviceQuery_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICserviceQuery.h b/3rdparty/libe2ap/RICserviceQuery.h
deleted file mode 100644
index d7da843..0000000
--- a/3rdparty/libe2ap/RICserviceQuery.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICserviceQuery_H_
-#define	_RICserviceQuery_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICserviceQuery */
-typedef struct RICserviceQuery {
-	ProtocolIE_Container_8807P13_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICserviceQuery_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICserviceQuery;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICserviceQuery_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICserviceQuery_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICserviceUpdate.c b/3rdparty/libe2ap/RICserviceUpdate.c
deleted file mode 100644
index dfc6842..0000000
--- a/3rdparty/libe2ap/RICserviceUpdate.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICserviceUpdate.h"
-
-asn_TYPE_member_t asn_MBR_RICserviceUpdate_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P10,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICserviceUpdate_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdate_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_specs_1 = {
-	sizeof(struct RICserviceUpdate),
-	offsetof(struct RICserviceUpdate, _asn_ctx),
-	asn_MAP_RICserviceUpdate_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate = {
-	"RICserviceUpdate",
-	"RICserviceUpdate",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICserviceUpdate_tags_1,
-	sizeof(asn_DEF_RICserviceUpdate_tags_1)
-		/sizeof(asn_DEF_RICserviceUpdate_tags_1[0]), /* 1 */
-	asn_DEF_RICserviceUpdate_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICserviceUpdate_tags_1)
-		/sizeof(asn_DEF_RICserviceUpdate_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICserviceUpdate_1,
-	1,	/* Elements count */
-	&asn_SPC_RICserviceUpdate_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICserviceUpdate.h b/3rdparty/libe2ap/RICserviceUpdate.h
deleted file mode 100644
index b5fa2fc..0000000
--- a/3rdparty/libe2ap/RICserviceUpdate.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICserviceUpdate_H_
-#define	_RICserviceUpdate_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICserviceUpdate */
-typedef struct RICserviceUpdate {
-	ProtocolIE_Container_8807P10_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICserviceUpdate_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICserviceUpdate_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICserviceUpdate_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICserviceUpdateAcknowledge.c b/3rdparty/libe2ap/RICserviceUpdateAcknowledge.c
deleted file mode 100644
index 329d806..0000000
--- a/3rdparty/libe2ap/RICserviceUpdateAcknowledge.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICserviceUpdateAcknowledge.h"
-
-asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P11,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICserviceUpdateAcknowledge_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateAcknowledge_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_specs_1 = {
-	sizeof(struct RICserviceUpdateAcknowledge),
-	offsetof(struct RICserviceUpdateAcknowledge, _asn_ctx),
-	asn_MAP_RICserviceUpdateAcknowledge_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge = {
-	"RICserviceUpdateAcknowledge",
-	"RICserviceUpdateAcknowledge",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICserviceUpdateAcknowledge_tags_1,
-	sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1)
-		/sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1[0]), /* 1 */
-	asn_DEF_RICserviceUpdateAcknowledge_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1)
-		/sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICserviceUpdateAcknowledge_1,
-	1,	/* Elements count */
-	&asn_SPC_RICserviceUpdateAcknowledge_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICserviceUpdateAcknowledge.h b/3rdparty/libe2ap/RICserviceUpdateAcknowledge.h
deleted file mode 100644
index f7ddb5c..0000000
--- a/3rdparty/libe2ap/RICserviceUpdateAcknowledge.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICserviceUpdateAcknowledge_H_
-#define	_RICserviceUpdateAcknowledge_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICserviceUpdateAcknowledge */
-typedef struct RICserviceUpdateAcknowledge {
-	ProtocolIE_Container_8807P11_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICserviceUpdateAcknowledge_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICserviceUpdateAcknowledge_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICserviceUpdateFailure.c b/3rdparty/libe2ap/RICserviceUpdateFailure.c
deleted file mode 100644
index 79a2ef3..0000000
--- a/3rdparty/libe2ap/RICserviceUpdateFailure.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICserviceUpdateFailure.h"
-
-asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P12,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICserviceUpdateFailure_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateFailure_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_specs_1 = {
-	sizeof(struct RICserviceUpdateFailure),
-	offsetof(struct RICserviceUpdateFailure, _asn_ctx),
-	asn_MAP_RICserviceUpdateFailure_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure = {
-	"RICserviceUpdateFailure",
-	"RICserviceUpdateFailure",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICserviceUpdateFailure_tags_1,
-	sizeof(asn_DEF_RICserviceUpdateFailure_tags_1)
-		/sizeof(asn_DEF_RICserviceUpdateFailure_tags_1[0]), /* 1 */
-	asn_DEF_RICserviceUpdateFailure_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICserviceUpdateFailure_tags_1)
-		/sizeof(asn_DEF_RICserviceUpdateFailure_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICserviceUpdateFailure_1,
-	1,	/* Elements count */
-	&asn_SPC_RICserviceUpdateFailure_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICserviceUpdateFailure.h b/3rdparty/libe2ap/RICserviceUpdateFailure.h
deleted file mode 100644
index 3f03b58..0000000
--- a/3rdparty/libe2ap/RICserviceUpdateFailure.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICserviceUpdateFailure_H_
-#define	_RICserviceUpdateFailure_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICserviceUpdateFailure */
-typedef struct RICserviceUpdateFailure {
-	ProtocolIE_Container_8807P12_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICserviceUpdateFailure_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICserviceUpdateFailure_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICsubscription.c b/3rdparty/libe2ap/RICsubscription.c
deleted file mode 100644
index a55d787..0000000
--- a/3rdparty/libe2ap/RICsubscription.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICsubscription.h"
-
-static asn_TYPE_member_t asn_MBR_RICsubscription_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscription, ricEventTriggerDefinition),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RICeventTriggerDefinition,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ricEventTriggerDefinition"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscription, ricAction_ToBeSetup_List),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RICactions_ToBeSetup_List,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ricAction-ToBeSetup-List"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICsubscription_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICsubscription_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricEventTriggerDefinition */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ricAction-ToBeSetup-List */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_RICsubscription_specs_1 = {
-	sizeof(struct RICsubscription),
-	offsetof(struct RICsubscription, _asn_ctx),
-	asn_MAP_RICsubscription_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICsubscription = {
-	"RICsubscription",
-	"RICsubscription",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICsubscription_tags_1,
-	sizeof(asn_DEF_RICsubscription_tags_1)
-		/sizeof(asn_DEF_RICsubscription_tags_1[0]), /* 1 */
-	asn_DEF_RICsubscription_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICsubscription_tags_1)
-		/sizeof(asn_DEF_RICsubscription_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICsubscription_1,
-	2,	/* Elements count */
-	&asn_SPC_RICsubscription_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICsubscription.h b/3rdparty/libe2ap/RICsubscription.h
deleted file mode 100644
index 9efe943..0000000
--- a/3rdparty/libe2ap/RICsubscription.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICsubscription_H_
-#define	_RICsubscription_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "RICeventTriggerDefinition.h"
-#include "RICactions-ToBeSetup-List.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICsubscription */
-typedef struct RICsubscription {
-	RICeventTriggerDefinition_t	 ricEventTriggerDefinition;
-	RICactions_ToBeSetup_List_t	 ricAction_ToBeSetup_List;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICsubscription_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICsubscription;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICsubscription_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICsubscriptionDeleteFailure.c b/3rdparty/libe2ap/RICsubscriptionDeleteFailure.c
deleted file mode 100644
index de1d7cf..0000000
--- a/3rdparty/libe2ap/RICsubscriptionDeleteFailure.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICsubscriptionDeleteFailure.h"
-
-asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P5,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteFailure_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteFailure_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_specs_1 = {
-	sizeof(struct RICsubscriptionDeleteFailure),
-	offsetof(struct RICsubscriptionDeleteFailure, _asn_ctx),
-	asn_MAP_RICsubscriptionDeleteFailure_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure = {
-	"RICsubscriptionDeleteFailure",
-	"RICsubscriptionDeleteFailure",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICsubscriptionDeleteFailure_tags_1,
-	sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1)
-		/sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1[0]), /* 1 */
-	asn_DEF_RICsubscriptionDeleteFailure_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1)
-		/sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICsubscriptionDeleteFailure_1,
-	1,	/* Elements count */
-	&asn_SPC_RICsubscriptionDeleteFailure_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICsubscriptionDeleteFailure.h b/3rdparty/libe2ap/RICsubscriptionDeleteFailure.h
deleted file mode 100644
index d3d2bd1..0000000
--- a/3rdparty/libe2ap/RICsubscriptionDeleteFailure.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICsubscriptionDeleteFailure_H_
-#define	_RICsubscriptionDeleteFailure_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICsubscriptionDeleteFailure */
-typedef struct RICsubscriptionDeleteFailure {
-	ProtocolIE_Container_8807P5_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICsubscriptionDeleteFailure_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICsubscriptionDeleteFailure_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICsubscriptionDeleteRequest.c b/3rdparty/libe2ap/RICsubscriptionDeleteRequest.c
deleted file mode 100644
index 26ff634..0000000
--- a/3rdparty/libe2ap/RICsubscriptionDeleteRequest.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICsubscriptionDeleteRequest.h"
-
-asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P3,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteRequest_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteRequest_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_specs_1 = {
-	sizeof(struct RICsubscriptionDeleteRequest),
-	offsetof(struct RICsubscriptionDeleteRequest, _asn_ctx),
-	asn_MAP_RICsubscriptionDeleteRequest_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest = {
-	"RICsubscriptionDeleteRequest",
-	"RICsubscriptionDeleteRequest",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICsubscriptionDeleteRequest_tags_1,
-	sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1)
-		/sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1[0]), /* 1 */
-	asn_DEF_RICsubscriptionDeleteRequest_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1)
-		/sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICsubscriptionDeleteRequest_1,
-	1,	/* Elements count */
-	&asn_SPC_RICsubscriptionDeleteRequest_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICsubscriptionDeleteRequest.h b/3rdparty/libe2ap/RICsubscriptionDeleteRequest.h
deleted file mode 100644
index ff7940e..0000000
--- a/3rdparty/libe2ap/RICsubscriptionDeleteRequest.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICsubscriptionDeleteRequest_H_
-#define	_RICsubscriptionDeleteRequest_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICsubscriptionDeleteRequest */
-typedef struct RICsubscriptionDeleteRequest {
-	ProtocolIE_Container_8807P3_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICsubscriptionDeleteRequest_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICsubscriptionDeleteRequest_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICsubscriptionDeleteResponse.c b/3rdparty/libe2ap/RICsubscriptionDeleteResponse.c
deleted file mode 100644
index b891384..0000000
--- a/3rdparty/libe2ap/RICsubscriptionDeleteResponse.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICsubscriptionDeleteResponse.h"
-
-asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P4,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteResponse_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteResponse_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_specs_1 = {
-	sizeof(struct RICsubscriptionDeleteResponse),
-	offsetof(struct RICsubscriptionDeleteResponse, _asn_ctx),
-	asn_MAP_RICsubscriptionDeleteResponse_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse = {
-	"RICsubscriptionDeleteResponse",
-	"RICsubscriptionDeleteResponse",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICsubscriptionDeleteResponse_tags_1,
-	sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1)
-		/sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1[0]), /* 1 */
-	asn_DEF_RICsubscriptionDeleteResponse_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1)
-		/sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICsubscriptionDeleteResponse_1,
-	1,	/* Elements count */
-	&asn_SPC_RICsubscriptionDeleteResponse_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICsubscriptionDeleteResponse.h b/3rdparty/libe2ap/RICsubscriptionDeleteResponse.h
deleted file mode 100644
index 4b84c02..0000000
--- a/3rdparty/libe2ap/RICsubscriptionDeleteResponse.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICsubscriptionDeleteResponse_H_
-#define	_RICsubscriptionDeleteResponse_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICsubscriptionDeleteResponse */
-typedef struct RICsubscriptionDeleteResponse {
-	ProtocolIE_Container_8807P4_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICsubscriptionDeleteResponse_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICsubscriptionDeleteResponse_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICsubscriptionFailure.c b/3rdparty/libe2ap/RICsubscriptionFailure.c
deleted file mode 100644
index d4fb370..0000000
--- a/3rdparty/libe2ap/RICsubscriptionFailure.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICsubscriptionFailure.h"
-
-asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICsubscriptionFailure_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionFailure_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_specs_1 = {
-	sizeof(struct RICsubscriptionFailure),
-	offsetof(struct RICsubscriptionFailure, _asn_ctx),
-	asn_MAP_RICsubscriptionFailure_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure = {
-	"RICsubscriptionFailure",
-	"RICsubscriptionFailure",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICsubscriptionFailure_tags_1,
-	sizeof(asn_DEF_RICsubscriptionFailure_tags_1)
-		/sizeof(asn_DEF_RICsubscriptionFailure_tags_1[0]), /* 1 */
-	asn_DEF_RICsubscriptionFailure_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICsubscriptionFailure_tags_1)
-		/sizeof(asn_DEF_RICsubscriptionFailure_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICsubscriptionFailure_1,
-	1,	/* Elements count */
-	&asn_SPC_RICsubscriptionFailure_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICsubscriptionFailure.h b/3rdparty/libe2ap/RICsubscriptionFailure.h
deleted file mode 100644
index ed31635..0000000
--- a/3rdparty/libe2ap/RICsubscriptionFailure.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICsubscriptionFailure_H_
-#define	_RICsubscriptionFailure_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICsubscriptionFailure */
-typedef struct RICsubscriptionFailure {
-	ProtocolIE_Container_8807P2_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICsubscriptionFailure_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICsubscriptionFailure_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICsubscriptionRequest.c b/3rdparty/libe2ap/RICsubscriptionRequest.c
deleted file mode 100644
index 59720e4..0000000
--- a/3rdparty/libe2ap/RICsubscriptionRequest.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICsubscriptionRequest.h"
-
-asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P0,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICsubscriptionRequest_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionRequest_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_specs_1 = {
-	sizeof(struct RICsubscriptionRequest),
-	offsetof(struct RICsubscriptionRequest, _asn_ctx),
-	asn_MAP_RICsubscriptionRequest_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest = {
-	"RICsubscriptionRequest",
-	"RICsubscriptionRequest",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICsubscriptionRequest_tags_1,
-	sizeof(asn_DEF_RICsubscriptionRequest_tags_1)
-		/sizeof(asn_DEF_RICsubscriptionRequest_tags_1[0]), /* 1 */
-	asn_DEF_RICsubscriptionRequest_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICsubscriptionRequest_tags_1)
-		/sizeof(asn_DEF_RICsubscriptionRequest_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICsubscriptionRequest_1,
-	1,	/* Elements count */
-	&asn_SPC_RICsubscriptionRequest_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICsubscriptionRequest.h b/3rdparty/libe2ap/RICsubscriptionRequest.h
deleted file mode 100644
index 8b25326..0000000
--- a/3rdparty/libe2ap/RICsubscriptionRequest.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICsubscriptionRequest_H_
-#define	_RICsubscriptionRequest_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICsubscriptionRequest */
-typedef struct RICsubscriptionRequest {
-	ProtocolIE_Container_8807P0_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICsubscriptionRequest_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICsubscriptionRequest_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICsubscriptionResponse.c b/3rdparty/libe2ap/RICsubscriptionResponse.c
deleted file mode 100644
index 36ec4eb..0000000
--- a/3rdparty/libe2ap/RICsubscriptionResponse.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICsubscriptionResponse.h"
-
-asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P1,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICsubscriptionResponse_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionResponse_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_specs_1 = {
-	sizeof(struct RICsubscriptionResponse),
-	offsetof(struct RICsubscriptionResponse, _asn_ctx),
-	asn_MAP_RICsubscriptionResponse_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse = {
-	"RICsubscriptionResponse",
-	"RICsubscriptionResponse",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICsubscriptionResponse_tags_1,
-	sizeof(asn_DEF_RICsubscriptionResponse_tags_1)
-		/sizeof(asn_DEF_RICsubscriptionResponse_tags_1[0]), /* 1 */
-	asn_DEF_RICsubscriptionResponse_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICsubscriptionResponse_tags_1)
-		/sizeof(asn_DEF_RICsubscriptionResponse_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICsubscriptionResponse_1,
-	1,	/* Elements count */
-	&asn_SPC_RICsubscriptionResponse_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICsubscriptionResponse.h b/3rdparty/libe2ap/RICsubscriptionResponse.h
deleted file mode 100644
index d9077c8..0000000
--- a/3rdparty/libe2ap/RICsubscriptionResponse.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICsubscriptionResponse_H_
-#define	_RICsubscriptionResponse_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICsubscriptionResponse */
-typedef struct RICsubscriptionResponse {
-	ProtocolIE_Container_8807P1_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICsubscriptionResponse_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICsubscriptionResponse_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICsubsequentAction.c b/3rdparty/libe2ap/RICsubsequentAction.c
deleted file mode 100644
index 6040b78..0000000
--- a/3rdparty/libe2ap/RICsubsequentAction.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICsubsequentAction.h"
-
-asn_TYPE_member_t asn_MBR_RICsubsequentAction_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubsequentAction, ricSubsequentActionType),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RICsubsequentActionType,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ricSubsequentActionType"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RICsubsequentAction, ricTimeToWait),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RICtimeToWait,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ricTimeToWait"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RICsubsequentAction_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RICsubsequentAction_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricSubsequentActionType */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ricTimeToWait */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RICsubsequentAction_specs_1 = {
-	sizeof(struct RICsubsequentAction),
-	offsetof(struct RICsubsequentAction, _asn_ctx),
-	asn_MAP_RICsubsequentAction_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RICsubsequentAction = {
-	"RICsubsequentAction",
-	"RICsubsequentAction",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RICsubsequentAction_tags_1,
-	sizeof(asn_DEF_RICsubsequentAction_tags_1)
-		/sizeof(asn_DEF_RICsubsequentAction_tags_1[0]), /* 1 */
-	asn_DEF_RICsubsequentAction_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICsubsequentAction_tags_1)
-		/sizeof(asn_DEF_RICsubsequentAction_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RICsubsequentAction_1,
-	2,	/* Elements count */
-	&asn_SPC_RICsubsequentAction_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICsubsequentAction.h b/3rdparty/libe2ap/RICsubsequentAction.h
deleted file mode 100644
index c81cbd7..0000000
--- a/3rdparty/libe2ap/RICsubsequentAction.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICsubsequentAction_H_
-#define	_RICsubsequentAction_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "RICsubsequentActionType.h"
-#include "RICtimeToWait.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RICsubsequentAction */
-typedef struct RICsubsequentAction {
-	RICsubsequentActionType_t	 ricSubsequentActionType;
-	RICtimeToWait_t	 ricTimeToWait;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RICsubsequentAction_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RICsubsequentAction;
-extern asn_SEQUENCE_specifics_t asn_SPC_RICsubsequentAction_specs_1;
-extern asn_TYPE_member_t asn_MBR_RICsubsequentAction_1[2];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICsubsequentAction_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICsubsequentActionType.c b/3rdparty/libe2ap/RICsubsequentActionType.c
deleted file mode 100644
index e11ef8c..0000000
--- a/3rdparty/libe2ap/RICsubsequentActionType.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICsubsequentActionType.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_RICsubsequentActionType_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_RICsubsequentActionType_value2enum_1[] = {
-	{ 0,	8,	"continue" },
-	{ 1,	4,	"wait" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_RICsubsequentActionType_enum2value_1[] = {
-	0,	/* continue(0) */
-	1	/* wait(1) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_RICsubsequentActionType_specs_1 = {
-	asn_MAP_RICsubsequentActionType_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_RICsubsequentActionType_enum2value_1,	/* N => "tag"; sorted by N */
-	2,	/* Number of elements in the maps */
-	3,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_RICsubsequentActionType_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RICsubsequentActionType = {
-	"RICsubsequentActionType",
-	"RICsubsequentActionType",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_RICsubsequentActionType_tags_1,
-	sizeof(asn_DEF_RICsubsequentActionType_tags_1)
-		/sizeof(asn_DEF_RICsubsequentActionType_tags_1[0]), /* 1 */
-	asn_DEF_RICsubsequentActionType_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICsubsequentActionType_tags_1)
-		/sizeof(asn_DEF_RICsubsequentActionType_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RICsubsequentActionType_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_RICsubsequentActionType_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICsubsequentActionType.h b/3rdparty/libe2ap/RICsubsequentActionType.h
deleted file mode 100644
index 0f6c457..0000000
--- a/3rdparty/libe2ap/RICsubsequentActionType.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICsubsequentActionType_H_
-#define	_RICsubsequentActionType_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RICsubsequentActionType {
-	RICsubsequentActionType_continue	= 0,
-	RICsubsequentActionType_wait	= 1
-	/*
-	 * Enumeration is extensible
-	 */
-} e_RICsubsequentActionType;
-
-/* RICsubsequentActionType */
-typedef long	 RICsubsequentActionType_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_RICsubsequentActionType_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_RICsubsequentActionType;
-extern const asn_INTEGER_specifics_t asn_SPC_RICsubsequentActionType_specs_1;
-asn_struct_free_f RICsubsequentActionType_free;
-asn_struct_print_f RICsubsequentActionType_print;
-asn_constr_check_f RICsubsequentActionType_constraint;
-ber_type_decoder_f RICsubsequentActionType_decode_ber;
-der_type_encoder_f RICsubsequentActionType_encode_der;
-xer_type_decoder_f RICsubsequentActionType_decode_xer;
-xer_type_encoder_f RICsubsequentActionType_encode_xer;
-per_type_decoder_f RICsubsequentActionType_decode_uper;
-per_type_encoder_f RICsubsequentActionType_encode_uper;
-per_type_decoder_f RICsubsequentActionType_decode_aper;
-per_type_encoder_f RICsubsequentActionType_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICsubsequentActionType_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RICtimeToWait.c b/3rdparty/libe2ap/RICtimeToWait.c
deleted file mode 100644
index c9744ce..0000000
--- a/3rdparty/libe2ap/RICtimeToWait.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RICtimeToWait.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_RICtimeToWait_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  5,  5,  0,  17 }	/* (0..17,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_RICtimeToWait_value2enum_1[] = {
-	{ 0,	4,	"zero" },
-	{ 1,	4,	"w1ms" },
-	{ 2,	4,	"w2ms" },
-	{ 3,	4,	"w5ms" },
-	{ 4,	5,	"w10ms" },
-	{ 5,	5,	"w20ms" },
-	{ 6,	5,	"w30ms" },
-	{ 7,	5,	"w40ms" },
-	{ 8,	5,	"w50ms" },
-	{ 9,	6,	"w100ms" },
-	{ 10,	6,	"w200ms" },
-	{ 11,	6,	"w500ms" },
-	{ 12,	3,	"w1s" },
-	{ 13,	3,	"w2s" },
-	{ 14,	3,	"w5s" },
-	{ 15,	4,	"w10s" },
-	{ 16,	4,	"w20s" },
-	{ 17,	4,	"w60s" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_RICtimeToWait_enum2value_1[] = {
-	9,	/* w100ms(9) */
-	4,	/* w10ms(4) */
-	15,	/* w10s(15) */
-	1,	/* w1ms(1) */
-	12,	/* w1s(12) */
-	10,	/* w200ms(10) */
-	5,	/* w20ms(5) */
-	16,	/* w20s(16) */
-	2,	/* w2ms(2) */
-	13,	/* w2s(13) */
-	6,	/* w30ms(6) */
-	7,	/* w40ms(7) */
-	11,	/* w500ms(11) */
-	8,	/* w50ms(8) */
-	3,	/* w5ms(3) */
-	14,	/* w5s(14) */
-	17,	/* w60s(17) */
-	0	/* zero(0) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_RICtimeToWait_specs_1 = {
-	asn_MAP_RICtimeToWait_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_RICtimeToWait_enum2value_1,	/* N => "tag"; sorted by N */
-	18,	/* Number of elements in the maps */
-	19,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_RICtimeToWait_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RICtimeToWait = {
-	"RICtimeToWait",
-	"RICtimeToWait",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_RICtimeToWait_tags_1,
-	sizeof(asn_DEF_RICtimeToWait_tags_1)
-		/sizeof(asn_DEF_RICtimeToWait_tags_1[0]), /* 1 */
-	asn_DEF_RICtimeToWait_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RICtimeToWait_tags_1)
-		/sizeof(asn_DEF_RICtimeToWait_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RICtimeToWait_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_RICtimeToWait_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RICtimeToWait.h b/3rdparty/libe2ap/RICtimeToWait.h
deleted file mode 100644
index 23f4d6d..0000000
--- a/3rdparty/libe2ap/RICtimeToWait.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RICtimeToWait_H_
-#define	_RICtimeToWait_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RICtimeToWait {
-	RICtimeToWait_zero	= 0,
-	RICtimeToWait_w1ms	= 1,
-	RICtimeToWait_w2ms	= 2,
-	RICtimeToWait_w5ms	= 3,
-	RICtimeToWait_w10ms	= 4,
-	RICtimeToWait_w20ms	= 5,
-	RICtimeToWait_w30ms	= 6,
-	RICtimeToWait_w40ms	= 7,
-	RICtimeToWait_w50ms	= 8,
-	RICtimeToWait_w100ms	= 9,
-	RICtimeToWait_w200ms	= 10,
-	RICtimeToWait_w500ms	= 11,
-	RICtimeToWait_w1s	= 12,
-	RICtimeToWait_w2s	= 13,
-	RICtimeToWait_w5s	= 14,
-	RICtimeToWait_w10s	= 15,
-	RICtimeToWait_w20s	= 16,
-	RICtimeToWait_w60s	= 17
-	/*
-	 * Enumeration is extensible
-	 */
-} e_RICtimeToWait;
-
-/* RICtimeToWait */
-typedef long	 RICtimeToWait_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_RICtimeToWait_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_RICtimeToWait;
-extern const asn_INTEGER_specifics_t asn_SPC_RICtimeToWait_specs_1;
-asn_struct_free_f RICtimeToWait_free;
-asn_struct_print_f RICtimeToWait_print;
-asn_constr_check_f RICtimeToWait_constraint;
-ber_type_decoder_f RICtimeToWait_decode_ber;
-der_type_encoder_f RICtimeToWait_encode_der;
-xer_type_decoder_f RICtimeToWait_decode_xer;
-xer_type_encoder_f RICtimeToWait_encode_xer;
-per_type_decoder_f RICtimeToWait_decode_uper;
-per_type_encoder_f RICtimeToWait_encode_uper;
-per_type_decoder_f RICtimeToWait_decode_aper;
-per_type_encoder_f RICtimeToWait_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RICtimeToWait_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RNTP-Threshold.c b/3rdparty/libe2ap/RNTP-Threshold.c
deleted file mode 100644
index 19045e0..0000000
--- a/3rdparty/libe2ap/RNTP-Threshold.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RNTP-Threshold.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_RNTP_Threshold_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  4,  4,  0,  15 }	/* (0..15,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_RNTP_Threshold_value2enum_1[] = {
-	{ 0,	13,	"minusInfinity" },
-	{ 1,	11,	"minusEleven" },
-	{ 2,	8,	"minusTen" },
-	{ 3,	9,	"minusNine" },
-	{ 4,	10,	"minusEight" },
-	{ 5,	10,	"minusSeven" },
-	{ 6,	8,	"minusSix" },
-	{ 7,	9,	"minusFive" },
-	{ 8,	9,	"minusFour" },
-	{ 9,	10,	"minusThree" },
-	{ 10,	8,	"minusTwo" },
-	{ 11,	8,	"minusOne" },
-	{ 12,	4,	"zero" },
-	{ 13,	3,	"one" },
-	{ 14,	3,	"two" },
-	{ 15,	5,	"three" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_RNTP_Threshold_enum2value_1[] = {
-	4,	/* minusEight(4) */
-	1,	/* minusEleven(1) */
-	7,	/* minusFive(7) */
-	8,	/* minusFour(8) */
-	0,	/* minusInfinity(0) */
-	3,	/* minusNine(3) */
-	11,	/* minusOne(11) */
-	5,	/* minusSeven(5) */
-	6,	/* minusSix(6) */
-	2,	/* minusTen(2) */
-	9,	/* minusThree(9) */
-	10,	/* minusTwo(10) */
-	13,	/* one(13) */
-	15,	/* three(15) */
-	14,	/* two(14) */
-	12	/* zero(12) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_RNTP_Threshold_specs_1 = {
-	asn_MAP_RNTP_Threshold_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_RNTP_Threshold_enum2value_1,	/* N => "tag"; sorted by N */
-	16,	/* Number of elements in the maps */
-	17,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_RNTP_Threshold_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RNTP_Threshold = {
-	"RNTP-Threshold",
-	"RNTP-Threshold",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_RNTP_Threshold_tags_1,
-	sizeof(asn_DEF_RNTP_Threshold_tags_1)
-		/sizeof(asn_DEF_RNTP_Threshold_tags_1[0]), /* 1 */
-	asn_DEF_RNTP_Threshold_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RNTP_Threshold_tags_1)
-		/sizeof(asn_DEF_RNTP_Threshold_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RNTP_Threshold_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_RNTP_Threshold_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RNTP-Threshold.h b/3rdparty/libe2ap/RNTP-Threshold.h
deleted file mode 100644
index 532d265..0000000
--- a/3rdparty/libe2ap/RNTP-Threshold.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RNTP_Threshold_H_
-#define	_RNTP_Threshold_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RNTP_Threshold {
-	RNTP_Threshold_minusInfinity	= 0,
-	RNTP_Threshold_minusEleven	= 1,
-	RNTP_Threshold_minusTen	= 2,
-	RNTP_Threshold_minusNine	= 3,
-	RNTP_Threshold_minusEight	= 4,
-	RNTP_Threshold_minusSeven	= 5,
-	RNTP_Threshold_minusSix	= 6,
-	RNTP_Threshold_minusFive	= 7,
-	RNTP_Threshold_minusFour	= 8,
-	RNTP_Threshold_minusThree	= 9,
-	RNTP_Threshold_minusTwo	= 10,
-	RNTP_Threshold_minusOne	= 11,
-	RNTP_Threshold_zero	= 12,
-	RNTP_Threshold_one	= 13,
-	RNTP_Threshold_two	= 14,
-	RNTP_Threshold_three	= 15
-	/*
-	 * Enumeration is extensible
-	 */
-} e_RNTP_Threshold;
-
-/* RNTP-Threshold */
-typedef long	 RNTP_Threshold_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_RNTP_Threshold_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_RNTP_Threshold;
-extern const asn_INTEGER_specifics_t asn_SPC_RNTP_Threshold_specs_1;
-asn_struct_free_f RNTP_Threshold_free;
-asn_struct_print_f RNTP_Threshold_print;
-asn_constr_check_f RNTP_Threshold_constraint;
-ber_type_decoder_f RNTP_Threshold_decode_ber;
-der_type_encoder_f RNTP_Threshold_encode_der;
-xer_type_decoder_f RNTP_Threshold_decode_xer;
-xer_type_encoder_f RNTP_Threshold_encode_xer;
-per_type_decoder_f RNTP_Threshold_decode_uper;
-per_type_encoder_f RNTP_Threshold_encode_uper;
-per_type_decoder_f RNTP_Threshold_decode_aper;
-per_type_encoder_f RNTP_Threshold_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RNTP_Threshold_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RSRPMRList.c b/3rdparty/libe2ap/RSRPMRList.c
deleted file mode 100644
index 1e53cc4..0000000
--- a/3rdparty/libe2ap/RSRPMRList.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RSRPMRList.h"
-
-#include "ProtocolExtensionContainer.h"
-static asn_per_constraints_t asn_PER_type_RSRPMRList_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 7,  7,  1,  128 }	/* (SIZE(1..128)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_Member_2[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RSRPMRList__Member, rSRPMeasurementResult),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RSRPMeasurementResult,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"rSRPMeasurementResult"
-		},
-	{ ATF_POINTER, 1, offsetof(struct RSRPMRList__Member, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P62,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_Member_oms_2[] = { 1 };
-static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rSRPMeasurementResult */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
-	sizeof(struct RSRPMRList__Member),
-	offsetof(struct RSRPMRList__Member, _asn_ctx),
-	asn_MAP_Member_tag2el_2,
-	2,	/* Count of tags in the map */
-	asn_MAP_Member_oms_2,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	2,	/* First extension addition */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_Member_2 = {
-	"SEQUENCE",
-	"SEQUENCE",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Member_tags_2,
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	asn_DEF_Member_tags_2,	/* Same as above */
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Member_2,
-	2,	/* Elements count */
-	&asn_SPC_Member_specs_2	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_RSRPMRList_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Member_2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RSRPMRList_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_RSRPMRList_specs_1 = {
-	sizeof(struct RSRPMRList),
-	offsetof(struct RSRPMRList, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_RSRPMRList = {
-	"RSRPMRList",
-	"RSRPMRList",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_RSRPMRList_tags_1,
-	sizeof(asn_DEF_RSRPMRList_tags_1)
-		/sizeof(asn_DEF_RSRPMRList_tags_1[0]), /* 1 */
-	asn_DEF_RSRPMRList_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RSRPMRList_tags_1)
-		/sizeof(asn_DEF_RSRPMRList_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RSRPMRList_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_RSRPMRList_1,
-	1,	/* Single element */
-	&asn_SPC_RSRPMRList_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RSRPMRList.h b/3rdparty/libe2ap/RSRPMRList.h
deleted file mode 100644
index dca0325..0000000
--- a/3rdparty/libe2ap/RSRPMRList.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RSRPMRList_H_
-#define	_RSRPMRList_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "RSRPMeasurementResult.h"
-#include "constr_SEQUENCE.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* Forward definitions */
-typedef struct RSRPMRList__Member {
-	RSRPMeasurementResult_t	 rSRPMeasurementResult;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RSRPMRList__Member;
-
-/* RSRPMRList */
-typedef struct RSRPMRList {
-	A_SEQUENCE_OF(RSRPMRList__Member) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RSRPMRList_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RSRPMRList;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RSRPMRList_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RSRPMeasurementResult.c b/3rdparty/libe2ap/RSRPMeasurementResult.c
deleted file mode 100644
index 94164ab..0000000
--- a/3rdparty/libe2ap/RSRPMeasurementResult.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RSRPMeasurementResult.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_rSRPMeasured_constraint_2(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 97)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_rSRPMeasured_constr_4 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  7,  7,  0,  97 }	/* (0..97,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_RSRPMeasurementResult_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 4,  4,  1,  9 }	/* (SIZE(1..9)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_Member_2[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RSRPMeasurementResult__Member, rSRPCellID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"rSRPCellID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RSRPMeasurementResult__Member, rSRPMeasured),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_rSRPMeasured_constr_4,  memb_rSRPMeasured_constraint_2 },
-		0, 0, /* No default value */
-		"rSRPMeasured"
-		},
-	{ ATF_POINTER, 1, offsetof(struct RSRPMeasurementResult__Member, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P61,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_Member_oms_2[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rSRPCellID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* rSRPMeasured */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
-	sizeof(struct RSRPMeasurementResult__Member),
-	offsetof(struct RSRPMeasurementResult__Member, _asn_ctx),
-	asn_MAP_Member_tag2el_2,
-	3,	/* Count of tags in the map */
-	asn_MAP_Member_oms_2,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_Member_2 = {
-	"SEQUENCE",
-	"SEQUENCE",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Member_tags_2,
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	asn_DEF_Member_tags_2,	/* Same as above */
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Member_2,
-	3,	/* Elements count */
-	&asn_SPC_Member_specs_2	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RSRPMeasurementResult_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Member_2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_RSRPMeasurementResult_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_RSRPMeasurementResult_specs_1 = {
-	sizeof(struct RSRPMeasurementResult),
-	offsetof(struct RSRPMeasurementResult, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_RSRPMeasurementResult = {
-	"RSRPMeasurementResult",
-	"RSRPMeasurementResult",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_RSRPMeasurementResult_tags_1,
-	sizeof(asn_DEF_RSRPMeasurementResult_tags_1)
-		/sizeof(asn_DEF_RSRPMeasurementResult_tags_1[0]), /* 1 */
-	asn_DEF_RSRPMeasurementResult_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RSRPMeasurementResult_tags_1)
-		/sizeof(asn_DEF_RSRPMeasurementResult_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RSRPMeasurementResult_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_RSRPMeasurementResult_1,
-	1,	/* Single element */
-	&asn_SPC_RSRPMeasurementResult_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RSRPMeasurementResult.h b/3rdparty/libe2ap/RSRPMeasurementResult.h
deleted file mode 100644
index 9d36101..0000000
--- a/3rdparty/libe2ap/RSRPMeasurementResult.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RSRPMeasurementResult_H_
-#define	_RSRPMeasurementResult_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "ECGI.h"
-#include "NativeInteger.h"
-#include "constr_SEQUENCE.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* Forward definitions */
-typedef struct RSRPMeasurementResult__Member {
-	ECGI_t	 rSRPCellID;
-	long	 rSRPMeasured;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RSRPMeasurementResult__Member;
-
-/* RSRPMeasurementResult */
-typedef struct RSRPMeasurementResult {
-	A_SEQUENCE_OF(RSRPMeasurementResult__Member) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RSRPMeasurementResult_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RSRPMeasurementResult;
-extern asn_SET_OF_specifics_t asn_SPC_RSRPMeasurementResult_specs_1;
-extern asn_TYPE_member_t asn_MBR_RSRPMeasurementResult_1[1];
-extern asn_per_constraints_t asn_PER_type_RSRPMeasurementResult_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RSRPMeasurementResult_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RadioResourceStatus.c b/3rdparty/libe2ap/RadioResourceStatus.c
deleted file mode 100644
index 0e1a6ca..0000000
--- a/3rdparty/libe2ap/RadioResourceStatus.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RadioResourceStatus.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_RadioResourceStatus_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus, dL_GBR_PRB_usage),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_DL_GBR_PRB_usage,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"dL-GBR-PRB-usage"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus, uL_GBR_PRB_usage),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_UL_GBR_PRB_usage,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"uL-GBR-PRB-usage"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus, dL_non_GBR_PRB_usage),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_DL_non_GBR_PRB_usage,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"dL-non-GBR-PRB-usage"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus, uL_non_GBR_PRB_usage),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_UL_non_GBR_PRB_usage,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"uL-non-GBR-PRB-usage"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus, dL_Total_PRB_usage),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_DL_Total_PRB_usage,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"dL-Total-PRB-usage"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus, uL_Total_PRB_usage),
-		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_UL_Total_PRB_usage,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"uL-Total-PRB-usage"
-		},
-	{ ATF_POINTER, 1, offsetof(struct RadioResourceStatus, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P59,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_RadioResourceStatus_oms_1[] = { 6 };
-static const ber_tlv_tag_t asn_DEF_RadioResourceStatus_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RadioResourceStatus_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* dL-GBR-PRB-usage */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* uL-GBR-PRB-usage */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* dL-non-GBR-PRB-usage */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* uL-non-GBR-PRB-usage */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* dL-Total-PRB-usage */
-    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* uL-Total-PRB-usage */
-    { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RadioResourceStatus_specs_1 = {
-	sizeof(struct RadioResourceStatus),
-	offsetof(struct RadioResourceStatus, _asn_ctx),
-	asn_MAP_RadioResourceStatus_tag2el_1,
-	7,	/* Count of tags in the map */
-	asn_MAP_RadioResourceStatus_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	7,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RadioResourceStatus = {
-	"RadioResourceStatus",
-	"RadioResourceStatus",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RadioResourceStatus_tags_1,
-	sizeof(asn_DEF_RadioResourceStatus_tags_1)
-		/sizeof(asn_DEF_RadioResourceStatus_tags_1[0]), /* 1 */
-	asn_DEF_RadioResourceStatus_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RadioResourceStatus_tags_1)
-		/sizeof(asn_DEF_RadioResourceStatus_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RadioResourceStatus_1,
-	7,	/* Elements count */
-	&asn_SPC_RadioResourceStatus_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RadioResourceStatus.h b/3rdparty/libe2ap/RadioResourceStatus.h
deleted file mode 100644
index df39725..0000000
--- a/3rdparty/libe2ap/RadioResourceStatus.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RadioResourceStatus_H_
-#define	_RadioResourceStatus_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "DL-GBR-PRB-usage.h"
-#include "UL-GBR-PRB-usage.h"
-#include "DL-non-GBR-PRB-usage.h"
-#include "UL-non-GBR-PRB-usage.h"
-#include "DL-Total-PRB-usage.h"
-#include "UL-Total-PRB-usage.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* RadioResourceStatus */
-typedef struct RadioResourceStatus {
-	DL_GBR_PRB_usage_t	 dL_GBR_PRB_usage;
-	UL_GBR_PRB_usage_t	 uL_GBR_PRB_usage;
-	DL_non_GBR_PRB_usage_t	 dL_non_GBR_PRB_usage;
-	UL_non_GBR_PRB_usage_t	 uL_non_GBR_PRB_usage;
-	DL_Total_PRB_usage_t	 dL_Total_PRB_usage;
-	UL_Total_PRB_usage_t	 uL_Total_PRB_usage;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RadioResourceStatus_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RadioResourceStatus;
-extern asn_SEQUENCE_specifics_t asn_SPC_RadioResourceStatus_specs_1;
-extern asn_TYPE_member_t asn_MBR_RadioResourceStatus_1[7];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RadioResourceStatus_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RadioframeAllocationOffset.c b/3rdparty/libe2ap/RadioframeAllocationOffset.c
deleted file mode 100644
index 89f5d35..0000000
--- a/3rdparty/libe2ap/RadioframeAllocationOffset.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RadioframeAllocationOffset.h"
-
-int
-RadioframeAllocationOffset_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 7)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_RadioframeAllocationOffset_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  7 }	/* (0..7,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_RadioframeAllocationOffset_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RadioframeAllocationOffset = {
-	"RadioframeAllocationOffset",
-	"RadioframeAllocationOffset",
-	&asn_OP_NativeInteger,
-	asn_DEF_RadioframeAllocationOffset_tags_1,
-	sizeof(asn_DEF_RadioframeAllocationOffset_tags_1)
-		/sizeof(asn_DEF_RadioframeAllocationOffset_tags_1[0]), /* 1 */
-	asn_DEF_RadioframeAllocationOffset_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RadioframeAllocationOffset_tags_1)
-		/sizeof(asn_DEF_RadioframeAllocationOffset_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RadioframeAllocationOffset_constr_1, RadioframeAllocationOffset_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/RadioframeAllocationOffset.h b/3rdparty/libe2ap/RadioframeAllocationOffset.h
deleted file mode 100644
index 7f0d9e8..0000000
--- a/3rdparty/libe2ap/RadioframeAllocationOffset.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RadioframeAllocationOffset_H_
-#define	_RadioframeAllocationOffset_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* RadioframeAllocationOffset */
-typedef long	 RadioframeAllocationOffset_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_RadioframeAllocationOffset_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_RadioframeAllocationOffset;
-asn_struct_free_f RadioframeAllocationOffset_free;
-asn_struct_print_f RadioframeAllocationOffset_print;
-asn_constr_check_f RadioframeAllocationOffset_constraint;
-ber_type_decoder_f RadioframeAllocationOffset_decode_ber;
-der_type_encoder_f RadioframeAllocationOffset_encode_der;
-xer_type_decoder_f RadioframeAllocationOffset_decode_xer;
-xer_type_encoder_f RadioframeAllocationOffset_encode_xer;
-per_type_decoder_f RadioframeAllocationOffset_decode_uper;
-per_type_encoder_f RadioframeAllocationOffset_encode_uper;
-per_type_decoder_f RadioframeAllocationOffset_decode_aper;
-per_type_encoder_f RadioframeAllocationOffset_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RadioframeAllocationOffset_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RadioframeAllocationPeriod.c b/3rdparty/libe2ap/RadioframeAllocationPeriod.c
deleted file mode 100644
index 992ba11..0000000
--- a/3rdparty/libe2ap/RadioframeAllocationPeriod.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RadioframeAllocationPeriod.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_RadioframeAllocationPeriod_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  5 }	/* (0..5,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_RadioframeAllocationPeriod_value2enum_1[] = {
-	{ 0,	2,	"n1" },
-	{ 1,	2,	"n2" },
-	{ 2,	2,	"n4" },
-	{ 3,	2,	"n8" },
-	{ 4,	3,	"n16" },
-	{ 5,	3,	"n32" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_RadioframeAllocationPeriod_enum2value_1[] = {
-	0,	/* n1(0) */
-	4,	/* n16(4) */
-	1,	/* n2(1) */
-	5,	/* n32(5) */
-	2,	/* n4(2) */
-	3	/* n8(3) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_RadioframeAllocationPeriod_specs_1 = {
-	asn_MAP_RadioframeAllocationPeriod_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_RadioframeAllocationPeriod_enum2value_1,	/* N => "tag"; sorted by N */
-	6,	/* Number of elements in the maps */
-	7,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_RadioframeAllocationPeriod_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_RadioframeAllocationPeriod = {
-	"RadioframeAllocationPeriod",
-	"RadioframeAllocationPeriod",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_RadioframeAllocationPeriod_tags_1,
-	sizeof(asn_DEF_RadioframeAllocationPeriod_tags_1)
-		/sizeof(asn_DEF_RadioframeAllocationPeriod_tags_1[0]), /* 1 */
-	asn_DEF_RadioframeAllocationPeriod_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RadioframeAllocationPeriod_tags_1)
-		/sizeof(asn_DEF_RadioframeAllocationPeriod_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_RadioframeAllocationPeriod_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_RadioframeAllocationPeriod_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RadioframeAllocationPeriod.h b/3rdparty/libe2ap/RadioframeAllocationPeriod.h
deleted file mode 100644
index e2ae86f..0000000
--- a/3rdparty/libe2ap/RadioframeAllocationPeriod.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RadioframeAllocationPeriod_H_
-#define	_RadioframeAllocationPeriod_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RadioframeAllocationPeriod {
-	RadioframeAllocationPeriod_n1	= 0,
-	RadioframeAllocationPeriod_n2	= 1,
-	RadioframeAllocationPeriod_n4	= 2,
-	RadioframeAllocationPeriod_n8	= 3,
-	RadioframeAllocationPeriod_n16	= 4,
-	RadioframeAllocationPeriod_n32	= 5
-	/*
-	 * Enumeration is extensible
-	 */
-} e_RadioframeAllocationPeriod;
-
-/* RadioframeAllocationPeriod */
-typedef long	 RadioframeAllocationPeriod_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_RadioframeAllocationPeriod_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_RadioframeAllocationPeriod;
-extern const asn_INTEGER_specifics_t asn_SPC_RadioframeAllocationPeriod_specs_1;
-asn_struct_free_f RadioframeAllocationPeriod_free;
-asn_struct_print_f RadioframeAllocationPeriod_print;
-asn_constr_check_f RadioframeAllocationPeriod_constraint;
-ber_type_decoder_f RadioframeAllocationPeriod_decode_ber;
-der_type_encoder_f RadioframeAllocationPeriod_encode_der;
-xer_type_decoder_f RadioframeAllocationPeriod_decode_xer;
-xer_type_encoder_f RadioframeAllocationPeriod_encode_xer;
-per_type_decoder_f RadioframeAllocationPeriod_decode_uper;
-per_type_encoder_f RadioframeAllocationPeriod_encode_uper;
-per_type_decoder_f RadioframeAllocationPeriod_decode_aper;
-per_type_encoder_f RadioframeAllocationPeriod_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RadioframeAllocationPeriod_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/Registration-Request.c b/3rdparty/libe2ap/Registration-Request.c
deleted file mode 100644
index 070ec5b..0000000
--- a/3rdparty/libe2ap/Registration-Request.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "Registration-Request.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_Registration_Request_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_Registration_Request_value2enum_1[] = {
-	{ 0,	5,	"start" },
-	{ 1,	4,	"stop" },
-	{ 2,	12,	"partial-stop" },
-	{ 3,	3,	"add" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_Registration_Request_enum2value_1[] = {
-	3,	/* add(3) */
-	2,	/* partial-stop(2) */
-	0,	/* start(0) */
-	1	/* stop(1) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_Registration_Request_specs_1 = {
-	asn_MAP_Registration_Request_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_Registration_Request_enum2value_1,	/* N => "tag"; sorted by N */
-	4,	/* Number of elements in the maps */
-	3,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_Registration_Request_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_Registration_Request = {
-	"Registration-Request",
-	"Registration-Request",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_Registration_Request_tags_1,
-	sizeof(asn_DEF_Registration_Request_tags_1)
-		/sizeof(asn_DEF_Registration_Request_tags_1[0]), /* 1 */
-	asn_DEF_Registration_Request_tags_1,	/* Same as above */
-	sizeof(asn_DEF_Registration_Request_tags_1)
-		/sizeof(asn_DEF_Registration_Request_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_Registration_Request_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_Registration_Request_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/Registration-Request.h b/3rdparty/libe2ap/Registration-Request.h
deleted file mode 100644
index ac7854c..0000000
--- a/3rdparty/libe2ap/Registration-Request.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_Registration_Request_H_
-#define	_Registration_Request_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum Registration_Request {
-	Registration_Request_start	= 0,
-	Registration_Request_stop	= 1,
-	/*
-	 * Enumeration is extensible
-	 */
-	Registration_Request_partial_stop	= 2,
-	Registration_Request_add	= 3
-} e_Registration_Request;
-
-/* Registration-Request */
-typedef long	 Registration_Request_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_Registration_Request;
-asn_struct_free_f Registration_Request_free;
-asn_struct_print_f Registration_Request_print;
-asn_constr_check_f Registration_Request_constraint;
-ber_type_decoder_f Registration_Request_decode_ber;
-der_type_encoder_f Registration_Request_encode_der;
-xer_type_decoder_f Registration_Request_decode_xer;
-xer_type_encoder_f Registration_Request_encode_xer;
-per_type_decoder_f Registration_Request_decode_uper;
-per_type_encoder_f Registration_Request_encode_uper;
-per_type_decoder_f Registration_Request_decode_aper;
-per_type_encoder_f Registration_Request_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _Registration_Request_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RelativeNarrowbandTxPower.c b/3rdparty/libe2ap/RelativeNarrowbandTxPower.c
deleted file mode 100644
index dede1e4..0000000
--- a/3rdparty/libe2ap/RelativeNarrowbandTxPower.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RelativeNarrowbandTxPower.h"
-
-#include "ProtocolExtensionContainer.h"
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static int
-memb_rNTP_PerPRB_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size >= 6 && size <= 110)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_p_B_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 3)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_pDCCH_InterferenceImpact_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 4)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_type_numberOfCellSpecificAntennaPorts_constr_4 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_rNTP_PerPRB_constr_2 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  7,  7,  6,  110 }	/* (SIZE(6..110,...)) */,
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_p_B_constr_9 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  3 }	/* (0..3,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_pDCCH_InterferenceImpact_constr_10 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  4 }	/* (0..4,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_numberOfCellSpecificAntennaPorts_value2enum_4[] = {
-	{ 0,	3,	"one" },
-	{ 1,	3,	"two" },
-	{ 2,	4,	"four" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_numberOfCellSpecificAntennaPorts_enum2value_4[] = {
-	2,	/* four(2) */
-	0,	/* one(0) */
-	1	/* two(1) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_numberOfCellSpecificAntennaPorts_specs_4 = {
-	asn_MAP_numberOfCellSpecificAntennaPorts_value2enum_4,	/* "tag" => N; sorted by tag */
-	asn_MAP_numberOfCellSpecificAntennaPorts_enum2value_4,	/* N => "tag"; sorted by N */
-	3,	/* Number of elements in the maps */
-	4,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_numberOfCellSpecificAntennaPorts_tags_4[] = {
-	(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_numberOfCellSpecificAntennaPorts_4 = {
-	"numberOfCellSpecificAntennaPorts",
-	"numberOfCellSpecificAntennaPorts",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_numberOfCellSpecificAntennaPorts_tags_4,
-	sizeof(asn_DEF_numberOfCellSpecificAntennaPorts_tags_4)
-		/sizeof(asn_DEF_numberOfCellSpecificAntennaPorts_tags_4[0]) - 1, /* 1 */
-	asn_DEF_numberOfCellSpecificAntennaPorts_tags_4,	/* Same as above */
-	sizeof(asn_DEF_numberOfCellSpecificAntennaPorts_tags_4)
-		/sizeof(asn_DEF_numberOfCellSpecificAntennaPorts_tags_4[0]), /* 2 */
-	{ 0, &asn_PER_type_numberOfCellSpecificAntennaPorts_constr_4, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_numberOfCellSpecificAntennaPorts_specs_4	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_RelativeNarrowbandTxPower_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RelativeNarrowbandTxPower, rNTP_PerPRB),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_rNTP_PerPRB_constr_2,  memb_rNTP_PerPRB_constraint_1 },
-		0, 0, /* No default value */
-		"rNTP-PerPRB"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RelativeNarrowbandTxPower, rNTP_Threshold),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_RNTP_Threshold,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"rNTP-Threshold"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RelativeNarrowbandTxPower, numberOfCellSpecificAntennaPorts),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_numberOfCellSpecificAntennaPorts_4,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"numberOfCellSpecificAntennaPorts"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RelativeNarrowbandTxPower, p_B),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_p_B_constr_9,  memb_p_B_constraint_1 },
-		0, 0, /* No default value */
-		"p-B"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RelativeNarrowbandTxPower, pDCCH_InterferenceImpact),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_pDCCH_InterferenceImpact_constr_10,  memb_pDCCH_InterferenceImpact_constraint_1 },
-		0, 0, /* No default value */
-		"pDCCH-InterferenceImpact"
-		},
-	{ ATF_POINTER, 1, offsetof(struct RelativeNarrowbandTxPower, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P60,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_RelativeNarrowbandTxPower_oms_1[] = { 5 };
-static const ber_tlv_tag_t asn_DEF_RelativeNarrowbandTxPower_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_RelativeNarrowbandTxPower_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rNTP-PerPRB */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* rNTP-Threshold */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* numberOfCellSpecificAntennaPorts */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* p-B */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* pDCCH-InterferenceImpact */
-    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_RelativeNarrowbandTxPower_specs_1 = {
-	sizeof(struct RelativeNarrowbandTxPower),
-	offsetof(struct RelativeNarrowbandTxPower, _asn_ctx),
-	asn_MAP_RelativeNarrowbandTxPower_tag2el_1,
-	6,	/* Count of tags in the map */
-	asn_MAP_RelativeNarrowbandTxPower_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	6,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_RelativeNarrowbandTxPower = {
-	"RelativeNarrowbandTxPower",
-	"RelativeNarrowbandTxPower",
-	&asn_OP_SEQUENCE,
-	asn_DEF_RelativeNarrowbandTxPower_tags_1,
-	sizeof(asn_DEF_RelativeNarrowbandTxPower_tags_1)
-		/sizeof(asn_DEF_RelativeNarrowbandTxPower_tags_1[0]), /* 1 */
-	asn_DEF_RelativeNarrowbandTxPower_tags_1,	/* Same as above */
-	sizeof(asn_DEF_RelativeNarrowbandTxPower_tags_1)
-		/sizeof(asn_DEF_RelativeNarrowbandTxPower_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_RelativeNarrowbandTxPower_1,
-	6,	/* Elements count */
-	&asn_SPC_RelativeNarrowbandTxPower_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RelativeNarrowbandTxPower.h b/3rdparty/libe2ap/RelativeNarrowbandTxPower.h
deleted file mode 100644
index f3f8538..0000000
--- a/3rdparty/libe2ap/RelativeNarrowbandTxPower.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RelativeNarrowbandTxPower_H_
-#define	_RelativeNarrowbandTxPower_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-#include "RNTP-Threshold.h"
-#include "NativeEnumerated.h"
-#include "NativeInteger.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RelativeNarrowbandTxPower__numberOfCellSpecificAntennaPorts {
-	RelativeNarrowbandTxPower__numberOfCellSpecificAntennaPorts_one	= 0,
-	RelativeNarrowbandTxPower__numberOfCellSpecificAntennaPorts_two	= 1,
-	RelativeNarrowbandTxPower__numberOfCellSpecificAntennaPorts_four	= 2
-	/*
-	 * Enumeration is extensible
-	 */
-} e_RelativeNarrowbandTxPower__numberOfCellSpecificAntennaPorts;
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* RelativeNarrowbandTxPower */
-typedef struct RelativeNarrowbandTxPower {
-	BIT_STRING_t	 rNTP_PerPRB;
-	RNTP_Threshold_t	 rNTP_Threshold;
-	long	 numberOfCellSpecificAntennaPorts;
-	long	 p_B;
-	long	 pDCCH_InterferenceImpact;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RelativeNarrowbandTxPower_t;
-
-/* Implementation */
-/* extern asn_TYPE_descriptor_t asn_DEF_numberOfCellSpecificAntennaPorts_4;	// (Use -fall-defs-global to expose) */
-extern asn_TYPE_descriptor_t asn_DEF_RelativeNarrowbandTxPower;
-extern asn_SEQUENCE_specifics_t asn_SPC_RelativeNarrowbandTxPower_specs_1;
-extern asn_TYPE_member_t asn_MBR_RelativeNarrowbandTxPower_1[6];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RelativeNarrowbandTxPower_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ReplacingCellsList-Item.c b/3rdparty/libe2ap/ReplacingCellsList-Item.c
deleted file mode 100644
index 68bedae..0000000
--- a/3rdparty/libe2ap/ReplacingCellsList-Item.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ReplacingCellsList-Item.h"
-
-asn_TYPE_member_t asn_MBR_ReplacingCellsList_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ReplacingCellsList_Item, eCGI),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"eCGI"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ReplacingCellsList_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ReplacingCellsList_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* eCGI */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ReplacingCellsList_Item_specs_1 = {
-	sizeof(struct ReplacingCellsList_Item),
-	offsetof(struct ReplacingCellsList_Item, _asn_ctx),
-	asn_MAP_ReplacingCellsList_Item_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ReplacingCellsList_Item = {
-	"ReplacingCellsList-Item",
-	"ReplacingCellsList-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ReplacingCellsList_Item_tags_1,
-	sizeof(asn_DEF_ReplacingCellsList_Item_tags_1)
-		/sizeof(asn_DEF_ReplacingCellsList_Item_tags_1[0]), /* 1 */
-	asn_DEF_ReplacingCellsList_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ReplacingCellsList_Item_tags_1)
-		/sizeof(asn_DEF_ReplacingCellsList_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ReplacingCellsList_Item_1,
-	1,	/* Elements count */
-	&asn_SPC_ReplacingCellsList_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ReplacingCellsList-Item.h b/3rdparty/libe2ap/ReplacingCellsList-Item.h
deleted file mode 100644
index 950a5ca..0000000
--- a/3rdparty/libe2ap/ReplacingCellsList-Item.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ReplacingCellsList_Item_H_
-#define	_ReplacingCellsList_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ECGI.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ReplacingCellsList-Item */
-typedef struct ReplacingCellsList_Item {
-	ECGI_t	 eCGI;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ReplacingCellsList_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ReplacingCellsList_Item;
-extern asn_SEQUENCE_specifics_t asn_SPC_ReplacingCellsList_Item_specs_1;
-extern asn_TYPE_member_t asn_MBR_ReplacingCellsList_Item_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ReplacingCellsList_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ReplacingCellsList.c b/3rdparty/libe2ap/ReplacingCellsList.c
deleted file mode 100644
index 4f4030a..0000000
--- a/3rdparty/libe2ap/ReplacingCellsList.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ReplacingCellsList.h"
-
-#include "ReplacingCellsList-Item.h"
-asn_per_constraints_t asn_PER_type_ReplacingCellsList_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 9,  9,  0,  256 }	/* (SIZE(0..256)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_ReplacingCellsList_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ReplacingCellsList_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ReplacingCellsList_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_ReplacingCellsList_specs_1 = {
-	sizeof(struct ReplacingCellsList),
-	offsetof(struct ReplacingCellsList, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ReplacingCellsList = {
-	"ReplacingCellsList",
-	"ReplacingCellsList",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ReplacingCellsList_tags_1,
-	sizeof(asn_DEF_ReplacingCellsList_tags_1)
-		/sizeof(asn_DEF_ReplacingCellsList_tags_1[0]), /* 1 */
-	asn_DEF_ReplacingCellsList_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ReplacingCellsList_tags_1)
-		/sizeof(asn_DEF_ReplacingCellsList_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ReplacingCellsList_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_ReplacingCellsList_1,
-	1,	/* Single element */
-	&asn_SPC_ReplacingCellsList_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ReplacingCellsList.h b/3rdparty/libe2ap/ReplacingCellsList.h
deleted file mode 100644
index 4a8e96e..0000000
--- a/3rdparty/libe2ap/ReplacingCellsList.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ReplacingCellsList_H_
-#define	_ReplacingCellsList_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ReplacingCellsList_Item;
-
-/* ReplacingCellsList */
-typedef struct ReplacingCellsList {
-	A_SEQUENCE_OF(struct ReplacingCellsList_Item) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ReplacingCellsList_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ReplacingCellsList;
-extern asn_SET_OF_specifics_t asn_SPC_ReplacingCellsList_specs_1;
-extern asn_TYPE_member_t asn_MBR_ReplacingCellsList_1[1];
-extern asn_per_constraints_t asn_PER_type_ReplacingCellsList_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ReplacingCellsList_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ReportCharacteristics.c b/3rdparty/libe2ap/ReportCharacteristics.c
deleted file mode 100644
index d37aab1..0000000
--- a/3rdparty/libe2ap/ReportCharacteristics.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ReportCharacteristics.h"
-
-int
-ReportCharacteristics_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 32)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using BIT_STRING,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_ReportCharacteristics_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  32,  32 }	/* (SIZE(32..32)) */,
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_ReportCharacteristics_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ReportCharacteristics = {
-	"ReportCharacteristics",
-	"ReportCharacteristics",
-	&asn_OP_BIT_STRING,
-	asn_DEF_ReportCharacteristics_tags_1,
-	sizeof(asn_DEF_ReportCharacteristics_tags_1)
-		/sizeof(asn_DEF_ReportCharacteristics_tags_1[0]), /* 1 */
-	asn_DEF_ReportCharacteristics_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ReportCharacteristics_tags_1)
-		/sizeof(asn_DEF_ReportCharacteristics_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ReportCharacteristics_constr_1, ReportCharacteristics_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_BIT_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ReportCharacteristics.h b/3rdparty/libe2ap/ReportCharacteristics.h
deleted file mode 100644
index f3035c5..0000000
--- a/3rdparty/libe2ap/ReportCharacteristics.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ReportCharacteristics_H_
-#define	_ReportCharacteristics_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ReportCharacteristics */
-typedef BIT_STRING_t	 ReportCharacteristics_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_ReportCharacteristics_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_ReportCharacteristics;
-asn_struct_free_f ReportCharacteristics_free;
-asn_struct_print_f ReportCharacteristics_print;
-asn_constr_check_f ReportCharacteristics_constraint;
-ber_type_decoder_f ReportCharacteristics_decode_ber;
-der_type_encoder_f ReportCharacteristics_encode_der;
-xer_type_decoder_f ReportCharacteristics_decode_xer;
-xer_type_encoder_f ReportCharacteristics_encode_xer;
-per_type_decoder_f ReportCharacteristics_decode_uper;
-per_type_encoder_f ReportCharacteristics_encode_uper;
-per_type_decoder_f ReportCharacteristics_decode_aper;
-per_type_encoder_f ReportCharacteristics_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ReportCharacteristics_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ReportingPeriodicity.c b/3rdparty/libe2ap/ReportingPeriodicity.c
deleted file mode 100644
index 550fc4d..0000000
--- a/3rdparty/libe2ap/ReportingPeriodicity.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ReportingPeriodicity.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_ReportingPeriodicity_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  3 }	/* (0..3,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_ReportingPeriodicity_value2enum_1[] = {
-	{ 0,	15,	"one-thousand-ms" },
-	{ 1,	15,	"two-thousand-ms" },
-	{ 2,	16,	"five-thousand-ms" },
-	{ 3,	15,	"ten-thousand-ms" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_ReportingPeriodicity_enum2value_1[] = {
-	2,	/* five-thousand-ms(2) */
-	0,	/* one-thousand-ms(0) */
-	3,	/* ten-thousand-ms(3) */
-	1	/* two-thousand-ms(1) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_ReportingPeriodicity_specs_1 = {
-	asn_MAP_ReportingPeriodicity_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_ReportingPeriodicity_enum2value_1,	/* N => "tag"; sorted by N */
-	4,	/* Number of elements in the maps */
-	5,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_ReportingPeriodicity_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ReportingPeriodicity = {
-	"ReportingPeriodicity",
-	"ReportingPeriodicity",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_ReportingPeriodicity_tags_1,
-	sizeof(asn_DEF_ReportingPeriodicity_tags_1)
-		/sizeof(asn_DEF_ReportingPeriodicity_tags_1[0]), /* 1 */
-	asn_DEF_ReportingPeriodicity_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ReportingPeriodicity_tags_1)
-		/sizeof(asn_DEF_ReportingPeriodicity_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ReportingPeriodicity_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_ReportingPeriodicity_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ReportingPeriodicity.h b/3rdparty/libe2ap/ReportingPeriodicity.h
deleted file mode 100644
index 2983b45..0000000
--- a/3rdparty/libe2ap/ReportingPeriodicity.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ReportingPeriodicity_H_
-#define	_ReportingPeriodicity_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum ReportingPeriodicity {
-	ReportingPeriodicity_one_thousand_ms	= 0,
-	ReportingPeriodicity_two_thousand_ms	= 1,
-	ReportingPeriodicity_five_thousand_ms	= 2,
-	ReportingPeriodicity_ten_thousand_ms	= 3
-	/*
-	 * Enumeration is extensible
-	 */
-} e_ReportingPeriodicity;
-
-/* ReportingPeriodicity */
-typedef long	 ReportingPeriodicity_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ReportingPeriodicity;
-asn_struct_free_f ReportingPeriodicity_free;
-asn_struct_print_f ReportingPeriodicity_print;
-asn_constr_check_f ReportingPeriodicity_constraint;
-ber_type_decoder_f ReportingPeriodicity_decode_ber;
-der_type_encoder_f ReportingPeriodicity_encode_der;
-xer_type_decoder_f ReportingPeriodicity_decode_xer;
-xer_type_encoder_f ReportingPeriodicity_encode_xer;
-per_type_decoder_f ReportingPeriodicity_decode_uper;
-per_type_encoder_f ReportingPeriodicity_encode_uper;
-per_type_decoder_f ReportingPeriodicity_decode_aper;
-per_type_encoder_f ReportingPeriodicity_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ReportingPeriodicity_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ReportingPeriodicityCSIR.c b/3rdparty/libe2ap/ReportingPeriodicityCSIR.c
deleted file mode 100644
index 9dd5270..0000000
--- a/3rdparty/libe2ap/ReportingPeriodicityCSIR.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ReportingPeriodicityCSIR.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_ReportingPeriodicityCSIR_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  4 }	/* (0..4,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_ReportingPeriodicityCSIR_value2enum_1[] = {
-	{ 0,	3,	"ms5" },
-	{ 1,	4,	"ms10" },
-	{ 2,	4,	"ms20" },
-	{ 3,	4,	"ms40" },
-	{ 4,	4,	"ms80" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_ReportingPeriodicityCSIR_enum2value_1[] = {
-	1,	/* ms10(1) */
-	2,	/* ms20(2) */
-	3,	/* ms40(3) */
-	0,	/* ms5(0) */
-	4	/* ms80(4) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_ReportingPeriodicityCSIR_specs_1 = {
-	asn_MAP_ReportingPeriodicityCSIR_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_ReportingPeriodicityCSIR_enum2value_1,	/* N => "tag"; sorted by N */
-	5,	/* Number of elements in the maps */
-	6,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_ReportingPeriodicityCSIR_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ReportingPeriodicityCSIR = {
-	"ReportingPeriodicityCSIR",
-	"ReportingPeriodicityCSIR",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_ReportingPeriodicityCSIR_tags_1,
-	sizeof(asn_DEF_ReportingPeriodicityCSIR_tags_1)
-		/sizeof(asn_DEF_ReportingPeriodicityCSIR_tags_1[0]), /* 1 */
-	asn_DEF_ReportingPeriodicityCSIR_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ReportingPeriodicityCSIR_tags_1)
-		/sizeof(asn_DEF_ReportingPeriodicityCSIR_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ReportingPeriodicityCSIR_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_ReportingPeriodicityCSIR_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ReportingPeriodicityCSIR.h b/3rdparty/libe2ap/ReportingPeriodicityCSIR.h
deleted file mode 100644
index a8db48e..0000000
--- a/3rdparty/libe2ap/ReportingPeriodicityCSIR.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ReportingPeriodicityCSIR_H_
-#define	_ReportingPeriodicityCSIR_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum ReportingPeriodicityCSIR {
-	ReportingPeriodicityCSIR_ms5	= 0,
-	ReportingPeriodicityCSIR_ms10	= 1,
-	ReportingPeriodicityCSIR_ms20	= 2,
-	ReportingPeriodicityCSIR_ms40	= 3,
-	ReportingPeriodicityCSIR_ms80	= 4
-	/*
-	 * Enumeration is extensible
-	 */
-} e_ReportingPeriodicityCSIR;
-
-/* ReportingPeriodicityCSIR */
-typedef long	 ReportingPeriodicityCSIR_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ReportingPeriodicityCSIR;
-asn_struct_free_f ReportingPeriodicityCSIR_free;
-asn_struct_print_f ReportingPeriodicityCSIR_print;
-asn_constr_check_f ReportingPeriodicityCSIR_constraint;
-ber_type_decoder_f ReportingPeriodicityCSIR_decode_ber;
-der_type_encoder_f ReportingPeriodicityCSIR_encode_der;
-xer_type_decoder_f ReportingPeriodicityCSIR_decode_xer;
-xer_type_encoder_f ReportingPeriodicityCSIR_encode_xer;
-per_type_decoder_f ReportingPeriodicityCSIR_decode_uper;
-per_type_encoder_f ReportingPeriodicityCSIR_encode_uper;
-per_type_decoder_f ReportingPeriodicityCSIR_decode_aper;
-per_type_encoder_f ReportingPeriodicityCSIR_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ReportingPeriodicityCSIR_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ReportingPeriodicityRSRPMR.c b/3rdparty/libe2ap/ReportingPeriodicityRSRPMR.c
deleted file mode 100644
index a96a95d..0000000
--- a/3rdparty/libe2ap/ReportingPeriodicityRSRPMR.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ReportingPeriodicityRSRPMR.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_ReportingPeriodicityRSRPMR_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  3 }	/* (0..3,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_ReportingPeriodicityRSRPMR_value2enum_1[] = {
-	{ 0,	17,	"one-hundred-20-ms" },
-	{ 1,	17,	"two-hundred-40-ms" },
-	{ 2,	18,	"four-hundred-80-ms" },
-	{ 3,	17,	"six-hundred-40-ms" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_ReportingPeriodicityRSRPMR_enum2value_1[] = {
-	2,	/* four-hundred-80-ms(2) */
-	0,	/* one-hundred-20-ms(0) */
-	3,	/* six-hundred-40-ms(3) */
-	1	/* two-hundred-40-ms(1) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_ReportingPeriodicityRSRPMR_specs_1 = {
-	asn_MAP_ReportingPeriodicityRSRPMR_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_ReportingPeriodicityRSRPMR_enum2value_1,	/* N => "tag"; sorted by N */
-	4,	/* Number of elements in the maps */
-	5,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_ReportingPeriodicityRSRPMR_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ReportingPeriodicityRSRPMR = {
-	"ReportingPeriodicityRSRPMR",
-	"ReportingPeriodicityRSRPMR",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_ReportingPeriodicityRSRPMR_tags_1,
-	sizeof(asn_DEF_ReportingPeriodicityRSRPMR_tags_1)
-		/sizeof(asn_DEF_ReportingPeriodicityRSRPMR_tags_1[0]), /* 1 */
-	asn_DEF_ReportingPeriodicityRSRPMR_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ReportingPeriodicityRSRPMR_tags_1)
-		/sizeof(asn_DEF_ReportingPeriodicityRSRPMR_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ReportingPeriodicityRSRPMR_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_ReportingPeriodicityRSRPMR_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ReportingPeriodicityRSRPMR.h b/3rdparty/libe2ap/ReportingPeriodicityRSRPMR.h
deleted file mode 100644
index e3e230f..0000000
--- a/3rdparty/libe2ap/ReportingPeriodicityRSRPMR.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ReportingPeriodicityRSRPMR_H_
-#define	_ReportingPeriodicityRSRPMR_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum ReportingPeriodicityRSRPMR {
-	ReportingPeriodicityRSRPMR_one_hundred_20_ms	= 0,
-	ReportingPeriodicityRSRPMR_two_hundred_40_ms	= 1,
-	ReportingPeriodicityRSRPMR_four_hundred_80_ms	= 2,
-	ReportingPeriodicityRSRPMR_six_hundred_40_ms	= 3
-	/*
-	 * Enumeration is extensible
-	 */
-} e_ReportingPeriodicityRSRPMR;
-
-/* ReportingPeriodicityRSRPMR */
-typedef long	 ReportingPeriodicityRSRPMR_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ReportingPeriodicityRSRPMR;
-asn_struct_free_f ReportingPeriodicityRSRPMR_free;
-asn_struct_print_f ReportingPeriodicityRSRPMR_print;
-asn_constr_check_f ReportingPeriodicityRSRPMR_constraint;
-ber_type_decoder_f ReportingPeriodicityRSRPMR_decode_ber;
-der_type_encoder_f ReportingPeriodicityRSRPMR_encode_der;
-xer_type_decoder_f ReportingPeriodicityRSRPMR_decode_xer;
-xer_type_encoder_f ReportingPeriodicityRSRPMR_encode_xer;
-per_type_decoder_f ReportingPeriodicityRSRPMR_decode_uper;
-per_type_encoder_f ReportingPeriodicityRSRPMR_encode_uper;
-per_type_decoder_f ReportingPeriodicityRSRPMR_decode_aper;
-per_type_encoder_f ReportingPeriodicityRSRPMR_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ReportingPeriodicityRSRPMR_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ResetRequest.c b/3rdparty/libe2ap/ResetRequest.c
deleted file mode 100644
index a9ec20e..0000000
--- a/3rdparty/libe2ap/ResetRequest.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ResetRequest.h"
-
-asn_TYPE_member_t asn_MBR_ResetRequest_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResetRequest, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P15,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ResetRequest_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResetRequest_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResetRequest_specs_1 = {
-	sizeof(struct ResetRequest),
-	offsetof(struct ResetRequest, _asn_ctx),
-	asn_MAP_ResetRequest_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResetRequest = {
-	"ResetRequest",
-	"ResetRequest",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResetRequest_tags_1,
-	sizeof(asn_DEF_ResetRequest_tags_1)
-		/sizeof(asn_DEF_ResetRequest_tags_1[0]), /* 1 */
-	asn_DEF_ResetRequest_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ResetRequest_tags_1)
-		/sizeof(asn_DEF_ResetRequest_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResetRequest_1,
-	1,	/* Elements count */
-	&asn_SPC_ResetRequest_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ResetRequest.h b/3rdparty/libe2ap/ResetRequest.h
deleted file mode 100644
index 46db3be..0000000
--- a/3rdparty/libe2ap/ResetRequest.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ResetRequest_H_
-#define	_ResetRequest_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ResetRequest */
-typedef struct ResetRequest {
-	ProtocolIE_Container_8807P15_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResetRequest_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ResetRequest;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResetRequest_specs_1;
-extern asn_TYPE_member_t asn_MBR_ResetRequest_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ResetRequest_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ResetResponse.c b/3rdparty/libe2ap/ResetResponse.c
deleted file mode 100644
index ba2450c..0000000
--- a/3rdparty/libe2ap/ResetResponse.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ResetResponse.h"
-
-asn_TYPE_member_t asn_MBR_ResetResponse_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResetResponse, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P16,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ResetResponse_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResetResponse_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResetResponse_specs_1 = {
-	sizeof(struct ResetResponse),
-	offsetof(struct ResetResponse, _asn_ctx),
-	asn_MAP_ResetResponse_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResetResponse = {
-	"ResetResponse",
-	"ResetResponse",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResetResponse_tags_1,
-	sizeof(asn_DEF_ResetResponse_tags_1)
-		/sizeof(asn_DEF_ResetResponse_tags_1[0]), /* 1 */
-	asn_DEF_ResetResponse_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ResetResponse_tags_1)
-		/sizeof(asn_DEF_ResetResponse_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResetResponse_1,
-	1,	/* Elements count */
-	&asn_SPC_ResetResponse_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ResetResponse.h b/3rdparty/libe2ap/ResetResponse.h
deleted file mode 100644
index cd6433b..0000000
--- a/3rdparty/libe2ap/ResetResponse.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ResetResponse_H_
-#define	_ResetResponse_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ResetResponse */
-typedef struct ResetResponse {
-	ProtocolIE_Container_8807P16_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResetResponse_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ResetResponse;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResetResponse_specs_1;
-extern asn_TYPE_member_t asn_MBR_ResetResponse_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ResetResponse_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ResourceStatusFailure.c b/3rdparty/libe2ap/ResourceStatusFailure.c
deleted file mode 100644
index c826714..0000000
--- a/3rdparty/libe2ap/ResourceStatusFailure.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ResourceStatusFailure.h"
-
-asn_TYPE_member_t asn_MBR_ResourceStatusFailure_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusFailure, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P26,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ResourceStatusFailure_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResourceStatusFailure_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusFailure_specs_1 = {
-	sizeof(struct ResourceStatusFailure),
-	offsetof(struct ResourceStatusFailure, _asn_ctx),
-	asn_MAP_ResourceStatusFailure_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResourceStatusFailure = {
-	"ResourceStatusFailure",
-	"ResourceStatusFailure",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResourceStatusFailure_tags_1,
-	sizeof(asn_DEF_ResourceStatusFailure_tags_1)
-		/sizeof(asn_DEF_ResourceStatusFailure_tags_1[0]), /* 1 */
-	asn_DEF_ResourceStatusFailure_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ResourceStatusFailure_tags_1)
-		/sizeof(asn_DEF_ResourceStatusFailure_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResourceStatusFailure_1,
-	1,	/* Elements count */
-	&asn_SPC_ResourceStatusFailure_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ResourceStatusFailure.h b/3rdparty/libe2ap/ResourceStatusFailure.h
deleted file mode 100644
index 5104608..0000000
--- a/3rdparty/libe2ap/ResourceStatusFailure.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ResourceStatusFailure_H_
-#define	_ResourceStatusFailure_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ResourceStatusFailure */
-typedef struct ResourceStatusFailure {
-	ProtocolIE_Container_8807P26_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResourceStatusFailure_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ResourceStatusFailure;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusFailure_specs_1;
-extern asn_TYPE_member_t asn_MBR_ResourceStatusFailure_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ResourceStatusFailure_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ResourceStatusRequest.c b/3rdparty/libe2ap/ResourceStatusRequest.c
deleted file mode 100644
index 2ffceca..0000000
--- a/3rdparty/libe2ap/ResourceStatusRequest.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ResourceStatusRequest.h"
-
-asn_TYPE_member_t asn_MBR_ResourceStatusRequest_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusRequest, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P24,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ResourceStatusRequest_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResourceStatusRequest_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusRequest_specs_1 = {
-	sizeof(struct ResourceStatusRequest),
-	offsetof(struct ResourceStatusRequest, _asn_ctx),
-	asn_MAP_ResourceStatusRequest_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResourceStatusRequest = {
-	"ResourceStatusRequest",
-	"ResourceStatusRequest",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResourceStatusRequest_tags_1,
-	sizeof(asn_DEF_ResourceStatusRequest_tags_1)
-		/sizeof(asn_DEF_ResourceStatusRequest_tags_1[0]), /* 1 */
-	asn_DEF_ResourceStatusRequest_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ResourceStatusRequest_tags_1)
-		/sizeof(asn_DEF_ResourceStatusRequest_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResourceStatusRequest_1,
-	1,	/* Elements count */
-	&asn_SPC_ResourceStatusRequest_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ResourceStatusRequest.h b/3rdparty/libe2ap/ResourceStatusRequest.h
deleted file mode 100644
index a71db62..0000000
--- a/3rdparty/libe2ap/ResourceStatusRequest.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ResourceStatusRequest_H_
-#define	_ResourceStatusRequest_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ResourceStatusRequest */
-typedef struct ResourceStatusRequest {
-	ProtocolIE_Container_8807P24_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResourceStatusRequest_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ResourceStatusRequest;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusRequest_specs_1;
-extern asn_TYPE_member_t asn_MBR_ResourceStatusRequest_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ResourceStatusRequest_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ResourceStatusResponse.c b/3rdparty/libe2ap/ResourceStatusResponse.c
deleted file mode 100644
index 388085d..0000000
--- a/3rdparty/libe2ap/ResourceStatusResponse.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ResourceStatusResponse.h"
-
-asn_TYPE_member_t asn_MBR_ResourceStatusResponse_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusResponse, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P25,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ResourceStatusResponse_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResourceStatusResponse_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusResponse_specs_1 = {
-	sizeof(struct ResourceStatusResponse),
-	offsetof(struct ResourceStatusResponse, _asn_ctx),
-	asn_MAP_ResourceStatusResponse_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResourceStatusResponse = {
-	"ResourceStatusResponse",
-	"ResourceStatusResponse",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResourceStatusResponse_tags_1,
-	sizeof(asn_DEF_ResourceStatusResponse_tags_1)
-		/sizeof(asn_DEF_ResourceStatusResponse_tags_1[0]), /* 1 */
-	asn_DEF_ResourceStatusResponse_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ResourceStatusResponse_tags_1)
-		/sizeof(asn_DEF_ResourceStatusResponse_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResourceStatusResponse_1,
-	1,	/* Elements count */
-	&asn_SPC_ResourceStatusResponse_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ResourceStatusResponse.h b/3rdparty/libe2ap/ResourceStatusResponse.h
deleted file mode 100644
index 0b72de3..0000000
--- a/3rdparty/libe2ap/ResourceStatusResponse.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ResourceStatusResponse_H_
-#define	_ResourceStatusResponse_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ResourceStatusResponse */
-typedef struct ResourceStatusResponse {
-	ProtocolIE_Container_8807P25_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResourceStatusResponse_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ResourceStatusResponse;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusResponse_specs_1;
-extern asn_TYPE_member_t asn_MBR_ResourceStatusResponse_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ResourceStatusResponse_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ResourceStatusUpdate.c b/3rdparty/libe2ap/ResourceStatusUpdate.c
deleted file mode 100644
index fd51f9f..0000000
--- a/3rdparty/libe2ap/ResourceStatusUpdate.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ResourceStatusUpdate.h"
-
-asn_TYPE_member_t asn_MBR_ResourceStatusUpdate_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResourceStatusUpdate, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P27,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ResourceStatusUpdate_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResourceStatusUpdate_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusUpdate_specs_1 = {
-	sizeof(struct ResourceStatusUpdate),
-	offsetof(struct ResourceStatusUpdate, _asn_ctx),
-	asn_MAP_ResourceStatusUpdate_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResourceStatusUpdate = {
-	"ResourceStatusUpdate",
-	"ResourceStatusUpdate",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResourceStatusUpdate_tags_1,
-	sizeof(asn_DEF_ResourceStatusUpdate_tags_1)
-		/sizeof(asn_DEF_ResourceStatusUpdate_tags_1[0]), /* 1 */
-	asn_DEF_ResourceStatusUpdate_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ResourceStatusUpdate_tags_1)
-		/sizeof(asn_DEF_ResourceStatusUpdate_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResourceStatusUpdate_1,
-	1,	/* Elements count */
-	&asn_SPC_ResourceStatusUpdate_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ResourceStatusUpdate.h b/3rdparty/libe2ap/ResourceStatusUpdate.h
deleted file mode 100644
index f197925..0000000
--- a/3rdparty/libe2ap/ResourceStatusUpdate.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ResourceStatusUpdate_H_
-#define	_ResourceStatusUpdate_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ResourceStatusUpdate */
-typedef struct ResourceStatusUpdate {
-	ProtocolIE_Container_8807P27_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResourceStatusUpdate_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ResourceStatusUpdate;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResourceStatusUpdate_specs_1;
-extern asn_TYPE_member_t asn_MBR_ResourceStatusUpdate_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ResourceStatusUpdate_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ResourceType.c b/3rdparty/libe2ap/ResourceType.c
deleted file mode 100644
index 012eb3b..0000000
--- a/3rdparty/libe2ap/ResourceType.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ResourceType.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_ResourceType_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_ResourceType_value2enum_1[] = {
-	{ 0,	14,	"downlinknonCRS" },
-	{ 1,	3,	"cRS" },
-	{ 2,	6,	"uplink" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_ResourceType_enum2value_1[] = {
-	1,	/* cRS(1) */
-	0,	/* downlinknonCRS(0) */
-	2	/* uplink(2) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_ResourceType_specs_1 = {
-	asn_MAP_ResourceType_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_ResourceType_enum2value_1,	/* N => "tag"; sorted by N */
-	3,	/* Number of elements in the maps */
-	4,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_ResourceType_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_ResourceType = {
-	"ResourceType",
-	"ResourceType",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_ResourceType_tags_1,
-	sizeof(asn_DEF_ResourceType_tags_1)
-		/sizeof(asn_DEF_ResourceType_tags_1[0]), /* 1 */
-	asn_DEF_ResourceType_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ResourceType_tags_1)
-		/sizeof(asn_DEF_ResourceType_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ResourceType_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_ResourceType_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ResourceType.h b/3rdparty/libe2ap/ResourceType.h
deleted file mode 100644
index 9ffb882..0000000
--- a/3rdparty/libe2ap/ResourceType.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ResourceType_H_
-#define	_ResourceType_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum ResourceType {
-	ResourceType_downlinknonCRS	= 0,
-	ResourceType_cRS	= 1,
-	ResourceType_uplink	= 2
-	/*
-	 * Enumeration is extensible
-	 */
-} e_ResourceType;
-
-/* ResourceType */
-typedef long	 ResourceType_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_ResourceType_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_ResourceType;
-extern const asn_INTEGER_specifics_t asn_SPC_ResourceType_specs_1;
-asn_struct_free_f ResourceType_free;
-asn_struct_print_f ResourceType_print;
-asn_constr_check_f ResourceType_constraint;
-ber_type_decoder_f ResourceType_decode_ber;
-der_type_encoder_f ResourceType_encode_der;
-xer_type_decoder_f ResourceType_decode_xer;
-xer_type_encoder_f ResourceType_encode_xer;
-per_type_decoder_f ResourceType_decode_uper;
-per_type_encoder_f ResourceType_encode_uper;
-per_type_decoder_f ResourceType_decode_aper;
-per_type_encoder_f ResourceType_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ResourceType_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RespondingNodeType-EndcConfigUpdate.c b/3rdparty/libe2ap/RespondingNodeType-EndcConfigUpdate.c
deleted file mode 100644
index 249a1dc..0000000
--- a/3rdparty/libe2ap/RespondingNodeType-EndcConfigUpdate.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RespondingNodeType-EndcConfigUpdate.h"
-
-static asn_per_constraints_t asn_PER_type_RespondingNodeType_EndcConfigUpdate_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_RespondingNodeType_EndcConfigUpdate_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RespondingNodeType_EndcConfigUpdate, choice.respond_eNB),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P40,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"respond-eNB"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RespondingNodeType_EndcConfigUpdate, choice.respond_en_gNB),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P41,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"respond-en-gNB"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_RespondingNodeType_EndcConfigUpdate_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* respond-eNB */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* respond-en-gNB */
-};
-static asn_CHOICE_specifics_t asn_SPC_RespondingNodeType_EndcConfigUpdate_specs_1 = {
-	sizeof(struct RespondingNodeType_EndcConfigUpdate),
-	offsetof(struct RespondingNodeType_EndcConfigUpdate, _asn_ctx),
-	offsetof(struct RespondingNodeType_EndcConfigUpdate, present),
-	sizeof(((struct RespondingNodeType_EndcConfigUpdate *)0)->present),
-	asn_MAP_RespondingNodeType_EndcConfigUpdate_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0,
-	2	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_RespondingNodeType_EndcConfigUpdate = {
-	"RespondingNodeType-EndcConfigUpdate",
-	"RespondingNodeType-EndcConfigUpdate",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_RespondingNodeType_EndcConfigUpdate_constr_1, CHOICE_constraint },
-	asn_MBR_RespondingNodeType_EndcConfigUpdate_1,
-	2,	/* Elements count */
-	&asn_SPC_RespondingNodeType_EndcConfigUpdate_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RespondingNodeType-EndcConfigUpdate.h b/3rdparty/libe2ap/RespondingNodeType-EndcConfigUpdate.h
deleted file mode 100644
index adc8567..0000000
--- a/3rdparty/libe2ap/RespondingNodeType-EndcConfigUpdate.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RespondingNodeType_EndcConfigUpdate_H_
-#define	_RespondingNodeType_EndcConfigUpdate_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RespondingNodeType_EndcConfigUpdate_PR {
-	RespondingNodeType_EndcConfigUpdate_PR_NOTHING,	/* No components present */
-	RespondingNodeType_EndcConfigUpdate_PR_respond_eNB,
-	RespondingNodeType_EndcConfigUpdate_PR_respond_en_gNB
-	/* Extensions may appear below */
-	
-} RespondingNodeType_EndcConfigUpdate_PR;
-
-/* RespondingNodeType-EndcConfigUpdate */
-typedef struct RespondingNodeType_EndcConfigUpdate {
-	RespondingNodeType_EndcConfigUpdate_PR present;
-	union RespondingNodeType_EndcConfigUpdate_u {
-		ProtocolIE_Container_8807P40_t	 respond_eNB;
-		ProtocolIE_Container_8807P41_t	 respond_en_gNB;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RespondingNodeType_EndcConfigUpdate_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RespondingNodeType_EndcConfigUpdate;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RespondingNodeType_EndcConfigUpdate_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/RespondingNodeType-EndcX2Setup.c b/3rdparty/libe2ap/RespondingNodeType-EndcX2Setup.c
deleted file mode 100644
index 636e49e..0000000
--- a/3rdparty/libe2ap/RespondingNodeType-EndcX2Setup.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "RespondingNodeType-EndcX2Setup.h"
-
-static asn_per_constraints_t asn_PER_type_RespondingNodeType_EndcX2Setup_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_RespondingNodeType_EndcX2Setup_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct RespondingNodeType_EndcX2Setup, choice.respond_eNB),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P33,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"respond-eNB"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct RespondingNodeType_EndcX2Setup, choice.respond_en_gNB),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P34,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"respond-en-gNB"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_RespondingNodeType_EndcX2Setup_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* respond-eNB */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* respond-en-gNB */
-};
-static asn_CHOICE_specifics_t asn_SPC_RespondingNodeType_EndcX2Setup_specs_1 = {
-	sizeof(struct RespondingNodeType_EndcX2Setup),
-	offsetof(struct RespondingNodeType_EndcX2Setup, _asn_ctx),
-	offsetof(struct RespondingNodeType_EndcX2Setup, present),
-	sizeof(((struct RespondingNodeType_EndcX2Setup *)0)->present),
-	asn_MAP_RespondingNodeType_EndcX2Setup_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0,
-	2	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_RespondingNodeType_EndcX2Setup = {
-	"RespondingNodeType-EndcX2Setup",
-	"RespondingNodeType-EndcX2Setup",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_RespondingNodeType_EndcX2Setup_constr_1, CHOICE_constraint },
-	asn_MBR_RespondingNodeType_EndcX2Setup_1,
-	2,	/* Elements count */
-	&asn_SPC_RespondingNodeType_EndcX2Setup_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/RespondingNodeType-EndcX2Setup.h b/3rdparty/libe2ap/RespondingNodeType-EndcX2Setup.h
deleted file mode 100644
index 3428cd8..0000000
--- a/3rdparty/libe2ap/RespondingNodeType-EndcX2Setup.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_RespondingNodeType_EndcX2Setup_H_
-#define	_RespondingNodeType_EndcX2Setup_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum RespondingNodeType_EndcX2Setup_PR {
-	RespondingNodeType_EndcX2Setup_PR_NOTHING,	/* No components present */
-	RespondingNodeType_EndcX2Setup_PR_respond_eNB,
-	RespondingNodeType_EndcX2Setup_PR_respond_en_gNB
-	/* Extensions may appear below */
-	
-} RespondingNodeType_EndcX2Setup_PR;
-
-/* RespondingNodeType-EndcX2Setup */
-typedef struct RespondingNodeType_EndcX2Setup {
-	RespondingNodeType_EndcX2Setup_PR present;
-	union RespondingNodeType_EndcX2Setup_u {
-		ProtocolIE_Container_8807P33_t	 respond_eNB;
-		ProtocolIE_Container_8807P34_t	 respond_en_gNB;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} RespondingNodeType_EndcX2Setup_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_RespondingNodeType_EndcX2Setup;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _RespondingNodeType_EndcX2Setup_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ResponseInformationSeNBReconfComp-RejectByMeNBItem.c b/3rdparty/libe2ap/ResponseInformationSeNBReconfComp-RejectByMeNBItem.c
deleted file mode 100644
index 40abd7f..0000000
--- a/3rdparty/libe2ap/ResponseInformationSeNBReconfComp-RejectByMeNBItem.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ResponseInformationSeNBReconfComp-RejectByMeNBItem.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_ResponseInformationSeNBReconfComp_RejectByMeNBItem_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItem, cause),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_Cause,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cause"
-		},
-	{ ATF_POINTER, 2, offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItem, meNBtoSeNBContainer),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_MeNBtoSeNBContainer,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"meNBtoSeNBContainer"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItem, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P8,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_ResponseInformationSeNBReconfComp_RejectByMeNBItem_oms_1[] = { 1, 2 };
-static const ber_tlv_tag_t asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItem_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResponseInformationSeNBReconfComp_RejectByMeNBItem_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cause */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* meNBtoSeNBContainer */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResponseInformationSeNBReconfComp_RejectByMeNBItem_specs_1 = {
-	sizeof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItem),
-	offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItem, _asn_ctx),
-	asn_MAP_ResponseInformationSeNBReconfComp_RejectByMeNBItem_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_ResponseInformationSeNBReconfComp_RejectByMeNBItem_oms_1,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItem = {
-	"ResponseInformationSeNBReconfComp-RejectByMeNBItem",
-	"ResponseInformationSeNBReconfComp-RejectByMeNBItem",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItem_tags_1,
-	sizeof(asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItem_tags_1)
-		/sizeof(asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItem_tags_1[0]), /* 1 */
-	asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItem_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItem_tags_1)
-		/sizeof(asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItem_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResponseInformationSeNBReconfComp_RejectByMeNBItem_1,
-	3,	/* Elements count */
-	&asn_SPC_ResponseInformationSeNBReconfComp_RejectByMeNBItem_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ResponseInformationSeNBReconfComp-RejectByMeNBItem.h b/3rdparty/libe2ap/ResponseInformationSeNBReconfComp-RejectByMeNBItem.h
deleted file mode 100644
index 6f26866..0000000
--- a/3rdparty/libe2ap/ResponseInformationSeNBReconfComp-RejectByMeNBItem.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ResponseInformationSeNBReconfComp_RejectByMeNBItem_H_
-#define	_ResponseInformationSeNBReconfComp_RejectByMeNBItem_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "Cause.h"
-#include "MeNBtoSeNBContainer.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* ResponseInformationSeNBReconfComp-RejectByMeNBItem */
-typedef struct ResponseInformationSeNBReconfComp_RejectByMeNBItem {
-	Cause_t	 cause;
-	MeNBtoSeNBContainer_t	*meNBtoSeNBContainer;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResponseInformationSeNBReconfComp_RejectByMeNBItem_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItem;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResponseInformationSeNBReconfComp_RejectByMeNBItem_specs_1;
-extern asn_TYPE_member_t asn_MBR_ResponseInformationSeNBReconfComp_RejectByMeNBItem_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ResponseInformationSeNBReconfComp_RejectByMeNBItem_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ResponseInformationSeNBReconfComp-SuccessItem.c b/3rdparty/libe2ap/ResponseInformationSeNBReconfComp-SuccessItem.c
deleted file mode 100644
index 202cb7b..0000000
--- a/3rdparty/libe2ap/ResponseInformationSeNBReconfComp-SuccessItem.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ResponseInformationSeNBReconfComp-SuccessItem.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_ResponseInformationSeNBReconfComp_SuccessItem_1[] = {
-	{ ATF_POINTER, 2, offsetof(struct ResponseInformationSeNBReconfComp_SuccessItem, meNBtoSeNBContainer),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_MeNBtoSeNBContainer,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"meNBtoSeNBContainer"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ResponseInformationSeNBReconfComp_SuccessItem, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P7,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_ResponseInformationSeNBReconfComp_SuccessItem_oms_1[] = { 0, 1 };
-static const ber_tlv_tag_t asn_DEF_ResponseInformationSeNBReconfComp_SuccessItem_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResponseInformationSeNBReconfComp_SuccessItem_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* meNBtoSeNBContainer */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ResponseInformationSeNBReconfComp_SuccessItem_specs_1 = {
-	sizeof(struct ResponseInformationSeNBReconfComp_SuccessItem),
-	offsetof(struct ResponseInformationSeNBReconfComp_SuccessItem, _asn_ctx),
-	asn_MAP_ResponseInformationSeNBReconfComp_SuccessItem_tag2el_1,
-	2,	/* Count of tags in the map */
-	asn_MAP_ResponseInformationSeNBReconfComp_SuccessItem_oms_1,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ResponseInformationSeNBReconfComp_SuccessItem = {
-	"ResponseInformationSeNBReconfComp-SuccessItem",
-	"ResponseInformationSeNBReconfComp-SuccessItem",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ResponseInformationSeNBReconfComp_SuccessItem_tags_1,
-	sizeof(asn_DEF_ResponseInformationSeNBReconfComp_SuccessItem_tags_1)
-		/sizeof(asn_DEF_ResponseInformationSeNBReconfComp_SuccessItem_tags_1[0]), /* 1 */
-	asn_DEF_ResponseInformationSeNBReconfComp_SuccessItem_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ResponseInformationSeNBReconfComp_SuccessItem_tags_1)
-		/sizeof(asn_DEF_ResponseInformationSeNBReconfComp_SuccessItem_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ResponseInformationSeNBReconfComp_SuccessItem_1,
-	2,	/* Elements count */
-	&asn_SPC_ResponseInformationSeNBReconfComp_SuccessItem_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ResponseInformationSeNBReconfComp-SuccessItem.h b/3rdparty/libe2ap/ResponseInformationSeNBReconfComp-SuccessItem.h
deleted file mode 100644
index b79395b..0000000
--- a/3rdparty/libe2ap/ResponseInformationSeNBReconfComp-SuccessItem.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ResponseInformationSeNBReconfComp_SuccessItem_H_
-#define	_ResponseInformationSeNBReconfComp_SuccessItem_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "MeNBtoSeNBContainer.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* ResponseInformationSeNBReconfComp-SuccessItem */
-typedef struct ResponseInformationSeNBReconfComp_SuccessItem {
-	MeNBtoSeNBContainer_t	*meNBtoSeNBContainer;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResponseInformationSeNBReconfComp_SuccessItem_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ResponseInformationSeNBReconfComp_SuccessItem;
-extern asn_SEQUENCE_specifics_t asn_SPC_ResponseInformationSeNBReconfComp_SuccessItem_specs_1;
-extern asn_TYPE_member_t asn_MBR_ResponseInformationSeNBReconfComp_SuccessItem_1[2];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ResponseInformationSeNBReconfComp_SuccessItem_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ResponseInformationSeNBReconfComp.c b/3rdparty/libe2ap/ResponseInformationSeNBReconfComp.c
deleted file mode 100644
index 3449b6d..0000000
--- a/3rdparty/libe2ap/ResponseInformationSeNBReconfComp.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ResponseInformationSeNBReconfComp.h"
-
-static asn_per_constraints_t asn_PER_type_ResponseInformationSeNBReconfComp_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_ResponseInformationSeNBReconfComp_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ResponseInformationSeNBReconfComp, choice.success),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ResponseInformationSeNBReconfComp_SuccessItem,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"success"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ResponseInformationSeNBReconfComp, choice.reject_by_MeNB),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItem,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"reject-by-MeNB"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_ResponseInformationSeNBReconfComp_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* success */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* reject-by-MeNB */
-};
-static asn_CHOICE_specifics_t asn_SPC_ResponseInformationSeNBReconfComp_specs_1 = {
-	sizeof(struct ResponseInformationSeNBReconfComp),
-	offsetof(struct ResponseInformationSeNBReconfComp, _asn_ctx),
-	offsetof(struct ResponseInformationSeNBReconfComp, present),
-	sizeof(((struct ResponseInformationSeNBReconfComp *)0)->present),
-	asn_MAP_ResponseInformationSeNBReconfComp_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0,
-	2	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_ResponseInformationSeNBReconfComp = {
-	"ResponseInformationSeNBReconfComp",
-	"ResponseInformationSeNBReconfComp",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_ResponseInformationSeNBReconfComp_constr_1, CHOICE_constraint },
-	asn_MBR_ResponseInformationSeNBReconfComp_1,
-	2,	/* Elements count */
-	&asn_SPC_ResponseInformationSeNBReconfComp_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ResponseInformationSeNBReconfComp.h b/3rdparty/libe2ap/ResponseInformationSeNBReconfComp.h
deleted file mode 100644
index 65a2830..0000000
--- a/3rdparty/libe2ap/ResponseInformationSeNBReconfComp.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ResponseInformationSeNBReconfComp_H_
-#define	_ResponseInformationSeNBReconfComp_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ResponseInformationSeNBReconfComp-SuccessItem.h"
-#include "ResponseInformationSeNBReconfComp-RejectByMeNBItem.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum ResponseInformationSeNBReconfComp_PR {
-	ResponseInformationSeNBReconfComp_PR_NOTHING,	/* No components present */
-	ResponseInformationSeNBReconfComp_PR_success,
-	ResponseInformationSeNBReconfComp_PR_reject_by_MeNB
-	/* Extensions may appear below */
-	
-} ResponseInformationSeNBReconfComp_PR;
-
-/* ResponseInformationSeNBReconfComp */
-typedef struct ResponseInformationSeNBReconfComp {
-	ResponseInformationSeNBReconfComp_PR present;
-	union ResponseInformationSeNBReconfComp_u {
-		ResponseInformationSeNBReconfComp_SuccessItem_t	 success;
-		ResponseInformationSeNBReconfComp_RejectByMeNBItem_t	 reject_by_MeNB;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ResponseInformationSeNBReconfComp_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ResponseInformationSeNBReconfComp;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ResponseInformationSeNBReconfComp_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/S1TNLLoadIndicator.c b/3rdparty/libe2ap/S1TNLLoadIndicator.c
deleted file mode 100644
index b795f3b..0000000
--- a/3rdparty/libe2ap/S1TNLLoadIndicator.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "S1TNLLoadIndicator.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_S1TNLLoadIndicator_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct S1TNLLoadIndicator, dLS1TNLLoadIndicator),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_LoadIndicator,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"dLS1TNLLoadIndicator"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct S1TNLLoadIndicator, uLS1TNLLoadIndicator),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_LoadIndicator,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"uLS1TNLLoadIndicator"
-		},
-	{ ATF_POINTER, 1, offsetof(struct S1TNLLoadIndicator, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P63,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_S1TNLLoadIndicator_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_S1TNLLoadIndicator_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_S1TNLLoadIndicator_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* dLS1TNLLoadIndicator */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* uLS1TNLLoadIndicator */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_S1TNLLoadIndicator_specs_1 = {
-	sizeof(struct S1TNLLoadIndicator),
-	offsetof(struct S1TNLLoadIndicator, _asn_ctx),
-	asn_MAP_S1TNLLoadIndicator_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_S1TNLLoadIndicator_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_S1TNLLoadIndicator = {
-	"S1TNLLoadIndicator",
-	"S1TNLLoadIndicator",
-	&asn_OP_SEQUENCE,
-	asn_DEF_S1TNLLoadIndicator_tags_1,
-	sizeof(asn_DEF_S1TNLLoadIndicator_tags_1)
-		/sizeof(asn_DEF_S1TNLLoadIndicator_tags_1[0]), /* 1 */
-	asn_DEF_S1TNLLoadIndicator_tags_1,	/* Same as above */
-	sizeof(asn_DEF_S1TNLLoadIndicator_tags_1)
-		/sizeof(asn_DEF_S1TNLLoadIndicator_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_S1TNLLoadIndicator_1,
-	3,	/* Elements count */
-	&asn_SPC_S1TNLLoadIndicator_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/S1TNLLoadIndicator.h b/3rdparty/libe2ap/S1TNLLoadIndicator.h
deleted file mode 100644
index 034e77b..0000000
--- a/3rdparty/libe2ap/S1TNLLoadIndicator.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_S1TNLLoadIndicator_H_
-#define	_S1TNLLoadIndicator_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "LoadIndicator.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* S1TNLLoadIndicator */
-typedef struct S1TNLLoadIndicator {
-	LoadIndicator_t	 dLS1TNLLoadIndicator;
-	LoadIndicator_t	 uLS1TNLLoadIndicator;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} S1TNLLoadIndicator_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_S1TNLLoadIndicator;
-extern asn_SEQUENCE_specifics_t asn_SPC_S1TNLLoadIndicator_specs_1;
-extern asn_TYPE_member_t asn_MBR_S1TNLLoadIndicator_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _S1TNLLoadIndicator_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/SULInformation.c b/3rdparty/libe2ap/SULInformation.c
deleted file mode 100644
index 2169176..0000000
--- a/3rdparty/libe2ap/SULInformation.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "SULInformation.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_sUL_ARFCN_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 3279165)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_sUL_ARFCN_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 22, -1,  0,  3279165 }	/* (0..3279165) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_SULInformation_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SULInformation, sUL_ARFCN),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_sUL_ARFCN_constr_2,  memb_sUL_ARFCN_constraint_1 },
-		0, 0, /* No default value */
-		"sUL-ARFCN"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SULInformation, sUL_TxBW),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NR_TxBW,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"sUL-TxBW"
-		},
-	{ ATF_POINTER, 1, offsetof(struct SULInformation, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P69,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_SULInformation_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_SULInformation_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_SULInformation_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sUL-ARFCN */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* sUL-TxBW */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_SULInformation_specs_1 = {
-	sizeof(struct SULInformation),
-	offsetof(struct SULInformation, _asn_ctx),
-	asn_MAP_SULInformation_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_SULInformation_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_SULInformation = {
-	"SULInformation",
-	"SULInformation",
-	&asn_OP_SEQUENCE,
-	asn_DEF_SULInformation_tags_1,
-	sizeof(asn_DEF_SULInformation_tags_1)
-		/sizeof(asn_DEF_SULInformation_tags_1[0]), /* 1 */
-	asn_DEF_SULInformation_tags_1,	/* Same as above */
-	sizeof(asn_DEF_SULInformation_tags_1)
-		/sizeof(asn_DEF_SULInformation_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_SULInformation_1,
-	3,	/* Elements count */
-	&asn_SPC_SULInformation_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/SULInformation.h b/3rdparty/libe2ap/SULInformation.h
deleted file mode 100644
index ef39ed6..0000000
--- a/3rdparty/libe2ap/SULInformation.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_SULInformation_H_
-#define	_SULInformation_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "NR-TxBW.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* SULInformation */
-typedef struct SULInformation {
-	long	 sUL_ARFCN;
-	NR_TxBW_t	 sUL_TxBW;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SULInformation_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_SULInformation;
-extern asn_SEQUENCE_specifics_t asn_SPC_SULInformation_specs_1;
-extern asn_TYPE_member_t asn_MBR_SULInformation_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _SULInformation_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/SeNBReconfigurationComplete.c b/3rdparty/libe2ap/SeNBReconfigurationComplete.c
deleted file mode 100644
index 6a8625b..0000000
--- a/3rdparty/libe2ap/SeNBReconfigurationComplete.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "SeNBReconfigurationComplete.h"
-
-static asn_TYPE_member_t asn_MBR_SeNBReconfigurationComplete_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SeNBReconfigurationComplete, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P28,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_SeNBReconfigurationComplete_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_SeNBReconfigurationComplete_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_SeNBReconfigurationComplete_specs_1 = {
-	sizeof(struct SeNBReconfigurationComplete),
-	offsetof(struct SeNBReconfigurationComplete, _asn_ctx),
-	asn_MAP_SeNBReconfigurationComplete_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_SeNBReconfigurationComplete = {
-	"SeNBReconfigurationComplete",
-	"SeNBReconfigurationComplete",
-	&asn_OP_SEQUENCE,
-	asn_DEF_SeNBReconfigurationComplete_tags_1,
-	sizeof(asn_DEF_SeNBReconfigurationComplete_tags_1)
-		/sizeof(asn_DEF_SeNBReconfigurationComplete_tags_1[0]), /* 1 */
-	asn_DEF_SeNBReconfigurationComplete_tags_1,	/* Same as above */
-	sizeof(asn_DEF_SeNBReconfigurationComplete_tags_1)
-		/sizeof(asn_DEF_SeNBReconfigurationComplete_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_SeNBReconfigurationComplete_1,
-	1,	/* Elements count */
-	&asn_SPC_SeNBReconfigurationComplete_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/SeNBReconfigurationComplete.h b/3rdparty/libe2ap/SeNBReconfigurationComplete.h
deleted file mode 100644
index 75e39ec..0000000
--- a/3rdparty/libe2ap/SeNBReconfigurationComplete.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_SeNBReconfigurationComplete_H_
-#define	_SeNBReconfigurationComplete_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* SeNBReconfigurationComplete */
-typedef struct SeNBReconfigurationComplete {
-	ProtocolIE_Container_8807P28_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SeNBReconfigurationComplete_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_SeNBReconfigurationComplete;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _SeNBReconfigurationComplete_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ServedCell-Information.c b/3rdparty/libe2ap/ServedCell-Information.c
deleted file mode 100644
index 7826a7d..0000000
--- a/3rdparty/libe2ap/ServedCell-Information.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ServedCell-Information.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_ServedCell_Information_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information, pCI),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_PCI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"pCI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information, cellId),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cellId"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information, tAC),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_TAC,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"tAC"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information, broadcastPLMNs),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BroadcastPLMNs_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"broadcastPLMNs"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information, eUTRA_Mode_Info),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_EUTRA_Mode_Info,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"eUTRA-Mode-Info"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ServedCell_Information, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P65,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_ServedCell_Information_oms_1[] = { 5 };
-static const ber_tlv_tag_t asn_DEF_ServedCell_Information_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ServedCell_Information_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pCI */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cellId */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* tAC */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* broadcastPLMNs */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* eUTRA-Mode-Info */
-    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ServedCell_Information_specs_1 = {
-	sizeof(struct ServedCell_Information),
-	offsetof(struct ServedCell_Information, _asn_ctx),
-	asn_MAP_ServedCell_Information_tag2el_1,
-	6,	/* Count of tags in the map */
-	asn_MAP_ServedCell_Information_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	6,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedCell_Information = {
-	"ServedCell-Information",
-	"ServedCell-Information",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ServedCell_Information_tags_1,
-	sizeof(asn_DEF_ServedCell_Information_tags_1)
-		/sizeof(asn_DEF_ServedCell_Information_tags_1[0]), /* 1 */
-	asn_DEF_ServedCell_Information_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ServedCell_Information_tags_1)
-		/sizeof(asn_DEF_ServedCell_Information_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ServedCell_Information_1,
-	6,	/* Elements count */
-	&asn_SPC_ServedCell_Information_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ServedCell-Information.h b/3rdparty/libe2ap/ServedCell-Information.h
deleted file mode 100644
index 2080613..0000000
--- a/3rdparty/libe2ap/ServedCell-Information.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ServedCell_Information_H_
-#define	_ServedCell_Information_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "PCI.h"
-#include "ECGI.h"
-#include "TAC.h"
-#include "BroadcastPLMNs-Item.h"
-#include "EUTRA-Mode-Info.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* ServedCell-Information */
-typedef struct ServedCell_Information {
-	PCI_t	 pCI;
-	ECGI_t	 cellId;
-	TAC_t	 tAC;
-	BroadcastPLMNs_Item_t	 broadcastPLMNs;
-	EUTRA_Mode_Info_t	 eUTRA_Mode_Info;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedCell_Information_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ServedCell_Information;
-extern asn_SEQUENCE_specifics_t asn_SPC_ServedCell_Information_specs_1;
-extern asn_TYPE_member_t asn_MBR_ServedCell_Information_1[6];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ServedCell_Information_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ServedCells.c b/3rdparty/libe2ap/ServedCells.c
deleted file mode 100644
index 462cf2a..0000000
--- a/3rdparty/libe2ap/ServedCells.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ServedCells.h"
-
-#include "Neighbour-Information.h"
-#include "ProtocolExtensionContainer.h"
-static asn_per_constraints_t asn_PER_type_ServedCells_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_Member_2[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCells__Member, servedCellInfo),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ServedCell_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"servedCellInfo"
-		},
-	{ ATF_POINTER, 2, offsetof(struct ServedCells__Member, neighbour_Info),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Neighbour_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"neighbour-Info"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ServedCells__Member, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P64,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_Member_oms_2[] = { 1, 2 };
-static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* servedCellInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* neighbour-Info */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
-	sizeof(struct ServedCells__Member),
-	offsetof(struct ServedCells__Member, _asn_ctx),
-	asn_MAP_Member_tag2el_2,
-	3,	/* Count of tags in the map */
-	asn_MAP_Member_oms_2,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_Member_2 = {
-	"SEQUENCE",
-	"SEQUENCE",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Member_tags_2,
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	asn_DEF_Member_tags_2,	/* Same as above */
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Member_2,
-	3,	/* Elements count */
-	&asn_SPC_Member_specs_2	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_ServedCells_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Member_2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ServedCells_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_ServedCells_specs_1 = {
-	sizeof(struct ServedCells),
-	offsetof(struct ServedCells, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedCells = {
-	"ServedCells",
-	"ServedCells",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ServedCells_tags_1,
-	sizeof(asn_DEF_ServedCells_tags_1)
-		/sizeof(asn_DEF_ServedCells_tags_1[0]), /* 1 */
-	asn_DEF_ServedCells_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ServedCells_tags_1)
-		/sizeof(asn_DEF_ServedCells_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ServedCells_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_ServedCells_1,
-	1,	/* Single element */
-	&asn_SPC_ServedCells_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ServedCells.h b/3rdparty/libe2ap/ServedCells.h
deleted file mode 100644
index c215088..0000000
--- a/3rdparty/libe2ap/ServedCells.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ServedCells_H_
-#define	_ServedCells_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "ServedCell-Information.h"
-#include "constr_SEQUENCE.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct Neighbour_Information;
-struct ProtocolExtensionContainer;
-
-/* Forward definitions */
-typedef struct ServedCells__Member {
-	ServedCell_Information_t	 servedCellInfo;
-	struct Neighbour_Information	*neighbour_Info;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedCells__Member;
-
-/* ServedCells */
-typedef struct ServedCells {
-	A_SEQUENCE_OF(ServedCells__Member) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedCells_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ServedCells;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ServedCells_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ServedCellsToModify-Item.c b/3rdparty/libe2ap/ServedCellsToModify-Item.c
deleted file mode 100644
index 3ee7661..0000000
--- a/3rdparty/libe2ap/ServedCellsToModify-Item.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ServedCellsToModify-Item.h"
-
-#include "Neighbour-Information.h"
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_ServedCellsToModify_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCellsToModify_Item, old_ecgi),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"old-ecgi"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedCellsToModify_Item, servedCellInfo),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ServedCell_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"servedCellInfo"
-		},
-	{ ATF_POINTER, 2, offsetof(struct ServedCellsToModify_Item, neighbour_Info),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Neighbour_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"neighbour-Info"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ServedCellsToModify_Item, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P1,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_ServedCellsToModify_Item_oms_1[] = { 2, 3 };
-static const ber_tlv_tag_t asn_DEF_ServedCellsToModify_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ServedCellsToModify_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* old-ecgi */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* servedCellInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* neighbour-Info */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ServedCellsToModify_Item_specs_1 = {
-	sizeof(struct ServedCellsToModify_Item),
-	offsetof(struct ServedCellsToModify_Item, _asn_ctx),
-	asn_MAP_ServedCellsToModify_Item_tag2el_1,
-	4,	/* Count of tags in the map */
-	asn_MAP_ServedCellsToModify_Item_oms_1,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedCellsToModify_Item = {
-	"ServedCellsToModify-Item",
-	"ServedCellsToModify-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ServedCellsToModify_Item_tags_1,
-	sizeof(asn_DEF_ServedCellsToModify_Item_tags_1)
-		/sizeof(asn_DEF_ServedCellsToModify_Item_tags_1[0]), /* 1 */
-	asn_DEF_ServedCellsToModify_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ServedCellsToModify_Item_tags_1)
-		/sizeof(asn_DEF_ServedCellsToModify_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ServedCellsToModify_Item_1,
-	4,	/* Elements count */
-	&asn_SPC_ServedCellsToModify_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ServedCellsToModify-Item.h b/3rdparty/libe2ap/ServedCellsToModify-Item.h
deleted file mode 100644
index 97ab984..0000000
--- a/3rdparty/libe2ap/ServedCellsToModify-Item.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ServedCellsToModify_Item_H_
-#define	_ServedCellsToModify_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ECGI.h"
-#include "ServedCell-Information.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct Neighbour_Information;
-struct ProtocolExtensionContainer;
-
-/* ServedCellsToModify-Item */
-typedef struct ServedCellsToModify_Item {
-	ECGI_t	 old_ecgi;
-	ServedCell_Information_t	 servedCellInfo;
-	struct Neighbour_Information	*neighbour_Info;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedCellsToModify_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ServedCellsToModify_Item;
-extern asn_SEQUENCE_specifics_t asn_SPC_ServedCellsToModify_Item_specs_1;
-extern asn_TYPE_member_t asn_MBR_ServedCellsToModify_Item_1[4];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ServedCellsToModify_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ServedCellsToModify.c b/3rdparty/libe2ap/ServedCellsToModify.c
deleted file mode 100644
index 37733dc..0000000
--- a/3rdparty/libe2ap/ServedCellsToModify.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ServedCellsToModify.h"
-
-#include "ServedCellsToModify-Item.h"
-static asn_per_constraints_t asn_PER_type_ServedCellsToModify_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_ServedCellsToModify_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedCellsToModify_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ServedCellsToModify_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_ServedCellsToModify_specs_1 = {
-	sizeof(struct ServedCellsToModify),
-	offsetof(struct ServedCellsToModify, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedCellsToModify = {
-	"ServedCellsToModify",
-	"ServedCellsToModify",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ServedCellsToModify_tags_1,
-	sizeof(asn_DEF_ServedCellsToModify_tags_1)
-		/sizeof(asn_DEF_ServedCellsToModify_tags_1[0]), /* 1 */
-	asn_DEF_ServedCellsToModify_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ServedCellsToModify_tags_1)
-		/sizeof(asn_DEF_ServedCellsToModify_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ServedCellsToModify_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_ServedCellsToModify_1,
-	1,	/* Single element */
-	&asn_SPC_ServedCellsToModify_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ServedCellsToModify.h b/3rdparty/libe2ap/ServedCellsToModify.h
deleted file mode 100644
index 10f39fc..0000000
--- a/3rdparty/libe2ap/ServedCellsToModify.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ServedCellsToModify_H_
-#define	_ServedCellsToModify_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ServedCellsToModify_Item;
-
-/* ServedCellsToModify */
-typedef struct ServedCellsToModify {
-	A_SEQUENCE_OF(struct ServedCellsToModify_Item) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedCellsToModify_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ServedCellsToModify;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ServedCellsToModify_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ServedEUTRAcellsENDCX2ManagementList.c b/3rdparty/libe2ap/ServedEUTRAcellsENDCX2ManagementList.c
deleted file mode 100644
index 4bd58a3..0000000
--- a/3rdparty/libe2ap/ServedEUTRAcellsENDCX2ManagementList.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ServedEUTRAcellsENDCX2ManagementList.h"
-
-#include "NRNeighbour-Information.h"
-#include "ProtocolExtensionContainer.h"
-static asn_per_constraints_t asn_PER_type_ServedEUTRAcellsENDCX2ManagementList_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_Member_2[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedEUTRAcellsENDCX2ManagementList__Member, servedEUTRACellInfo),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ServedCell_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"servedEUTRACellInfo"
-		},
-	{ ATF_POINTER, 2, offsetof(struct ServedEUTRAcellsENDCX2ManagementList__Member, nrNeighbourInfo),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRNeighbour_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nrNeighbourInfo"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ServedEUTRAcellsENDCX2ManagementList__Member, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P9,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_Member_oms_2[] = { 1, 2 };
-static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* servedEUTRACellInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* nrNeighbourInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
-	sizeof(struct ServedEUTRAcellsENDCX2ManagementList__Member),
-	offsetof(struct ServedEUTRAcellsENDCX2ManagementList__Member, _asn_ctx),
-	asn_MAP_Member_tag2el_2,
-	3,	/* Count of tags in the map */
-	asn_MAP_Member_oms_2,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_Member_2 = {
-	"SEQUENCE",
-	"SEQUENCE",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Member_tags_2,
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	asn_DEF_Member_tags_2,	/* Same as above */
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Member_2,
-	3,	/* Elements count */
-	&asn_SPC_Member_specs_2	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_ServedEUTRAcellsENDCX2ManagementList_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Member_2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ServedEUTRAcellsENDCX2ManagementList_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_ServedEUTRAcellsENDCX2ManagementList_specs_1 = {
-	sizeof(struct ServedEUTRAcellsENDCX2ManagementList),
-	offsetof(struct ServedEUTRAcellsENDCX2ManagementList, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedEUTRAcellsENDCX2ManagementList = {
-	"ServedEUTRAcellsENDCX2ManagementList",
-	"ServedEUTRAcellsENDCX2ManagementList",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ServedEUTRAcellsENDCX2ManagementList_tags_1,
-	sizeof(asn_DEF_ServedEUTRAcellsENDCX2ManagementList_tags_1)
-		/sizeof(asn_DEF_ServedEUTRAcellsENDCX2ManagementList_tags_1[0]), /* 1 */
-	asn_DEF_ServedEUTRAcellsENDCX2ManagementList_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ServedEUTRAcellsENDCX2ManagementList_tags_1)
-		/sizeof(asn_DEF_ServedEUTRAcellsENDCX2ManagementList_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ServedEUTRAcellsENDCX2ManagementList_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_ServedEUTRAcellsENDCX2ManagementList_1,
-	1,	/* Single element */
-	&asn_SPC_ServedEUTRAcellsENDCX2ManagementList_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ServedEUTRAcellsENDCX2ManagementList.h b/3rdparty/libe2ap/ServedEUTRAcellsENDCX2ManagementList.h
deleted file mode 100644
index 47b2d9a..0000000
--- a/3rdparty/libe2ap/ServedEUTRAcellsENDCX2ManagementList.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ServedEUTRAcellsENDCX2ManagementList_H_
-#define	_ServedEUTRAcellsENDCX2ManagementList_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "ServedCell-Information.h"
-#include "constr_SEQUENCE.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct NRNeighbour_Information;
-struct ProtocolExtensionContainer;
-
-/* Forward definitions */
-typedef struct ServedEUTRAcellsENDCX2ManagementList__Member {
-	ServedCell_Information_t	 servedEUTRACellInfo;
-	struct NRNeighbour_Information	*nrNeighbourInfo;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedEUTRAcellsENDCX2ManagementList__Member;
-
-/* ServedEUTRAcellsENDCX2ManagementList */
-typedef struct ServedEUTRAcellsENDCX2ManagementList {
-	A_SEQUENCE_OF(ServedEUTRAcellsENDCX2ManagementList__Member) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedEUTRAcellsENDCX2ManagementList_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ServedEUTRAcellsENDCX2ManagementList;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ServedEUTRAcellsENDCX2ManagementList_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ServedEUTRAcellsToDeleteListENDCConfUpd.c b/3rdparty/libe2ap/ServedEUTRAcellsToDeleteListENDCConfUpd.c
deleted file mode 100644
index d21c990..0000000
--- a/3rdparty/libe2ap/ServedEUTRAcellsToDeleteListENDCConfUpd.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ServedEUTRAcellsToDeleteListENDCConfUpd.h"
-
-#include "ECGI.h"
-static asn_per_constraints_t asn_PER_type_ServedEUTRAcellsToDeleteListENDCConfUpd_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_ServedEUTRAcellsToDeleteListENDCConfUpd_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ServedEUTRAcellsToDeleteListENDCConfUpd_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_ServedEUTRAcellsToDeleteListENDCConfUpd_specs_1 = {
-	sizeof(struct ServedEUTRAcellsToDeleteListENDCConfUpd),
-	offsetof(struct ServedEUTRAcellsToDeleteListENDCConfUpd, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedEUTRAcellsToDeleteListENDCConfUpd = {
-	"ServedEUTRAcellsToDeleteListENDCConfUpd",
-	"ServedEUTRAcellsToDeleteListENDCConfUpd",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ServedEUTRAcellsToDeleteListENDCConfUpd_tags_1,
-	sizeof(asn_DEF_ServedEUTRAcellsToDeleteListENDCConfUpd_tags_1)
-		/sizeof(asn_DEF_ServedEUTRAcellsToDeleteListENDCConfUpd_tags_1[0]), /* 1 */
-	asn_DEF_ServedEUTRAcellsToDeleteListENDCConfUpd_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ServedEUTRAcellsToDeleteListENDCConfUpd_tags_1)
-		/sizeof(asn_DEF_ServedEUTRAcellsToDeleteListENDCConfUpd_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ServedEUTRAcellsToDeleteListENDCConfUpd_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_ServedEUTRAcellsToDeleteListENDCConfUpd_1,
-	1,	/* Single element */
-	&asn_SPC_ServedEUTRAcellsToDeleteListENDCConfUpd_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ServedEUTRAcellsToDeleteListENDCConfUpd.h b/3rdparty/libe2ap/ServedEUTRAcellsToDeleteListENDCConfUpd.h
deleted file mode 100644
index 8b9c60b..0000000
--- a/3rdparty/libe2ap/ServedEUTRAcellsToDeleteListENDCConfUpd.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ServedEUTRAcellsToDeleteListENDCConfUpd_H_
-#define	_ServedEUTRAcellsToDeleteListENDCConfUpd_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ECGI;
-
-/* ServedEUTRAcellsToDeleteListENDCConfUpd */
-typedef struct ServedEUTRAcellsToDeleteListENDCConfUpd {
-	A_SEQUENCE_OF(struct ECGI) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedEUTRAcellsToDeleteListENDCConfUpd_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ServedEUTRAcellsToDeleteListENDCConfUpd;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ServedEUTRAcellsToDeleteListENDCConfUpd_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ServedEUTRAcellsToModifyListENDCConfUpd.c b/3rdparty/libe2ap/ServedEUTRAcellsToModifyListENDCConfUpd.c
deleted file mode 100644
index 78483c8..0000000
--- a/3rdparty/libe2ap/ServedEUTRAcellsToModifyListENDCConfUpd.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ServedEUTRAcellsToModifyListENDCConfUpd.h"
-
-#include "NRNeighbour-Information.h"
-#include "ProtocolExtensionContainer.h"
-static asn_per_constraints_t asn_PER_type_ServedEUTRAcellsToModifyListENDCConfUpd_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_Member_2[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd__Member, old_ECGI),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"old-ECGI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd__Member, servedEUTRACellInfo),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ServedCell_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"servedEUTRACellInfo"
-		},
-	{ ATF_POINTER, 2, offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd__Member, nrNeighbourInfo),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRNeighbour_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nrNeighbourInfo"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd__Member, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P18,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_Member_oms_2[] = { 2, 3 };
-static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* old-ECGI */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* servedEUTRACellInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* nrNeighbourInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
-	sizeof(struct ServedEUTRAcellsToModifyListENDCConfUpd__Member),
-	offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd__Member, _asn_ctx),
-	asn_MAP_Member_tag2el_2,
-	4,	/* Count of tags in the map */
-	asn_MAP_Member_oms_2,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_Member_2 = {
-	"SEQUENCE",
-	"SEQUENCE",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Member_tags_2,
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	asn_DEF_Member_tags_2,	/* Same as above */
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Member_2,
-	4,	/* Elements count */
-	&asn_SPC_Member_specs_2	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_ServedEUTRAcellsToModifyListENDCConfUpd_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Member_2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_ServedEUTRAcellsToModifyListENDCConfUpd_specs_1 = {
-	sizeof(struct ServedEUTRAcellsToModifyListENDCConfUpd),
-	offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd = {
-	"ServedEUTRAcellsToModifyListENDCConfUpd",
-	"ServedEUTRAcellsToModifyListENDCConfUpd",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_tags_1,
-	sizeof(asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_tags_1)
-		/sizeof(asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_tags_1[0]), /* 1 */
-	asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_tags_1)
-		/sizeof(asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ServedEUTRAcellsToModifyListENDCConfUpd_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_ServedEUTRAcellsToModifyListENDCConfUpd_1,
-	1,	/* Single element */
-	&asn_SPC_ServedEUTRAcellsToModifyListENDCConfUpd_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ServedEUTRAcellsToModifyListENDCConfUpd.h b/3rdparty/libe2ap/ServedEUTRAcellsToModifyListENDCConfUpd.h
deleted file mode 100644
index e64852b..0000000
--- a/3rdparty/libe2ap/ServedEUTRAcellsToModifyListENDCConfUpd.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ServedEUTRAcellsToModifyListENDCConfUpd_H_
-#define	_ServedEUTRAcellsToModifyListENDCConfUpd_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "ECGI.h"
-#include "ServedCell-Information.h"
-#include "constr_SEQUENCE.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct NRNeighbour_Information;
-struct ProtocolExtensionContainer;
-
-/* Forward definitions */
-typedef struct ServedEUTRAcellsToModifyListENDCConfUpd__Member {
-	ECGI_t	 old_ECGI;
-	ServedCell_Information_t	 servedEUTRACellInfo;
-	struct NRNeighbour_Information	*nrNeighbourInfo;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedEUTRAcellsToModifyListENDCConfUpd__Member;
-
-/* ServedEUTRAcellsToModifyListENDCConfUpd */
-typedef struct ServedEUTRAcellsToModifyListENDCConfUpd {
-	A_SEQUENCE_OF(ServedEUTRAcellsToModifyListENDCConfUpd__Member) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedEUTRAcellsToModifyListENDCConfUpd_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ServedEUTRAcellsToModifyListENDCConfUpd_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ServedNRCell-Information.c b/3rdparty/libe2ap/ServedNRCell-Information.c
deleted file mode 100644
index e325eb3..0000000
--- a/3rdparty/libe2ap/ServedNRCell-Information.c
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ServedNRCell-Information.h"
-
-#include "ProtocolExtensionContainer.h"
-static asn_per_constraints_t asn_PER_type_nrModeInfo_constr_7 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_nrModeInfo_7[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCell_Information__nrModeInfo, choice.fdd),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_FDD_InfoServedNRCell_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"fdd"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCell_Information__nrModeInfo, choice.tdd),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_TDD_InfoServedNRCell_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"tdd"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_nrModeInfo_tag2el_7[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* fdd */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* tdd */
-};
-static asn_CHOICE_specifics_t asn_SPC_nrModeInfo_specs_7 = {
-	sizeof(struct ServedNRCell_Information__nrModeInfo),
-	offsetof(struct ServedNRCell_Information__nrModeInfo, _asn_ctx),
-	offsetof(struct ServedNRCell_Information__nrModeInfo, present),
-	sizeof(((struct ServedNRCell_Information__nrModeInfo *)0)->present),
-	asn_MAP_nrModeInfo_tag2el_7,
-	2,	/* Count of tags in the map */
-	0, 0,
-	2	/* Extensions start */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_nrModeInfo_7 = {
-	"nrModeInfo",
-	"nrModeInfo",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_nrModeInfo_constr_7, CHOICE_constraint },
-	asn_MBR_nrModeInfo_7,
-	2,	/* Elements count */
-	&asn_SPC_nrModeInfo_specs_7	/* Additional specs */
-};
-
-asn_TYPE_member_t asn_MBR_ServedNRCell_Information_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCell_Information, nrpCI),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRPCI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nrpCI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCell_Information, nrCellID),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRCGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nrCellID"
-		},
-	{ ATF_POINTER, 2, offsetof(struct ServedNRCell_Information, fiveGS_TAC),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_FiveGS_TAC,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"fiveGS-TAC"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ServedNRCell_Information, configured_TAC),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_TAC,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"configured-TAC"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCell_Information, broadcastPLMNs),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BroadcastPLMNs_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"broadcastPLMNs"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCell_Information, nrModeInfo),
-		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_nrModeInfo_7,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nrModeInfo"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCell_Information, measurementTimingConfiguration),
-		(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_OCTET_STRING,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"measurementTimingConfiguration"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ServedNRCell_Information, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (7 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P11,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_ServedNRCell_Information_oms_1[] = { 2, 3, 7 };
-static const ber_tlv_tag_t asn_DEF_ServedNRCell_Information_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ServedNRCell_Information_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nrpCI */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* nrCellID */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* fiveGS-TAC */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* configured-TAC */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* broadcastPLMNs */
-    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* nrModeInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* measurementTimingConfiguration */
-    { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ServedNRCell_Information_specs_1 = {
-	sizeof(struct ServedNRCell_Information),
-	offsetof(struct ServedNRCell_Information, _asn_ctx),
-	asn_MAP_ServedNRCell_Information_tag2el_1,
-	8,	/* Count of tags in the map */
-	asn_MAP_ServedNRCell_Information_oms_1,	/* Optional members */
-	3, 0,	/* Root/Additions */
-	8,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedNRCell_Information = {
-	"ServedNRCell-Information",
-	"ServedNRCell-Information",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ServedNRCell_Information_tags_1,
-	sizeof(asn_DEF_ServedNRCell_Information_tags_1)
-		/sizeof(asn_DEF_ServedNRCell_Information_tags_1[0]), /* 1 */
-	asn_DEF_ServedNRCell_Information_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ServedNRCell_Information_tags_1)
-		/sizeof(asn_DEF_ServedNRCell_Information_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ServedNRCell_Information_1,
-	8,	/* Elements count */
-	&asn_SPC_ServedNRCell_Information_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ServedNRCell-Information.h b/3rdparty/libe2ap/ServedNRCell-Information.h
deleted file mode 100644
index 2898944..0000000
--- a/3rdparty/libe2ap/ServedNRCell-Information.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ServedNRCell_Information_H_
-#define	_ServedNRCell_Information_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NRPCI.h"
-#include "NRCGI.h"
-#include "FiveGS-TAC.h"
-#include "TAC.h"
-#include "BroadcastPLMNs-Item.h"
-#include "OCTET_STRING.h"
-#include "FDD-InfoServedNRCell-Information.h"
-#include "TDD-InfoServedNRCell-Information.h"
-#include "constr_CHOICE.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum ServedNRCell_Information__nrModeInfo_PR {
-	ServedNRCell_Information__nrModeInfo_PR_NOTHING,	/* No components present */
-	ServedNRCell_Information__nrModeInfo_PR_fdd,
-	ServedNRCell_Information__nrModeInfo_PR_tdd
-	/* Extensions may appear below */
-	
-} ServedNRCell_Information__nrModeInfo_PR;
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* ServedNRCell-Information */
-typedef struct ServedNRCell_Information {
-	NRPCI_t	 nrpCI;
-	NRCGI_t	 nrCellID;
-	FiveGS_TAC_t	*fiveGS_TAC;	/* OPTIONAL */
-	TAC_t	*configured_TAC;	/* OPTIONAL */
-	BroadcastPLMNs_Item_t	 broadcastPLMNs;
-	struct ServedNRCell_Information__nrModeInfo {
-		ServedNRCell_Information__nrModeInfo_PR present;
-		union ServedNRCell_Information__nrModeInfo_u {
-			FDD_InfoServedNRCell_Information_t	 fdd;
-			TDD_InfoServedNRCell_Information_t	 tdd;
-			/*
-			 * This type is extensible,
-			 * possible extensions are below.
-			 */
-		} choice;
-		
-		/* Context for parsing across buffer boundaries */
-		asn_struct_ctx_t _asn_ctx;
-	} nrModeInfo;
-	OCTET_STRING_t	 measurementTimingConfiguration;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedNRCell_Information_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ServedNRCell_Information;
-extern asn_SEQUENCE_specifics_t asn_SPC_ServedNRCell_Information_specs_1;
-extern asn_TYPE_member_t asn_MBR_ServedNRCell_Information_1[8];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ServedNRCell_Information_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ServedNRCellsToModify-Item.c b/3rdparty/libe2ap/ServedNRCellsToModify-Item.c
deleted file mode 100644
index 65dea16..0000000
--- a/3rdparty/libe2ap/ServedNRCellsToModify-Item.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ServedNRCellsToModify-Item.h"
-
-#include "NRNeighbour-Information.h"
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_ServedNRCellsToModify_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCellsToModify_Item, old_nrcgi),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRCGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"old-nrcgi"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCellsToModify_Item, servedNRCellInformation),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ServedNRCell_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"servedNRCellInformation"
-		},
-	{ ATF_POINTER, 3, offsetof(struct ServedNRCellsToModify_Item, nrNeighbourInformation),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRNeighbour_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nrNeighbourInformation"
-		},
-	{ ATF_POINTER, 2, offsetof(struct ServedNRCellsToModify_Item, nrDeactivationIndication),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_DeactivationIndication,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nrDeactivationIndication"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ServedNRCellsToModify_Item, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P19,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_ServedNRCellsToModify_Item_oms_1[] = { 2, 3, 4 };
-static const ber_tlv_tag_t asn_DEF_ServedNRCellsToModify_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_ServedNRCellsToModify_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* old-nrcgi */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* servedNRCellInformation */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* nrNeighbourInformation */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* nrDeactivationIndication */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_ServedNRCellsToModify_Item_specs_1 = {
-	sizeof(struct ServedNRCellsToModify_Item),
-	offsetof(struct ServedNRCellsToModify_Item, _asn_ctx),
-	asn_MAP_ServedNRCellsToModify_Item_tag2el_1,
-	5,	/* Count of tags in the map */
-	asn_MAP_ServedNRCellsToModify_Item_oms_1,	/* Optional members */
-	3, 0,	/* Root/Additions */
-	5,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedNRCellsToModify_Item = {
-	"ServedNRCellsToModify-Item",
-	"ServedNRCellsToModify-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_ServedNRCellsToModify_Item_tags_1,
-	sizeof(asn_DEF_ServedNRCellsToModify_Item_tags_1)
-		/sizeof(asn_DEF_ServedNRCellsToModify_Item_tags_1[0]), /* 1 */
-	asn_DEF_ServedNRCellsToModify_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ServedNRCellsToModify_Item_tags_1)
-		/sizeof(asn_DEF_ServedNRCellsToModify_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_ServedNRCellsToModify_Item_1,
-	5,	/* Elements count */
-	&asn_SPC_ServedNRCellsToModify_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ServedNRCellsToModify-Item.h b/3rdparty/libe2ap/ServedNRCellsToModify-Item.h
deleted file mode 100644
index c603892..0000000
--- a/3rdparty/libe2ap/ServedNRCellsToModify-Item.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ServedNRCellsToModify_Item_H_
-#define	_ServedNRCellsToModify_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NRCGI.h"
-#include "ServedNRCell-Information.h"
-#include "DeactivationIndication.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct NRNeighbour_Information;
-struct ProtocolExtensionContainer;
-
-/* ServedNRCellsToModify-Item */
-typedef struct ServedNRCellsToModify_Item {
-	NRCGI_t	 old_nrcgi;
-	ServedNRCell_Information_t	 servedNRCellInformation;
-	struct NRNeighbour_Information	*nrNeighbourInformation;	/* OPTIONAL */
-	DeactivationIndication_t	*nrDeactivationIndication;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedNRCellsToModify_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ServedNRCellsToModify_Item;
-extern asn_SEQUENCE_specifics_t asn_SPC_ServedNRCellsToModify_Item_specs_1;
-extern asn_TYPE_member_t asn_MBR_ServedNRCellsToModify_Item_1[5];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ServedNRCellsToModify_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ServedNRcellsENDCX2ManagementList.c b/3rdparty/libe2ap/ServedNRcellsENDCX2ManagementList.c
deleted file mode 100644
index 8d00899..0000000
--- a/3rdparty/libe2ap/ServedNRcellsENDCX2ManagementList.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ServedNRcellsENDCX2ManagementList.h"
-
-#include "NRNeighbour-Information.h"
-#include "ProtocolExtensionContainer.h"
-static asn_per_constraints_t asn_PER_type_ServedNRcellsENDCX2ManagementList_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 14,  14,  1,  16384 }	/* (SIZE(1..16384)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_Member_2[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRcellsENDCX2ManagementList__Member, servedNRCellInfo),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ServedNRCell_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"servedNRCellInfo"
-		},
-	{ ATF_POINTER, 2, offsetof(struct ServedNRcellsENDCX2ManagementList__Member, nRNeighbourInfo),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRNeighbour_Information,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nRNeighbourInfo"
-		},
-	{ ATF_POINTER, 1, offsetof(struct ServedNRcellsENDCX2ManagementList__Member, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P10,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_Member_oms_2[] = { 1, 2 };
-static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* servedNRCellInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* nRNeighbourInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
-	sizeof(struct ServedNRcellsENDCX2ManagementList__Member),
-	offsetof(struct ServedNRcellsENDCX2ManagementList__Member, _asn_ctx),
-	asn_MAP_Member_tag2el_2,
-	3,	/* Count of tags in the map */
-	asn_MAP_Member_oms_2,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-static /* Use -fall-defs-global to expose */
-asn_TYPE_descriptor_t asn_DEF_Member_2 = {
-	"SEQUENCE",
-	"SEQUENCE",
-	&asn_OP_SEQUENCE,
-	asn_DEF_Member_tags_2,
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	asn_DEF_Member_tags_2,	/* Same as above */
-	sizeof(asn_DEF_Member_tags_2)
-		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_Member_2,
-	3,	/* Elements count */
-	&asn_SPC_Member_specs_2	/* Additional specs */
-};
-
-static asn_TYPE_member_t asn_MBR_ServedNRcellsENDCX2ManagementList_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_Member_2,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ServedNRcellsENDCX2ManagementList_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_ServedNRcellsENDCX2ManagementList_specs_1 = {
-	sizeof(struct ServedNRcellsENDCX2ManagementList),
-	offsetof(struct ServedNRcellsENDCX2ManagementList, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedNRcellsENDCX2ManagementList = {
-	"ServedNRcellsENDCX2ManagementList",
-	"ServedNRcellsENDCX2ManagementList",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ServedNRcellsENDCX2ManagementList_tags_1,
-	sizeof(asn_DEF_ServedNRcellsENDCX2ManagementList_tags_1)
-		/sizeof(asn_DEF_ServedNRcellsENDCX2ManagementList_tags_1[0]), /* 1 */
-	asn_DEF_ServedNRcellsENDCX2ManagementList_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ServedNRcellsENDCX2ManagementList_tags_1)
-		/sizeof(asn_DEF_ServedNRcellsENDCX2ManagementList_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ServedNRcellsENDCX2ManagementList_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_ServedNRcellsENDCX2ManagementList_1,
-	1,	/* Single element */
-	&asn_SPC_ServedNRcellsENDCX2ManagementList_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ServedNRcellsENDCX2ManagementList.h b/3rdparty/libe2ap/ServedNRcellsENDCX2ManagementList.h
deleted file mode 100644
index 2bc2246..0000000
--- a/3rdparty/libe2ap/ServedNRcellsENDCX2ManagementList.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ServedNRcellsENDCX2ManagementList_H_
-#define	_ServedNRcellsENDCX2ManagementList_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "ServedNRCell-Information.h"
-#include "constr_SEQUENCE.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct NRNeighbour_Information;
-struct ProtocolExtensionContainer;
-
-/* Forward definitions */
-typedef struct ServedNRcellsENDCX2ManagementList__Member {
-	ServedNRCell_Information_t	 servedNRCellInfo;
-	struct NRNeighbour_Information	*nRNeighbourInfo;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedNRcellsENDCX2ManagementList__Member;
-
-/* ServedNRcellsENDCX2ManagementList */
-typedef struct ServedNRcellsENDCX2ManagementList {
-	A_SEQUENCE_OF(ServedNRcellsENDCX2ManagementList__Member) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedNRcellsENDCX2ManagementList_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ServedNRcellsENDCX2ManagementList;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ServedNRcellsENDCX2ManagementList_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ServedNRcellsToDeleteENDCConfUpdList.c b/3rdparty/libe2ap/ServedNRcellsToDeleteENDCConfUpdList.c
deleted file mode 100644
index 14ac495..0000000
--- a/3rdparty/libe2ap/ServedNRcellsToDeleteENDCConfUpdList.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ServedNRcellsToDeleteENDCConfUpdList.h"
-
-#include "NRCGI.h"
-static asn_per_constraints_t asn_PER_type_ServedNRcellsToDeleteENDCConfUpdList_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 14,  14,  1,  16384 }	/* (SIZE(1..16384)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_ServedNRcellsToDeleteENDCConfUpdList_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_NRCGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ServedNRcellsToDeleteENDCConfUpdList_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_ServedNRcellsToDeleteENDCConfUpdList_specs_1 = {
-	sizeof(struct ServedNRcellsToDeleteENDCConfUpdList),
-	offsetof(struct ServedNRcellsToDeleteENDCConfUpdList, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedNRcellsToDeleteENDCConfUpdList = {
-	"ServedNRcellsToDeleteENDCConfUpdList",
-	"ServedNRcellsToDeleteENDCConfUpdList",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ServedNRcellsToDeleteENDCConfUpdList_tags_1,
-	sizeof(asn_DEF_ServedNRcellsToDeleteENDCConfUpdList_tags_1)
-		/sizeof(asn_DEF_ServedNRcellsToDeleteENDCConfUpdList_tags_1[0]), /* 1 */
-	asn_DEF_ServedNRcellsToDeleteENDCConfUpdList_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ServedNRcellsToDeleteENDCConfUpdList_tags_1)
-		/sizeof(asn_DEF_ServedNRcellsToDeleteENDCConfUpdList_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ServedNRcellsToDeleteENDCConfUpdList_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_ServedNRcellsToDeleteENDCConfUpdList_1,
-	1,	/* Single element */
-	&asn_SPC_ServedNRcellsToDeleteENDCConfUpdList_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ServedNRcellsToDeleteENDCConfUpdList.h b/3rdparty/libe2ap/ServedNRcellsToDeleteENDCConfUpdList.h
deleted file mode 100644
index eb480f3..0000000
--- a/3rdparty/libe2ap/ServedNRcellsToDeleteENDCConfUpdList.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ServedNRcellsToDeleteENDCConfUpdList_H_
-#define	_ServedNRcellsToDeleteENDCConfUpdList_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct NRCGI;
-
-/* ServedNRcellsToDeleteENDCConfUpdList */
-typedef struct ServedNRcellsToDeleteENDCConfUpdList {
-	A_SEQUENCE_OF(struct NRCGI) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedNRcellsToDeleteENDCConfUpdList_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ServedNRcellsToDeleteENDCConfUpdList;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ServedNRcellsToDeleteENDCConfUpdList_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/ServedNRcellsToModifyENDCConfUpdList.c b/3rdparty/libe2ap/ServedNRcellsToModifyENDCConfUpdList.c
deleted file mode 100644
index 6ffd61e..0000000
--- a/3rdparty/libe2ap/ServedNRcellsToModifyENDCConfUpdList.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "ServedNRcellsToModifyENDCConfUpdList.h"
-
-#include "ServedNRCellsToModify-Item.h"
-static asn_per_constraints_t asn_PER_type_ServedNRcellsToModifyENDCConfUpdList_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 14,  14,  1,  16384 }	/* (SIZE(1..16384)) */,
-	0, 0	/* No PER value map */
-};
-static asn_TYPE_member_t asn_MBR_ServedNRcellsToModifyENDCConfUpdList_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_ServedNRCellsToModify_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_ServedNRcellsToModifyENDCConfUpdList_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static asn_SET_OF_specifics_t asn_SPC_ServedNRcellsToModifyENDCConfUpdList_specs_1 = {
-	sizeof(struct ServedNRcellsToModifyENDCConfUpdList),
-	offsetof(struct ServedNRcellsToModifyENDCConfUpdList, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_ServedNRcellsToModifyENDCConfUpdList = {
-	"ServedNRcellsToModifyENDCConfUpdList",
-	"ServedNRcellsToModifyENDCConfUpdList",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_ServedNRcellsToModifyENDCConfUpdList_tags_1,
-	sizeof(asn_DEF_ServedNRcellsToModifyENDCConfUpdList_tags_1)
-		/sizeof(asn_DEF_ServedNRcellsToModifyENDCConfUpdList_tags_1[0]), /* 1 */
-	asn_DEF_ServedNRcellsToModifyENDCConfUpdList_tags_1,	/* Same as above */
-	sizeof(asn_DEF_ServedNRcellsToModifyENDCConfUpdList_tags_1)
-		/sizeof(asn_DEF_ServedNRcellsToModifyENDCConfUpdList_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_ServedNRcellsToModifyENDCConfUpdList_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_ServedNRcellsToModifyENDCConfUpdList_1,
-	1,	/* Single element */
-	&asn_SPC_ServedNRcellsToModifyENDCConfUpdList_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/ServedNRcellsToModifyENDCConfUpdList.h b/3rdparty/libe2ap/ServedNRcellsToModifyENDCConfUpdList.h
deleted file mode 100644
index 537b986..0000000
--- a/3rdparty/libe2ap/ServedNRcellsToModifyENDCConfUpdList.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_ServedNRcellsToModifyENDCConfUpdList_H_
-#define	_ServedNRcellsToModifyENDCConfUpdList_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ServedNRCellsToModify_Item;
-
-/* ServedNRcellsToModifyENDCConfUpdList */
-typedef struct ServedNRcellsToModifyENDCConfUpdList {
-	A_SEQUENCE_OF(struct ServedNRCellsToModify_Item) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} ServedNRcellsToModifyENDCConfUpdList_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_ServedNRcellsToModifyENDCConfUpdList;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _ServedNRcellsToModifyENDCConfUpdList_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/SgNB-UE-X2AP-ID.c b/3rdparty/libe2ap/SgNB-UE-X2AP-ID.c
deleted file mode 100644
index ec7f222..0000000
--- a/3rdparty/libe2ap/SgNB-UE-X2AP-ID.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "SgNB-UE-X2AP-ID.h"
-
-int
-SgNB_UE_X2AP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	
-	/* Constraint check succeeded */
-	return 0;
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_SgNB_UE_X2AP_ID_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 32, -1,  0,  4294967295 }	/* (0..4294967295) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_specifics_t asn_SPC_SgNB_UE_X2AP_ID_specs_1 = {
-	0,	0,	0,	0,	0,
-	0,	/* Native long size */
-	1	/* Unsigned representation */
-};
-static const ber_tlv_tag_t asn_DEF_SgNB_UE_X2AP_ID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_SgNB_UE_X2AP_ID = {
-	"SgNB-UE-X2AP-ID",
-	"SgNB-UE-X2AP-ID",
-	&asn_OP_NativeInteger,
-	asn_DEF_SgNB_UE_X2AP_ID_tags_1,
-	sizeof(asn_DEF_SgNB_UE_X2AP_ID_tags_1)
-		/sizeof(asn_DEF_SgNB_UE_X2AP_ID_tags_1[0]), /* 1 */
-	asn_DEF_SgNB_UE_X2AP_ID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_SgNB_UE_X2AP_ID_tags_1)
-		/sizeof(asn_DEF_SgNB_UE_X2AP_ID_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_SgNB_UE_X2AP_ID_constr_1, SgNB_UE_X2AP_ID_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_SgNB_UE_X2AP_ID_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/SgNB-UE-X2AP-ID.h b/3rdparty/libe2ap/SgNB-UE-X2AP-ID.h
deleted file mode 100644
index 9a9c0c0..0000000
--- a/3rdparty/libe2ap/SgNB-UE-X2AP-ID.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_SgNB_UE_X2AP_ID_H_
-#define	_SgNB_UE_X2AP_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* SgNB-UE-X2AP-ID */
-typedef unsigned long	 SgNB_UE_X2AP_ID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_SgNB_UE_X2AP_ID;
-asn_struct_free_f SgNB_UE_X2AP_ID_free;
-asn_struct_print_f SgNB_UE_X2AP_ID_print;
-asn_constr_check_f SgNB_UE_X2AP_ID_constraint;
-ber_type_decoder_f SgNB_UE_X2AP_ID_decode_ber;
-der_type_encoder_f SgNB_UE_X2AP_ID_encode_der;
-xer_type_decoder_f SgNB_UE_X2AP_ID_decode_xer;
-xer_type_encoder_f SgNB_UE_X2AP_ID_encode_xer;
-per_type_decoder_f SgNB_UE_X2AP_ID_decode_uper;
-per_type_encoder_f SgNB_UE_X2AP_ID_encode_uper;
-per_type_decoder_f SgNB_UE_X2AP_ID_decode_aper;
-per_type_encoder_f SgNB_UE_X2AP_ID_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _SgNB_UE_X2AP_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/SpecialSubframe-Info.c b/3rdparty/libe2ap/SpecialSubframe-Info.c
deleted file mode 100644
index a7d7256..0000000
--- a/3rdparty/libe2ap/SpecialSubframe-Info.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "SpecialSubframe-Info.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_SpecialSubframe_Info_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SpecialSubframe_Info, specialSubframePatterns),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_SpecialSubframePatterns,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"specialSubframePatterns"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SpecialSubframe_Info, cyclicPrefixDL),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CyclicPrefixDL,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cyclicPrefixDL"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SpecialSubframe_Info, cyclicPrefixUL),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_CyclicPrefixUL,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"cyclicPrefixUL"
-		},
-	{ ATF_POINTER, 1, offsetof(struct SpecialSubframe_Info, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P66,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_SpecialSubframe_Info_oms_1[] = { 3 };
-static const ber_tlv_tag_t asn_DEF_SpecialSubframe_Info_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_SpecialSubframe_Info_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* specialSubframePatterns */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cyclicPrefixDL */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* cyclicPrefixUL */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_SpecialSubframe_Info_specs_1 = {
-	sizeof(struct SpecialSubframe_Info),
-	offsetof(struct SpecialSubframe_Info, _asn_ctx),
-	asn_MAP_SpecialSubframe_Info_tag2el_1,
-	4,	/* Count of tags in the map */
-	asn_MAP_SpecialSubframe_Info_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	4,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_SpecialSubframe_Info = {
-	"SpecialSubframe-Info",
-	"SpecialSubframe-Info",
-	&asn_OP_SEQUENCE,
-	asn_DEF_SpecialSubframe_Info_tags_1,
-	sizeof(asn_DEF_SpecialSubframe_Info_tags_1)
-		/sizeof(asn_DEF_SpecialSubframe_Info_tags_1[0]), /* 1 */
-	asn_DEF_SpecialSubframe_Info_tags_1,	/* Same as above */
-	sizeof(asn_DEF_SpecialSubframe_Info_tags_1)
-		/sizeof(asn_DEF_SpecialSubframe_Info_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_SpecialSubframe_Info_1,
-	4,	/* Elements count */
-	&asn_SPC_SpecialSubframe_Info_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/SpecialSubframe-Info.h b/3rdparty/libe2ap/SpecialSubframe-Info.h
deleted file mode 100644
index a678da3..0000000
--- a/3rdparty/libe2ap/SpecialSubframe-Info.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_SpecialSubframe_Info_H_
-#define	_SpecialSubframe_Info_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "SpecialSubframePatterns.h"
-#include "CyclicPrefixDL.h"
-#include "CyclicPrefixUL.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* SpecialSubframe-Info */
-typedef struct SpecialSubframe_Info {
-	SpecialSubframePatterns_t	 specialSubframePatterns;
-	CyclicPrefixDL_t	 cyclicPrefixDL;
-	CyclicPrefixUL_t	 cyclicPrefixUL;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SpecialSubframe_Info_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_SpecialSubframe_Info;
-extern asn_SEQUENCE_specifics_t asn_SPC_SpecialSubframe_Info_specs_1;
-extern asn_TYPE_member_t asn_MBR_SpecialSubframe_Info_1[4];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _SpecialSubframe_Info_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/SpecialSubframePatterns.c b/3rdparty/libe2ap/SpecialSubframePatterns.c
deleted file mode 100644
index d89b2af..0000000
--- a/3rdparty/libe2ap/SpecialSubframePatterns.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "SpecialSubframePatterns.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_SpecialSubframePatterns_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  4,  4,  0,  8 }	/* (0..8,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_SpecialSubframePatterns_value2enum_1[] = {
-	{ 0,	4,	"ssp0" },
-	{ 1,	4,	"ssp1" },
-	{ 2,	4,	"ssp2" },
-	{ 3,	4,	"ssp3" },
-	{ 4,	4,	"ssp4" },
-	{ 5,	4,	"ssp5" },
-	{ 6,	4,	"ssp6" },
-	{ 7,	4,	"ssp7" },
-	{ 8,	4,	"ssp8" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_SpecialSubframePatterns_enum2value_1[] = {
-	0,	/* ssp0(0) */
-	1,	/* ssp1(1) */
-	2,	/* ssp2(2) */
-	3,	/* ssp3(3) */
-	4,	/* ssp4(4) */
-	5,	/* ssp5(5) */
-	6,	/* ssp6(6) */
-	7,	/* ssp7(7) */
-	8	/* ssp8(8) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_SpecialSubframePatterns_specs_1 = {
-	asn_MAP_SpecialSubframePatterns_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_SpecialSubframePatterns_enum2value_1,	/* N => "tag"; sorted by N */
-	9,	/* Number of elements in the maps */
-	10,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_SpecialSubframePatterns_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_SpecialSubframePatterns = {
-	"SpecialSubframePatterns",
-	"SpecialSubframePatterns",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_SpecialSubframePatterns_tags_1,
-	sizeof(asn_DEF_SpecialSubframePatterns_tags_1)
-		/sizeof(asn_DEF_SpecialSubframePatterns_tags_1[0]), /* 1 */
-	asn_DEF_SpecialSubframePatterns_tags_1,	/* Same as above */
-	sizeof(asn_DEF_SpecialSubframePatterns_tags_1)
-		/sizeof(asn_DEF_SpecialSubframePatterns_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_SpecialSubframePatterns_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_SpecialSubframePatterns_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/SpecialSubframePatterns.h b/3rdparty/libe2ap/SpecialSubframePatterns.h
deleted file mode 100644
index 44d10a5..0000000
--- a/3rdparty/libe2ap/SpecialSubframePatterns.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_SpecialSubframePatterns_H_
-#define	_SpecialSubframePatterns_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum SpecialSubframePatterns {
-	SpecialSubframePatterns_ssp0	= 0,
-	SpecialSubframePatterns_ssp1	= 1,
-	SpecialSubframePatterns_ssp2	= 2,
-	SpecialSubframePatterns_ssp3	= 3,
-	SpecialSubframePatterns_ssp4	= 4,
-	SpecialSubframePatterns_ssp5	= 5,
-	SpecialSubframePatterns_ssp6	= 6,
-	SpecialSubframePatterns_ssp7	= 7,
-	SpecialSubframePatterns_ssp8	= 8
-	/*
-	 * Enumeration is extensible
-	 */
-} e_SpecialSubframePatterns;
-
-/* SpecialSubframePatterns */
-typedef long	 SpecialSubframePatterns_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_SpecialSubframePatterns_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_SpecialSubframePatterns;
-extern const asn_INTEGER_specifics_t asn_SPC_SpecialSubframePatterns_specs_1;
-asn_struct_free_f SpecialSubframePatterns_free;
-asn_struct_print_f SpecialSubframePatterns_print;
-asn_constr_check_f SpecialSubframePatterns_constraint;
-ber_type_decoder_f SpecialSubframePatterns_decode_ber;
-der_type_encoder_f SpecialSubframePatterns_encode_der;
-xer_type_decoder_f SpecialSubframePatterns_decode_xer;
-xer_type_encoder_f SpecialSubframePatterns_encode_xer;
-per_type_decoder_f SpecialSubframePatterns_decode_uper;
-per_type_encoder_f SpecialSubframePatterns_encode_uper;
-per_type_decoder_f SpecialSubframePatterns_decode_aper;
-per_type_encoder_f SpecialSubframePatterns_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _SpecialSubframePatterns_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/Style-ID.c b/3rdparty/libe2ap/Style-ID.c
deleted file mode 100644
index 77fea6d..0000000
--- a/3rdparty/libe2ap/Style-ID.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "Style-ID.h"
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-static const ber_tlv_tag_t asn_DEF_Style_ID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_Style_ID = {
-	"Style-ID",
-	"Style-ID",
-	&asn_OP_NativeInteger,
-	asn_DEF_Style_ID_tags_1,
-	sizeof(asn_DEF_Style_ID_tags_1)
-		/sizeof(asn_DEF_Style_ID_tags_1[0]), /* 1 */
-	asn_DEF_Style_ID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_Style_ID_tags_1)
-		/sizeof(asn_DEF_Style_ID_tags_1[0]), /* 1 */
-	{ 0, 0, NativeInteger_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/Style-ID.h b/3rdparty/libe2ap/Style-ID.h
deleted file mode 100644
index c531d20..0000000
--- a/3rdparty/libe2ap/Style-ID.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_Style_ID_H_
-#define	_Style_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Style-ID */
-typedef long	 Style_ID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_Style_ID;
-asn_struct_free_f Style_ID_free;
-asn_struct_print_f Style_ID_print;
-asn_constr_check_f Style_ID_constraint;
-ber_type_decoder_f Style_ID_decode_ber;
-der_type_encoder_f Style_ID_encode_der;
-xer_type_decoder_f Style_ID_decode_xer;
-xer_type_encoder_f Style_ID_encode_xer;
-per_type_decoder_f Style_ID_decode_uper;
-per_type_encoder_f Style_ID_encode_uper;
-per_type_decoder_f Style_ID_decode_aper;
-per_type_encoder_f Style_ID_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _Style_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/SubbandCQI.c b/3rdparty/libe2ap/SubbandCQI.c
deleted file mode 100644
index a6fa5bd..0000000
--- a/3rdparty/libe2ap/SubbandCQI.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "SubbandCQI.h"
-
-#include "SubbandCQICodeword1.h"
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_SubbandCQI_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQI, subbandCQICodeword0),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_SubbandCQICodeword0,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"subbandCQICodeword0"
-		},
-	{ ATF_POINTER, 2, offsetof(struct SubbandCQI, subbandCQICodeword1),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_SubbandCQICodeword1,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"subbandCQICodeword1"
-		},
-	{ ATF_POINTER, 1, offsetof(struct SubbandCQI, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P67,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_SubbandCQI_oms_1[] = { 1, 2 };
-static const ber_tlv_tag_t asn_DEF_SubbandCQI_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_SubbandCQI_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* subbandCQICodeword0 */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* subbandCQICodeword1 */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_SubbandCQI_specs_1 = {
-	sizeof(struct SubbandCQI),
-	offsetof(struct SubbandCQI, _asn_ctx),
-	asn_MAP_SubbandCQI_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_SubbandCQI_oms_1,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_SubbandCQI = {
-	"SubbandCQI",
-	"SubbandCQI",
-	&asn_OP_SEQUENCE,
-	asn_DEF_SubbandCQI_tags_1,
-	sizeof(asn_DEF_SubbandCQI_tags_1)
-		/sizeof(asn_DEF_SubbandCQI_tags_1[0]), /* 1 */
-	asn_DEF_SubbandCQI_tags_1,	/* Same as above */
-	sizeof(asn_DEF_SubbandCQI_tags_1)
-		/sizeof(asn_DEF_SubbandCQI_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_SubbandCQI_1,
-	3,	/* Elements count */
-	&asn_SPC_SubbandCQI_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/SubbandCQI.h b/3rdparty/libe2ap/SubbandCQI.h
deleted file mode 100644
index db6868d..0000000
--- a/3rdparty/libe2ap/SubbandCQI.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_SubbandCQI_H_
-#define	_SubbandCQI_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "SubbandCQICodeword0.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct SubbandCQICodeword1;
-struct ProtocolExtensionContainer;
-
-/* SubbandCQI */
-typedef struct SubbandCQI {
-	SubbandCQICodeword0_t	 subbandCQICodeword0;
-	struct SubbandCQICodeword1	*subbandCQICodeword1;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SubbandCQI_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_SubbandCQI;
-extern asn_SEQUENCE_specifics_t asn_SPC_SubbandCQI_specs_1;
-extern asn_TYPE_member_t asn_MBR_SubbandCQI_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _SubbandCQI_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/SubbandCQICodeword0.c b/3rdparty/libe2ap/SubbandCQICodeword0.c
deleted file mode 100644
index bf1d30e..0000000
--- a/3rdparty/libe2ap/SubbandCQICodeword0.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "SubbandCQICodeword0.h"
-
-static int
-memb_four_bitCQI_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 15)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_two_bitSubbandDifferentialCQI_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 3)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_two_bitDifferentialCQI_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 3)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_four_bitCQI_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  4,  4,  0,  15 }	/* (0..15,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_two_bitSubbandDifferentialCQI_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  3 }	/* (0..3,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_two_bitDifferentialCQI_constr_4 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  3 }	/* (0..3,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_SubbandCQICodeword0_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_SubbandCQICodeword0_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQICodeword0, choice.four_bitCQI),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_four_bitCQI_constr_2,  memb_four_bitCQI_constraint_1 },
-		0, 0, /* No default value */
-		"four-bitCQI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQICodeword0, choice.two_bitSubbandDifferentialCQI),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_two_bitSubbandDifferentialCQI_constr_3,  memb_two_bitSubbandDifferentialCQI_constraint_1 },
-		0, 0, /* No default value */
-		"two-bitSubbandDifferentialCQI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQICodeword0, choice.two_bitDifferentialCQI),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_two_bitDifferentialCQI_constr_4,  memb_two_bitDifferentialCQI_constraint_1 },
-		0, 0, /* No default value */
-		"two-bitDifferentialCQI"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_SubbandCQICodeword0_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* four-bitCQI */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* two-bitSubbandDifferentialCQI */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* two-bitDifferentialCQI */
-};
-asn_CHOICE_specifics_t asn_SPC_SubbandCQICodeword0_specs_1 = {
-	sizeof(struct SubbandCQICodeword0),
-	offsetof(struct SubbandCQICodeword0, _asn_ctx),
-	offsetof(struct SubbandCQICodeword0, present),
-	sizeof(((struct SubbandCQICodeword0 *)0)->present),
-	asn_MAP_SubbandCQICodeword0_tag2el_1,
-	3,	/* Count of tags in the map */
-	0, 0,
-	3	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_SubbandCQICodeword0 = {
-	"SubbandCQICodeword0",
-	"SubbandCQICodeword0",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_SubbandCQICodeword0_constr_1, CHOICE_constraint },
-	asn_MBR_SubbandCQICodeword0_1,
-	3,	/* Elements count */
-	&asn_SPC_SubbandCQICodeword0_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/SubbandCQICodeword0.h b/3rdparty/libe2ap/SubbandCQICodeword0.h
deleted file mode 100644
index eec8c0a..0000000
--- a/3rdparty/libe2ap/SubbandCQICodeword0.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_SubbandCQICodeword0_H_
-#define	_SubbandCQICodeword0_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum SubbandCQICodeword0_PR {
-	SubbandCQICodeword0_PR_NOTHING,	/* No components present */
-	SubbandCQICodeword0_PR_four_bitCQI,
-	SubbandCQICodeword0_PR_two_bitSubbandDifferentialCQI,
-	SubbandCQICodeword0_PR_two_bitDifferentialCQI
-	/* Extensions may appear below */
-	
-} SubbandCQICodeword0_PR;
-
-/* SubbandCQICodeword0 */
-typedef struct SubbandCQICodeword0 {
-	SubbandCQICodeword0_PR present;
-	union SubbandCQICodeword0_u {
-		long	 four_bitCQI;
-		long	 two_bitSubbandDifferentialCQI;
-		long	 two_bitDifferentialCQI;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SubbandCQICodeword0_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_SubbandCQICodeword0;
-extern asn_CHOICE_specifics_t asn_SPC_SubbandCQICodeword0_specs_1;
-extern asn_TYPE_member_t asn_MBR_SubbandCQICodeword0_1[3];
-extern asn_per_constraints_t asn_PER_type_SubbandCQICodeword0_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _SubbandCQICodeword0_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/SubbandCQICodeword1.c b/3rdparty/libe2ap/SubbandCQICodeword1.c
deleted file mode 100644
index 875e7ac..0000000
--- a/3rdparty/libe2ap/SubbandCQICodeword1.c
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "SubbandCQICodeword1.h"
-
-static int
-memb_four_bitCQI_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 15)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_three_bitSpatialDifferentialCQI_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 7)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_two_bitSubbandDifferentialCQI_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 3)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_two_bitDifferentialCQI_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 3)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_four_bitCQI_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  4,  4,  0,  15 }	/* (0..15,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_three_bitSpatialDifferentialCQI_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  7 }	/* (0..7,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_two_bitSubbandDifferentialCQI_constr_4 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  3 }	/* (0..3,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_two_bitDifferentialCQI_constr_5 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  3 }	/* (0..3,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_SubbandCQICodeword1_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  3 }	/* (0..3,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_SubbandCQICodeword1_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQICodeword1, choice.four_bitCQI),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_four_bitCQI_constr_2,  memb_four_bitCQI_constraint_1 },
-		0, 0, /* No default value */
-		"four-bitCQI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQICodeword1, choice.three_bitSpatialDifferentialCQI),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_three_bitSpatialDifferentialCQI_constr_3,  memb_three_bitSpatialDifferentialCQI_constraint_1 },
-		0, 0, /* No default value */
-		"three-bitSpatialDifferentialCQI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQICodeword1, choice.two_bitSubbandDifferentialCQI),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_two_bitSubbandDifferentialCQI_constr_4,  memb_two_bitSubbandDifferentialCQI_constraint_1 },
-		0, 0, /* No default value */
-		"two-bitSubbandDifferentialCQI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQICodeword1, choice.two_bitDifferentialCQI),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_two_bitDifferentialCQI_constr_5,  memb_two_bitDifferentialCQI_constraint_1 },
-		0, 0, /* No default value */
-		"two-bitDifferentialCQI"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_SubbandCQICodeword1_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* four-bitCQI */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* three-bitSpatialDifferentialCQI */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* two-bitSubbandDifferentialCQI */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* two-bitDifferentialCQI */
-};
-asn_CHOICE_specifics_t asn_SPC_SubbandCQICodeword1_specs_1 = {
-	sizeof(struct SubbandCQICodeword1),
-	offsetof(struct SubbandCQICodeword1, _asn_ctx),
-	offsetof(struct SubbandCQICodeword1, present),
-	sizeof(((struct SubbandCQICodeword1 *)0)->present),
-	asn_MAP_SubbandCQICodeword1_tag2el_1,
-	4,	/* Count of tags in the map */
-	0, 0,
-	4	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_SubbandCQICodeword1 = {
-	"SubbandCQICodeword1",
-	"SubbandCQICodeword1",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_SubbandCQICodeword1_constr_1, CHOICE_constraint },
-	asn_MBR_SubbandCQICodeword1_1,
-	4,	/* Elements count */
-	&asn_SPC_SubbandCQICodeword1_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/SubbandCQICodeword1.h b/3rdparty/libe2ap/SubbandCQICodeword1.h
deleted file mode 100644
index 0e1c193..0000000
--- a/3rdparty/libe2ap/SubbandCQICodeword1.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_SubbandCQICodeword1_H_
-#define	_SubbandCQICodeword1_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum SubbandCQICodeword1_PR {
-	SubbandCQICodeword1_PR_NOTHING,	/* No components present */
-	SubbandCQICodeword1_PR_four_bitCQI,
-	SubbandCQICodeword1_PR_three_bitSpatialDifferentialCQI,
-	SubbandCQICodeword1_PR_two_bitSubbandDifferentialCQI,
-	SubbandCQICodeword1_PR_two_bitDifferentialCQI
-	/* Extensions may appear below */
-	
-} SubbandCQICodeword1_PR;
-
-/* SubbandCQICodeword1 */
-typedef struct SubbandCQICodeword1 {
-	SubbandCQICodeword1_PR present;
-	union SubbandCQICodeword1_u {
-		long	 four_bitCQI;
-		long	 three_bitSpatialDifferentialCQI;
-		long	 two_bitSubbandDifferentialCQI;
-		long	 two_bitDifferentialCQI;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SubbandCQICodeword1_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_SubbandCQICodeword1;
-extern asn_CHOICE_specifics_t asn_SPC_SubbandCQICodeword1_specs_1;
-extern asn_TYPE_member_t asn_MBR_SubbandCQICodeword1_1[4];
-extern asn_per_constraints_t asn_PER_type_SubbandCQICodeword1_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _SubbandCQICodeword1_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/SubbandCQIItem.c b/3rdparty/libe2ap/SubbandCQIItem.c
deleted file mode 100644
index 0d9720b..0000000
--- a/3rdparty/libe2ap/SubbandCQIItem.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "SubbandCQIItem.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_subbandIndex_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 27)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_subbandIndex_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  5,  5,  0,  27 }	/* (0..27,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_SubbandCQIItem_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQIItem, subbandCQI),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_SubbandCQI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"subbandCQI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQIItem, subbandIndex),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_subbandIndex_constr_3,  memb_subbandIndex_constraint_1 },
-		0, 0, /* No default value */
-		"subbandIndex"
-		},
-	{ ATF_POINTER, 1, offsetof(struct SubbandCQIItem, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P68,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_SubbandCQIItem_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_SubbandCQIItem_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_SubbandCQIItem_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* subbandCQI */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* subbandIndex */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_SubbandCQIItem_specs_1 = {
-	sizeof(struct SubbandCQIItem),
-	offsetof(struct SubbandCQIItem, _asn_ctx),
-	asn_MAP_SubbandCQIItem_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_SubbandCQIItem_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_SubbandCQIItem = {
-	"SubbandCQIItem",
-	"SubbandCQIItem",
-	&asn_OP_SEQUENCE,
-	asn_DEF_SubbandCQIItem_tags_1,
-	sizeof(asn_DEF_SubbandCQIItem_tags_1)
-		/sizeof(asn_DEF_SubbandCQIItem_tags_1[0]), /* 1 */
-	asn_DEF_SubbandCQIItem_tags_1,	/* Same as above */
-	sizeof(asn_DEF_SubbandCQIItem_tags_1)
-		/sizeof(asn_DEF_SubbandCQIItem_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_SubbandCQIItem_1,
-	3,	/* Elements count */
-	&asn_SPC_SubbandCQIItem_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/SubbandCQIItem.h b/3rdparty/libe2ap/SubbandCQIItem.h
deleted file mode 100644
index 242665d..0000000
--- a/3rdparty/libe2ap/SubbandCQIItem.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_SubbandCQIItem_H_
-#define	_SubbandCQIItem_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "SubbandCQI.h"
-#include "NativeInteger.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* SubbandCQIItem */
-typedef struct SubbandCQIItem {
-	SubbandCQI_t	 subbandCQI;
-	long	 subbandIndex;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SubbandCQIItem_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_SubbandCQIItem;
-extern asn_SEQUENCE_specifics_t asn_SPC_SubbandCQIItem_specs_1;
-extern asn_TYPE_member_t asn_MBR_SubbandCQIItem_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _SubbandCQIItem_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/SubbandCQIList.c b/3rdparty/libe2ap/SubbandCQIList.c
deleted file mode 100644
index 5a58d1e..0000000
--- a/3rdparty/libe2ap/SubbandCQIList.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "SubbandCQIList.h"
-
-#include "SubbandCQIItem.h"
-asn_per_constraints_t asn_PER_type_SubbandCQIList_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 4,  4,  1,  14 }	/* (SIZE(1..14)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_SubbandCQIList_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_SubbandCQIItem,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_SubbandCQIList_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_SubbandCQIList_specs_1 = {
-	sizeof(struct SubbandCQIList),
-	offsetof(struct SubbandCQIList, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_SubbandCQIList = {
-	"SubbandCQIList",
-	"SubbandCQIList",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_SubbandCQIList_tags_1,
-	sizeof(asn_DEF_SubbandCQIList_tags_1)
-		/sizeof(asn_DEF_SubbandCQIList_tags_1[0]), /* 1 */
-	asn_DEF_SubbandCQIList_tags_1,	/* Same as above */
-	sizeof(asn_DEF_SubbandCQIList_tags_1)
-		/sizeof(asn_DEF_SubbandCQIList_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_SubbandCQIList_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_SubbandCQIList_1,
-	1,	/* Single element */
-	&asn_SPC_SubbandCQIList_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/SubbandCQIList.h b/3rdparty/libe2ap/SubbandCQIList.h
deleted file mode 100644
index 9cc66f2..0000000
--- a/3rdparty/libe2ap/SubbandCQIList.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_SubbandCQIList_H_
-#define	_SubbandCQIList_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct SubbandCQIItem;
-
-/* SubbandCQIList */
-typedef struct SubbandCQIList {
-	A_SEQUENCE_OF(struct SubbandCQIItem) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SubbandCQIList_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_SubbandCQIList;
-extern asn_SET_OF_specifics_t asn_SPC_SubbandCQIList_specs_1;
-extern asn_TYPE_member_t asn_MBR_SubbandCQIList_1[1];
-extern asn_per_constraints_t asn_PER_type_SubbandCQIList_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _SubbandCQIList_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/SubbandSize.c b/3rdparty/libe2ap/SubbandSize.c
deleted file mode 100644
index 487e2a5..0000000
--- a/3rdparty/libe2ap/SubbandSize.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "SubbandSize.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_SubbandSize_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  4 }	/* (0..4,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_SubbandSize_value2enum_1[] = {
-	{ 0,	5,	"size2" },
-	{ 1,	5,	"size3" },
-	{ 2,	5,	"size4" },
-	{ 3,	5,	"size6" },
-	{ 4,	5,	"size8" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_SubbandSize_enum2value_1[] = {
-	0,	/* size2(0) */
-	1,	/* size3(1) */
-	2,	/* size4(2) */
-	3,	/* size6(3) */
-	4	/* size8(4) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_SubbandSize_specs_1 = {
-	asn_MAP_SubbandSize_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_SubbandSize_enum2value_1,	/* N => "tag"; sorted by N */
-	5,	/* Number of elements in the maps */
-	6,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_SubbandSize_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_SubbandSize = {
-	"SubbandSize",
-	"SubbandSize",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_SubbandSize_tags_1,
-	sizeof(asn_DEF_SubbandSize_tags_1)
-		/sizeof(asn_DEF_SubbandSize_tags_1[0]), /* 1 */
-	asn_DEF_SubbandSize_tags_1,	/* Same as above */
-	sizeof(asn_DEF_SubbandSize_tags_1)
-		/sizeof(asn_DEF_SubbandSize_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_SubbandSize_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_SubbandSize_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/SubbandSize.h b/3rdparty/libe2ap/SubbandSize.h
deleted file mode 100644
index 9229c86..0000000
--- a/3rdparty/libe2ap/SubbandSize.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_SubbandSize_H_
-#define	_SubbandSize_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum SubbandSize {
-	SubbandSize_size2	= 0,
-	SubbandSize_size3	= 1,
-	SubbandSize_size4	= 2,
-	SubbandSize_size6	= 3,
-	SubbandSize_size8	= 4
-	/*
-	 * Enumeration is extensible
-	 */
-} e_SubbandSize;
-
-/* SubbandSize */
-typedef long	 SubbandSize_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_SubbandSize_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_SubbandSize;
-extern const asn_INTEGER_specifics_t asn_SPC_SubbandSize_specs_1;
-asn_struct_free_f SubbandSize_free;
-asn_struct_print_f SubbandSize_print;
-asn_constr_check_f SubbandSize_constraint;
-ber_type_decoder_f SubbandSize_decode_ber;
-der_type_encoder_f SubbandSize_encode_der;
-xer_type_decoder_f SubbandSize_decode_xer;
-xer_type_encoder_f SubbandSize_encode_xer;
-per_type_decoder_f SubbandSize_decode_uper;
-per_type_encoder_f SubbandSize_encode_uper;
-per_type_decoder_f SubbandSize_decode_aper;
-per_type_encoder_f SubbandSize_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _SubbandSize_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/SubframeAllocation.c b/3rdparty/libe2ap/SubframeAllocation.c
deleted file mode 100644
index c57ec77..0000000
--- a/3rdparty/libe2ap/SubframeAllocation.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "SubframeAllocation.h"
-
-asn_per_constraints_t asn_PER_type_SubframeAllocation_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_SubframeAllocation_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SubframeAllocation, choice.oneframe),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Oneframe,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"oneframe"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct SubframeAllocation, choice.fourframes),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Fourframes,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"fourframes"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_SubframeAllocation_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* oneframe */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* fourframes */
-};
-asn_CHOICE_specifics_t asn_SPC_SubframeAllocation_specs_1 = {
-	sizeof(struct SubframeAllocation),
-	offsetof(struct SubframeAllocation, _asn_ctx),
-	offsetof(struct SubframeAllocation, present),
-	sizeof(((struct SubframeAllocation *)0)->present),
-	asn_MAP_SubframeAllocation_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0,
-	2	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_SubframeAllocation = {
-	"SubframeAllocation",
-	"SubframeAllocation",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_SubframeAllocation_constr_1, CHOICE_constraint },
-	asn_MBR_SubframeAllocation_1,
-	2,	/* Elements count */
-	&asn_SPC_SubframeAllocation_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/SubframeAllocation.h b/3rdparty/libe2ap/SubframeAllocation.h
deleted file mode 100644
index 0d4cb59..0000000
--- a/3rdparty/libe2ap/SubframeAllocation.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_SubframeAllocation_H_
-#define	_SubframeAllocation_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "Oneframe.h"
-#include "Fourframes.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum SubframeAllocation_PR {
-	SubframeAllocation_PR_NOTHING,	/* No components present */
-	SubframeAllocation_PR_oneframe,
-	SubframeAllocation_PR_fourframes
-	/* Extensions may appear below */
-	
-} SubframeAllocation_PR;
-
-/* SubframeAllocation */
-typedef struct SubframeAllocation {
-	SubframeAllocation_PR present;
-	union SubframeAllocation_u {
-		Oneframe_t	 oneframe;
-		Fourframes_t	 fourframes;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SubframeAllocation_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_SubframeAllocation;
-extern asn_CHOICE_specifics_t asn_SPC_SubframeAllocation_specs_1;
-extern asn_TYPE_member_t asn_MBR_SubframeAllocation_1[2];
-extern asn_per_constraints_t asn_PER_type_SubframeAllocation_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _SubframeAllocation_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/SubframeAssignment.c b/3rdparty/libe2ap/SubframeAssignment.c
deleted file mode 100644
index d8a30da..0000000
--- a/3rdparty/libe2ap/SubframeAssignment.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "SubframeAssignment.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_SubframeAssignment_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  6 }	/* (0..6,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_SubframeAssignment_value2enum_1[] = {
-	{ 0,	3,	"sa0" },
-	{ 1,	3,	"sa1" },
-	{ 2,	3,	"sa2" },
-	{ 3,	3,	"sa3" },
-	{ 4,	3,	"sa4" },
-	{ 5,	3,	"sa5" },
-	{ 6,	3,	"sa6" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_SubframeAssignment_enum2value_1[] = {
-	0,	/* sa0(0) */
-	1,	/* sa1(1) */
-	2,	/* sa2(2) */
-	3,	/* sa3(3) */
-	4,	/* sa4(4) */
-	5,	/* sa5(5) */
-	6	/* sa6(6) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_SubframeAssignment_specs_1 = {
-	asn_MAP_SubframeAssignment_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_SubframeAssignment_enum2value_1,	/* N => "tag"; sorted by N */
-	7,	/* Number of elements in the maps */
-	8,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_SubframeAssignment_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_SubframeAssignment = {
-	"SubframeAssignment",
-	"SubframeAssignment",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_SubframeAssignment_tags_1,
-	sizeof(asn_DEF_SubframeAssignment_tags_1)
-		/sizeof(asn_DEF_SubframeAssignment_tags_1[0]), /* 1 */
-	asn_DEF_SubframeAssignment_tags_1,	/* Same as above */
-	sizeof(asn_DEF_SubframeAssignment_tags_1)
-		/sizeof(asn_DEF_SubframeAssignment_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_SubframeAssignment_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_SubframeAssignment_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/SubframeAssignment.h b/3rdparty/libe2ap/SubframeAssignment.h
deleted file mode 100644
index 34185c3..0000000
--- a/3rdparty/libe2ap/SubframeAssignment.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_SubframeAssignment_H_
-#define	_SubframeAssignment_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum SubframeAssignment {
-	SubframeAssignment_sa0	= 0,
-	SubframeAssignment_sa1	= 1,
-	SubframeAssignment_sa2	= 2,
-	SubframeAssignment_sa3	= 3,
-	SubframeAssignment_sa4	= 4,
-	SubframeAssignment_sa5	= 5,
-	SubframeAssignment_sa6	= 6
-	/*
-	 * Enumeration is extensible
-	 */
-} e_SubframeAssignment;
-
-/* SubframeAssignment */
-typedef long	 SubframeAssignment_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_SubframeAssignment_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_SubframeAssignment;
-extern const asn_INTEGER_specifics_t asn_SPC_SubframeAssignment_specs_1;
-asn_struct_free_f SubframeAssignment_free;
-asn_struct_print_f SubframeAssignment_print;
-asn_constr_check_f SubframeAssignment_constraint;
-ber_type_decoder_f SubframeAssignment_decode_ber;
-der_type_encoder_f SubframeAssignment_encode_der;
-xer_type_decoder_f SubframeAssignment_decode_xer;
-xer_type_encoder_f SubframeAssignment_encode_xer;
-per_type_decoder_f SubframeAssignment_decode_uper;
-per_type_encoder_f SubframeAssignment_encode_uper;
-per_type_decoder_f SubframeAssignment_decode_aper;
-per_type_encoder_f SubframeAssignment_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _SubframeAssignment_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/SupportedSULFreqBandItem.c b/3rdparty/libe2ap/SupportedSULFreqBandItem.c
deleted file mode 100644
index b00889c..0000000
--- a/3rdparty/libe2ap/SupportedSULFreqBandItem.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "SupportedSULFreqBandItem.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_freqBandIndicatorNr_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 1 && value <= 1024)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_freqBandIndicatorNr_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  10,  10,  1,  1024 }	/* (1..1024,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_SupportedSULFreqBandItem_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct SupportedSULFreqBandItem, freqBandIndicatorNr),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_freqBandIndicatorNr_constr_2,  memb_freqBandIndicatorNr_constraint_1 },
-		0, 0, /* No default value */
-		"freqBandIndicatorNr"
-		},
-	{ ATF_POINTER, 1, offsetof(struct SupportedSULFreqBandItem, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P70,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_SupportedSULFreqBandItem_oms_1[] = { 1 };
-static const ber_tlv_tag_t asn_DEF_SupportedSULFreqBandItem_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_SupportedSULFreqBandItem_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* freqBandIndicatorNr */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_SupportedSULFreqBandItem_specs_1 = {
-	sizeof(struct SupportedSULFreqBandItem),
-	offsetof(struct SupportedSULFreqBandItem, _asn_ctx),
-	asn_MAP_SupportedSULFreqBandItem_tag2el_1,
-	2,	/* Count of tags in the map */
-	asn_MAP_SupportedSULFreqBandItem_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_SupportedSULFreqBandItem = {
-	"SupportedSULFreqBandItem",
-	"SupportedSULFreqBandItem",
-	&asn_OP_SEQUENCE,
-	asn_DEF_SupportedSULFreqBandItem_tags_1,
-	sizeof(asn_DEF_SupportedSULFreqBandItem_tags_1)
-		/sizeof(asn_DEF_SupportedSULFreqBandItem_tags_1[0]), /* 1 */
-	asn_DEF_SupportedSULFreqBandItem_tags_1,	/* Same as above */
-	sizeof(asn_DEF_SupportedSULFreqBandItem_tags_1)
-		/sizeof(asn_DEF_SupportedSULFreqBandItem_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_SupportedSULFreqBandItem_1,
-	2,	/* Elements count */
-	&asn_SPC_SupportedSULFreqBandItem_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/SupportedSULFreqBandItem.h b/3rdparty/libe2ap/SupportedSULFreqBandItem.h
deleted file mode 100644
index 0a2aafa..0000000
--- a/3rdparty/libe2ap/SupportedSULFreqBandItem.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_SupportedSULFreqBandItem_H_
-#define	_SupportedSULFreqBandItem_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* SupportedSULFreqBandItem */
-typedef struct SupportedSULFreqBandItem {
-	long	 freqBandIndicatorNr;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} SupportedSULFreqBandItem_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_SupportedSULFreqBandItem;
-extern asn_SEQUENCE_specifics_t asn_SPC_SupportedSULFreqBandItem_specs_1;
-extern asn_TYPE_member_t asn_MBR_SupportedSULFreqBandItem_1[2];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _SupportedSULFreqBandItem_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/TAC.c b/3rdparty/libe2ap/TAC.c
deleted file mode 100644
index 37341cb..0000000
--- a/3rdparty/libe2ap/TAC.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "TAC.h"
-
-int
-TAC_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	size = st->size;
-	
-	if((size == 2)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_TAC_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  2,  2 }	/* (SIZE(2..2)) */,
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_TAC_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_TAC = {
-	"TAC",
-	"TAC",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_TAC_tags_1,
-	sizeof(asn_DEF_TAC_tags_1)
-		/sizeof(asn_DEF_TAC_tags_1[0]), /* 1 */
-	asn_DEF_TAC_tags_1,	/* Same as above */
-	sizeof(asn_DEF_TAC_tags_1)
-		/sizeof(asn_DEF_TAC_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_TAC_constr_1, TAC_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/TAC.h b/3rdparty/libe2ap/TAC.h
deleted file mode 100644
index 2a76cd5..0000000
--- a/3rdparty/libe2ap/TAC.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_TAC_H_
-#define	_TAC_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* TAC */
-typedef OCTET_STRING_t	 TAC_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_TAC_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_TAC;
-asn_struct_free_f TAC_free;
-asn_struct_print_f TAC_print;
-asn_constr_check_f TAC_constraint;
-ber_type_decoder_f TAC_decode_ber;
-der_type_encoder_f TAC_encode_der;
-xer_type_decoder_f TAC_decode_xer;
-xer_type_encoder_f TAC_encode_xer;
-per_type_decoder_f TAC_decode_uper;
-per_type_encoder_f TAC_encode_uper;
-per_type_decoder_f TAC_decode_aper;
-per_type_encoder_f TAC_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _TAC_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/TDD-Info.c b/3rdparty/libe2ap/TDD-Info.c
deleted file mode 100644
index 469e686..0000000
--- a/3rdparty/libe2ap/TDD-Info.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "TDD-Info.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_TDD_Info_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_Info, eARFCN),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_EARFCN,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"eARFCN"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_Info, transmission_Bandwidth),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_Transmission_Bandwidth,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"transmission-Bandwidth"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_Info, subframeAssignment),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_SubframeAssignment,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"subframeAssignment"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_Info, specialSubframe_Info),
-		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_SpecialSubframe_Info,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"specialSubframe-Info"
-		},
-	{ ATF_POINTER, 1, offsetof(struct TDD_Info, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P71,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_TDD_Info_oms_1[] = { 4 };
-static const ber_tlv_tag_t asn_DEF_TDD_Info_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_TDD_Info_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* eARFCN */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* transmission-Bandwidth */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* subframeAssignment */
-    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* specialSubframe-Info */
-    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_TDD_Info_specs_1 = {
-	sizeof(struct TDD_Info),
-	offsetof(struct TDD_Info, _asn_ctx),
-	asn_MAP_TDD_Info_tag2el_1,
-	5,	/* Count of tags in the map */
-	asn_MAP_TDD_Info_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	5,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_TDD_Info = {
-	"TDD-Info",
-	"TDD-Info",
-	&asn_OP_SEQUENCE,
-	asn_DEF_TDD_Info_tags_1,
-	sizeof(asn_DEF_TDD_Info_tags_1)
-		/sizeof(asn_DEF_TDD_Info_tags_1[0]), /* 1 */
-	asn_DEF_TDD_Info_tags_1,	/* Same as above */
-	sizeof(asn_DEF_TDD_Info_tags_1)
-		/sizeof(asn_DEF_TDD_Info_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_TDD_Info_1,
-	5,	/* Elements count */
-	&asn_SPC_TDD_Info_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/TDD-Info.h b/3rdparty/libe2ap/TDD-Info.h
deleted file mode 100644
index 6bccfa2..0000000
--- a/3rdparty/libe2ap/TDD-Info.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_TDD_Info_H_
-#define	_TDD_Info_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "EARFCN.h"
-#include "Transmission-Bandwidth.h"
-#include "SubframeAssignment.h"
-#include "SpecialSubframe-Info.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* TDD-Info */
-typedef struct TDD_Info {
-	EARFCN_t	 eARFCN;
-	Transmission_Bandwidth_t	 transmission_Bandwidth;
-	SubframeAssignment_t	 subframeAssignment;
-	SpecialSubframe_Info_t	 specialSubframe_Info;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} TDD_Info_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_TDD_Info;
-extern asn_SEQUENCE_specifics_t asn_SPC_TDD_Info_specs_1;
-extern asn_TYPE_member_t asn_MBR_TDD_Info_1[5];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _TDD_Info_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/TDD-InfoNeighbourServedNRCell-Information.c b/3rdparty/libe2ap/TDD-InfoNeighbourServedNRCell-Information.c
deleted file mode 100644
index f28c9b2..0000000
--- a/3rdparty/libe2ap/TDD-InfoNeighbourServedNRCell-Information.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "TDD-InfoNeighbourServedNRCell-Information.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_TDD_InfoNeighbourServedNRCell_Information_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_InfoNeighbourServedNRCell_Information, nRFreqInfo),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRFreqInfo,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nRFreqInfo"
-		},
-	{ ATF_POINTER, 1, offsetof(struct TDD_InfoNeighbourServedNRCell_Information, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P15,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_TDD_InfoNeighbourServedNRCell_Information_oms_1[] = { 1 };
-static const ber_tlv_tag_t asn_DEF_TDD_InfoNeighbourServedNRCell_Information_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_TDD_InfoNeighbourServedNRCell_Information_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nRFreqInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_TDD_InfoNeighbourServedNRCell_Information_specs_1 = {
-	sizeof(struct TDD_InfoNeighbourServedNRCell_Information),
-	offsetof(struct TDD_InfoNeighbourServedNRCell_Information, _asn_ctx),
-	asn_MAP_TDD_InfoNeighbourServedNRCell_Information_tag2el_1,
-	2,	/* Count of tags in the map */
-	asn_MAP_TDD_InfoNeighbourServedNRCell_Information_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_TDD_InfoNeighbourServedNRCell_Information = {
-	"TDD-InfoNeighbourServedNRCell-Information",
-	"TDD-InfoNeighbourServedNRCell-Information",
-	&asn_OP_SEQUENCE,
-	asn_DEF_TDD_InfoNeighbourServedNRCell_Information_tags_1,
-	sizeof(asn_DEF_TDD_InfoNeighbourServedNRCell_Information_tags_1)
-		/sizeof(asn_DEF_TDD_InfoNeighbourServedNRCell_Information_tags_1[0]), /* 1 */
-	asn_DEF_TDD_InfoNeighbourServedNRCell_Information_tags_1,	/* Same as above */
-	sizeof(asn_DEF_TDD_InfoNeighbourServedNRCell_Information_tags_1)
-		/sizeof(asn_DEF_TDD_InfoNeighbourServedNRCell_Information_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_TDD_InfoNeighbourServedNRCell_Information_1,
-	2,	/* Elements count */
-	&asn_SPC_TDD_InfoNeighbourServedNRCell_Information_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/TDD-InfoNeighbourServedNRCell-Information.h b/3rdparty/libe2ap/TDD-InfoNeighbourServedNRCell-Information.h
deleted file mode 100644
index 266a304..0000000
--- a/3rdparty/libe2ap/TDD-InfoNeighbourServedNRCell-Information.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_TDD_InfoNeighbourServedNRCell_Information_H_
-#define	_TDD_InfoNeighbourServedNRCell_Information_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NRFreqInfo.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* TDD-InfoNeighbourServedNRCell-Information */
-typedef struct TDD_InfoNeighbourServedNRCell_Information {
-	NRFreqInfo_t	 nRFreqInfo;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} TDD_InfoNeighbourServedNRCell_Information_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_TDD_InfoNeighbourServedNRCell_Information;
-extern asn_SEQUENCE_specifics_t asn_SPC_TDD_InfoNeighbourServedNRCell_Information_specs_1;
-extern asn_TYPE_member_t asn_MBR_TDD_InfoNeighbourServedNRCell_Information_1[2];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _TDD_InfoNeighbourServedNRCell_Information_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/TDD-InfoServedNRCell-Information.c b/3rdparty/libe2ap/TDD-InfoServedNRCell-Information.c
deleted file mode 100644
index c74b51d..0000000
--- a/3rdparty/libe2ap/TDD-InfoServedNRCell-Information.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "TDD-InfoServedNRCell-Information.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_TDD_InfoServedNRCell_Information_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_InfoServedNRCell_Information, nRFreqInfo),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NRFreqInfo,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nRFreqInfo"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct TDD_InfoServedNRCell_Information, nR_TxBW),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NR_TxBW,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"nR-TxBW"
-		},
-	{ ATF_POINTER, 1, offsetof(struct TDD_InfoServedNRCell_Information, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P14,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_TDD_InfoServedNRCell_Information_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_TDD_InfoServedNRCell_Information_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_TDD_InfoServedNRCell_Information_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nRFreqInfo */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* nR-TxBW */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_TDD_InfoServedNRCell_Information_specs_1 = {
-	sizeof(struct TDD_InfoServedNRCell_Information),
-	offsetof(struct TDD_InfoServedNRCell_Information, _asn_ctx),
-	asn_MAP_TDD_InfoServedNRCell_Information_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_TDD_InfoServedNRCell_Information_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_TDD_InfoServedNRCell_Information = {
-	"TDD-InfoServedNRCell-Information",
-	"TDD-InfoServedNRCell-Information",
-	&asn_OP_SEQUENCE,
-	asn_DEF_TDD_InfoServedNRCell_Information_tags_1,
-	sizeof(asn_DEF_TDD_InfoServedNRCell_Information_tags_1)
-		/sizeof(asn_DEF_TDD_InfoServedNRCell_Information_tags_1[0]), /* 1 */
-	asn_DEF_TDD_InfoServedNRCell_Information_tags_1,	/* Same as above */
-	sizeof(asn_DEF_TDD_InfoServedNRCell_Information_tags_1)
-		/sizeof(asn_DEF_TDD_InfoServedNRCell_Information_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_TDD_InfoServedNRCell_Information_1,
-	3,	/* Elements count */
-	&asn_SPC_TDD_InfoServedNRCell_Information_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/TDD-InfoServedNRCell-Information.h b/3rdparty/libe2ap/TDD-InfoServedNRCell-Information.h
deleted file mode 100644
index 38de9a8..0000000
--- a/3rdparty/libe2ap/TDD-InfoServedNRCell-Information.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_TDD_InfoServedNRCell_Information_H_
-#define	_TDD_InfoServedNRCell_Information_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NRFreqInfo.h"
-#include "NR-TxBW.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* TDD-InfoServedNRCell-Information */
-typedef struct TDD_InfoServedNRCell_Information {
-	NRFreqInfo_t	 nRFreqInfo;
-	NR_TxBW_t	 nR_TxBW;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} TDD_InfoServedNRCell_Information_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_TDD_InfoServedNRCell_Information;
-extern asn_SEQUENCE_specifics_t asn_SPC_TDD_InfoServedNRCell_Information_specs_1;
-extern asn_TYPE_member_t asn_MBR_TDD_InfoServedNRCell_Information_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _TDD_InfoServedNRCell_Information_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/TimeStamp.c b/3rdparty/libe2ap/TimeStamp.c
deleted file mode 100644
index e3542a8..0000000
--- a/3rdparty/libe2ap/TimeStamp.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "TimeStamp.h"
-
-int
-TimeStamp_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	size = st->size;
-	
-	if((size == 8)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using OCTET_STRING,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_TimeStamp_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  8,  8 }	/* (SIZE(8..8)) */,
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_TimeStamp_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_TimeStamp = {
-	"TimeStamp",
-	"TimeStamp",
-	&asn_OP_OCTET_STRING,
-	asn_DEF_TimeStamp_tags_1,
-	sizeof(asn_DEF_TimeStamp_tags_1)
-		/sizeof(asn_DEF_TimeStamp_tags_1[0]), /* 1 */
-	asn_DEF_TimeStamp_tags_1,	/* Same as above */
-	sizeof(asn_DEF_TimeStamp_tags_1)
-		/sizeof(asn_DEF_TimeStamp_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_TimeStamp_constr_1, TimeStamp_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_OCTET_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/TimeStamp.h b/3rdparty/libe2ap/TimeStamp.h
deleted file mode 100644
index 67096f3..0000000
--- a/3rdparty/libe2ap/TimeStamp.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_TimeStamp_H_
-#define	_TimeStamp_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "OCTET_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* TimeStamp */
-typedef OCTET_STRING_t	 TimeStamp_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_TimeStamp_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_TimeStamp;
-asn_struct_free_f TimeStamp_free;
-asn_struct_print_f TimeStamp_print;
-asn_constr_check_f TimeStamp_constraint;
-ber_type_decoder_f TimeStamp_decode_ber;
-der_type_encoder_f TimeStamp_encode_der;
-xer_type_decoder_f TimeStamp_decode_xer;
-xer_type_encoder_f TimeStamp_encode_xer;
-per_type_decoder_f TimeStamp_decode_uper;
-per_type_encoder_f TimeStamp_encode_uper;
-per_type_decoder_f TimeStamp_decode_aper;
-per_type_encoder_f TimeStamp_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _TimeStamp_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/TimeToWait.c b/3rdparty/libe2ap/TimeToWait.c
deleted file mode 100644
index cb04220..0000000
--- a/3rdparty/libe2ap/TimeToWait.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "TimeToWait.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_TimeToWait_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  5 }	/* (0..5,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_TimeToWait_value2enum_1[] = {
-	{ 0,	3,	"v1s" },
-	{ 1,	3,	"v2s" },
-	{ 2,	3,	"v5s" },
-	{ 3,	4,	"v10s" },
-	{ 4,	4,	"v20s" },
-	{ 5,	4,	"v60s" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_TimeToWait_enum2value_1[] = {
-	3,	/* v10s(3) */
-	0,	/* v1s(0) */
-	4,	/* v20s(4) */
-	1,	/* v2s(1) */
-	2,	/* v5s(2) */
-	5	/* v60s(5) */
-	/* This list is extensible */
-};
-static const asn_INTEGER_specifics_t asn_SPC_TimeToWait_specs_1 = {
-	asn_MAP_TimeToWait_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_TimeToWait_enum2value_1,	/* N => "tag"; sorted by N */
-	6,	/* Number of elements in the maps */
-	7,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_TimeToWait_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_TimeToWait = {
-	"TimeToWait",
-	"TimeToWait",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_TimeToWait_tags_1,
-	sizeof(asn_DEF_TimeToWait_tags_1)
-		/sizeof(asn_DEF_TimeToWait_tags_1[0]), /* 1 */
-	asn_DEF_TimeToWait_tags_1,	/* Same as above */
-	sizeof(asn_DEF_TimeToWait_tags_1)
-		/sizeof(asn_DEF_TimeToWait_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_TimeToWait_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_TimeToWait_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/TimeToWait.h b/3rdparty/libe2ap/TimeToWait.h
deleted file mode 100644
index 71924aa..0000000
--- a/3rdparty/libe2ap/TimeToWait.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_TimeToWait_H_
-#define	_TimeToWait_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum TimeToWait {
-	TimeToWait_v1s	= 0,
-	TimeToWait_v2s	= 1,
-	TimeToWait_v5s	= 2,
-	TimeToWait_v10s	= 3,
-	TimeToWait_v20s	= 4,
-	TimeToWait_v60s	= 5
-	/*
-	 * Enumeration is extensible
-	 */
-} e_TimeToWait;
-
-/* TimeToWait */
-typedef long	 TimeToWait_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_TimeToWait;
-asn_struct_free_f TimeToWait_free;
-asn_struct_print_f TimeToWait_print;
-asn_constr_check_f TimeToWait_constraint;
-ber_type_decoder_f TimeToWait_decode_ber;
-der_type_encoder_f TimeToWait_encode_der;
-xer_type_decoder_f TimeToWait_decode_xer;
-xer_type_encoder_f TimeToWait_encode_xer;
-per_type_decoder_f TimeToWait_decode_uper;
-per_type_encoder_f TimeToWait_encode_uper;
-per_type_decoder_f TimeToWait_decode_aper;
-per_type_encoder_f TimeToWait_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _TimeToWait_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/Transmission-Bandwidth.c b/3rdparty/libe2ap/Transmission-Bandwidth.c
deleted file mode 100644
index eb6b6be..0000000
--- a/3rdparty/libe2ap/Transmission-Bandwidth.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "Transmission-Bandwidth.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_Transmission_Bandwidth_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  5 }	/* (0..5,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_Transmission_Bandwidth_value2enum_1[] = {
-	{ 0,	3,	"bw6" },
-	{ 1,	4,	"bw15" },
-	{ 2,	4,	"bw25" },
-	{ 3,	4,	"bw50" },
-	{ 4,	4,	"bw75" },
-	{ 5,	5,	"bw100" },
-	{ 6,	3,	"bw1" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_Transmission_Bandwidth_enum2value_1[] = {
-	6,	/* bw1(6) */
-	5,	/* bw100(5) */
-	1,	/* bw15(1) */
-	2,	/* bw25(2) */
-	3,	/* bw50(3) */
-	0,	/* bw6(0) */
-	4	/* bw75(4) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_Transmission_Bandwidth_specs_1 = {
-	asn_MAP_Transmission_Bandwidth_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_Transmission_Bandwidth_enum2value_1,	/* N => "tag"; sorted by N */
-	7,	/* Number of elements in the maps */
-	7,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_Transmission_Bandwidth_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_Transmission_Bandwidth = {
-	"Transmission-Bandwidth",
-	"Transmission-Bandwidth",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_Transmission_Bandwidth_tags_1,
-	sizeof(asn_DEF_Transmission_Bandwidth_tags_1)
-		/sizeof(asn_DEF_Transmission_Bandwidth_tags_1[0]), /* 1 */
-	asn_DEF_Transmission_Bandwidth_tags_1,	/* Same as above */
-	sizeof(asn_DEF_Transmission_Bandwidth_tags_1)
-		/sizeof(asn_DEF_Transmission_Bandwidth_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_Transmission_Bandwidth_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_Transmission_Bandwidth_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/Transmission-Bandwidth.h b/3rdparty/libe2ap/Transmission-Bandwidth.h
deleted file mode 100644
index 5c11cfa..0000000
--- a/3rdparty/libe2ap/Transmission-Bandwidth.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_Transmission_Bandwidth_H_
-#define	_Transmission_Bandwidth_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum Transmission_Bandwidth {
-	Transmission_Bandwidth_bw6	= 0,
-	Transmission_Bandwidth_bw15	= 1,
-	Transmission_Bandwidth_bw25	= 2,
-	Transmission_Bandwidth_bw50	= 3,
-	Transmission_Bandwidth_bw75	= 4,
-	Transmission_Bandwidth_bw100	= 5,
-	/*
-	 * Enumeration is extensible
-	 */
-	Transmission_Bandwidth_bw1	= 6
-} e_Transmission_Bandwidth;
-
-/* Transmission-Bandwidth */
-typedef long	 Transmission_Bandwidth_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_Transmission_Bandwidth_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_Transmission_Bandwidth;
-extern const asn_INTEGER_specifics_t asn_SPC_Transmission_Bandwidth_specs_1;
-asn_struct_free_f Transmission_Bandwidth_free;
-asn_struct_print_f Transmission_Bandwidth_print;
-asn_constr_check_f Transmission_Bandwidth_constraint;
-ber_type_decoder_f Transmission_Bandwidth_decode_ber;
-der_type_encoder_f Transmission_Bandwidth_encode_der;
-xer_type_decoder_f Transmission_Bandwidth_decode_xer;
-xer_type_encoder_f Transmission_Bandwidth_encode_xer;
-per_type_decoder_f Transmission_Bandwidth_decode_uper;
-per_type_encoder_f Transmission_Bandwidth_encode_uper;
-per_type_decoder_f Transmission_Bandwidth_decode_aper;
-per_type_encoder_f Transmission_Bandwidth_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _Transmission_Bandwidth_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/TriggeringMessage.c b/3rdparty/libe2ap/TriggeringMessage.c
deleted file mode 100644
index 9047022..0000000
--- a/3rdparty/libe2ap/TriggeringMessage.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-CommonDataTypes"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "TriggeringMessage.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_TriggeringMessage_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_TriggeringMessage_value2enum_1[] = {
-	{ 0,	18,	"initiating-message" },
-	{ 1,	18,	"successful-outcome" },
-	{ 2,	20,	"unsuccessful-outcome" }
-};
-static const unsigned int asn_MAP_TriggeringMessage_enum2value_1[] = {
-	0,	/* initiating-message(0) */
-	1,	/* successful-outcome(1) */
-	2	/* unsuccessful-outcome(2) */
-};
-const asn_INTEGER_specifics_t asn_SPC_TriggeringMessage_specs_1 = {
-	asn_MAP_TriggeringMessage_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_TriggeringMessage_enum2value_1,	/* N => "tag"; sorted by N */
-	3,	/* Number of elements in the maps */
-	0,	/* Enumeration is not extensible */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_TriggeringMessage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_TriggeringMessage = {
-	"TriggeringMessage",
-	"TriggeringMessage",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_TriggeringMessage_tags_1,
-	sizeof(asn_DEF_TriggeringMessage_tags_1)
-		/sizeof(asn_DEF_TriggeringMessage_tags_1[0]), /* 1 */
-	asn_DEF_TriggeringMessage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_TriggeringMessage_tags_1)
-		/sizeof(asn_DEF_TriggeringMessage_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_TriggeringMessage_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_TriggeringMessage_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/TriggeringMessage.h b/3rdparty/libe2ap/TriggeringMessage.h
deleted file mode 100644
index 84c398f..0000000
--- a/3rdparty/libe2ap/TriggeringMessage.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-CommonDataTypes"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_TriggeringMessage_H_
-#define	_TriggeringMessage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum TriggeringMessage {
-	TriggeringMessage_initiating_message	= 0,
-	TriggeringMessage_successful_outcome	= 1,
-	TriggeringMessage_unsuccessful_outcome	= 2
-} e_TriggeringMessage;
-
-/* TriggeringMessage */
-typedef long	 TriggeringMessage_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_TriggeringMessage_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_TriggeringMessage;
-extern const asn_INTEGER_specifics_t asn_SPC_TriggeringMessage_specs_1;
-asn_struct_free_f TriggeringMessage_free;
-asn_struct_print_f TriggeringMessage_print;
-asn_constr_check_f TriggeringMessage_constraint;
-ber_type_decoder_f TriggeringMessage_decode_ber;
-der_type_encoder_f TriggeringMessage_encode_der;
-xer_type_decoder_f TriggeringMessage_decode_xer;
-xer_type_encoder_f TriggeringMessage_encode_xer;
-per_type_decoder_f TriggeringMessage_decode_uper;
-per_type_encoder_f TriggeringMessage_encode_uper;
-per_type_decoder_f TriggeringMessage_decode_aper;
-per_type_encoder_f TriggeringMessage_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _TriggeringMessage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/TypeOfError.c b/3rdparty/libe2ap/TypeOfError.c
deleted file mode 100644
index d1c1546..0000000
--- a/3rdparty/libe2ap/TypeOfError.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "TypeOfError.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_TypeOfError_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_TypeOfError_value2enum_1[] = {
-	{ 0,	14,	"not-understood" },
-	{ 1,	7,	"missing" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_TypeOfError_enum2value_1[] = {
-	1,	/* missing(1) */
-	0	/* not-understood(0) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_TypeOfError_specs_1 = {
-	asn_MAP_TypeOfError_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_TypeOfError_enum2value_1,	/* N => "tag"; sorted by N */
-	2,	/* Number of elements in the maps */
-	3,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_TypeOfError_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_TypeOfError = {
-	"TypeOfError",
-	"TypeOfError",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_TypeOfError_tags_1,
-	sizeof(asn_DEF_TypeOfError_tags_1)
-		/sizeof(asn_DEF_TypeOfError_tags_1[0]), /* 1 */
-	asn_DEF_TypeOfError_tags_1,	/* Same as above */
-	sizeof(asn_DEF_TypeOfError_tags_1)
-		/sizeof(asn_DEF_TypeOfError_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_TypeOfError_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_TypeOfError_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/TypeOfError.h b/3rdparty/libe2ap/TypeOfError.h
deleted file mode 100644
index 54165ac..0000000
--- a/3rdparty/libe2ap/TypeOfError.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_TypeOfError_H_
-#define	_TypeOfError_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum TypeOfError {
-	TypeOfError_not_understood	= 0,
-	TypeOfError_missing	= 1
-	/*
-	 * Enumeration is extensible
-	 */
-} e_TypeOfError;
-
-/* TypeOfError */
-typedef long	 TypeOfError_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_TypeOfError_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_TypeOfError;
-extern const asn_INTEGER_specifics_t asn_SPC_TypeOfError_specs_1;
-asn_struct_free_f TypeOfError_free;
-asn_struct_print_f TypeOfError_print;
-asn_constr_check_f TypeOfError_constraint;
-ber_type_decoder_f TypeOfError_decode_ber;
-der_type_encoder_f TypeOfError_encode_der;
-xer_type_decoder_f TypeOfError_decode_xer;
-xer_type_encoder_f TypeOfError_encode_xer;
-per_type_decoder_f TypeOfError_decode_uper;
-per_type_encoder_f TypeOfError_encode_uper;
-per_type_decoder_f TypeOfError_decode_aper;
-per_type_encoder_f TypeOfError_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _TypeOfError_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/TypeOfMessage.c b/3rdparty/libe2ap/TypeOfMessage.c
deleted file mode 100644
index 69880cf..0000000
--- a/3rdparty/libe2ap/TypeOfMessage.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "TypeOfMessage.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_TypeOfMessage_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 2,  2,  0,  3 }	/* (0..3) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_TypeOfMessage_value2enum_1[] = {
-	{ 0,	7,	"nothing" },
-	{ 1,	18,	"initiating-message" },
-	{ 2,	18,	"successful-outcome" },
-	{ 3,	20,	"unsuccessful-outcome" }
-};
-static const unsigned int asn_MAP_TypeOfMessage_enum2value_1[] = {
-	1,	/* initiating-message(1) */
-	0,	/* nothing(0) */
-	2,	/* successful-outcome(2) */
-	3	/* unsuccessful-outcome(3) */
-};
-const asn_INTEGER_specifics_t asn_SPC_TypeOfMessage_specs_1 = {
-	asn_MAP_TypeOfMessage_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_TypeOfMessage_enum2value_1,	/* N => "tag"; sorted by N */
-	4,	/* Number of elements in the maps */
-	0,	/* Enumeration is not extensible */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_TypeOfMessage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_TypeOfMessage = {
-	"TypeOfMessage",
-	"TypeOfMessage",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_TypeOfMessage_tags_1,
-	sizeof(asn_DEF_TypeOfMessage_tags_1)
-		/sizeof(asn_DEF_TypeOfMessage_tags_1[0]), /* 1 */
-	asn_DEF_TypeOfMessage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_TypeOfMessage_tags_1)
-		/sizeof(asn_DEF_TypeOfMessage_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_TypeOfMessage_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_TypeOfMessage_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/TypeOfMessage.h b/3rdparty/libe2ap/TypeOfMessage.h
deleted file mode 100644
index 42ad31d..0000000
--- a/3rdparty/libe2ap/TypeOfMessage.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "E2SM-gNB-X2-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_TypeOfMessage_H_
-#define	_TypeOfMessage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum TypeOfMessage {
-	TypeOfMessage_nothing	= 0,
-	TypeOfMessage_initiating_message	= 1,
-	TypeOfMessage_successful_outcome	= 2,
-	TypeOfMessage_unsuccessful_outcome	= 3
-} e_TypeOfMessage;
-
-/* TypeOfMessage */
-typedef long	 TypeOfMessage_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_TypeOfMessage_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_TypeOfMessage;
-extern const asn_INTEGER_specifics_t asn_SPC_TypeOfMessage_specs_1;
-asn_struct_free_f TypeOfMessage_free;
-asn_struct_print_f TypeOfMessage_print;
-asn_constr_check_f TypeOfMessage_constraint;
-ber_type_decoder_f TypeOfMessage_decode_ber;
-der_type_encoder_f TypeOfMessage_encode_der;
-xer_type_decoder_f TypeOfMessage_decode_xer;
-xer_type_encoder_f TypeOfMessage_encode_xer;
-per_type_decoder_f TypeOfMessage_decode_uper;
-per_type_encoder_f TypeOfMessage_encode_uper;
-per_type_decoder_f TypeOfMessage_decode_aper;
-per_type_encoder_f TypeOfMessage_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _TypeOfMessage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/UE-X2AP-ID-Extension.c b/3rdparty/libe2ap/UE-X2AP-ID-Extension.c
deleted file mode 100644
index 2e403dd..0000000
--- a/3rdparty/libe2ap/UE-X2AP-ID-Extension.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "UE-X2AP-ID-Extension.h"
-
-int
-UE_X2AP_ID_Extension_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 4095)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_UE_X2AP_ID_Extension_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  12,  12,  0,  4095 }	/* (0..4095,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_UE_X2AP_ID_Extension_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_UE_X2AP_ID_Extension = {
-	"UE-X2AP-ID-Extension",
-	"UE-X2AP-ID-Extension",
-	&asn_OP_NativeInteger,
-	asn_DEF_UE_X2AP_ID_Extension_tags_1,
-	sizeof(asn_DEF_UE_X2AP_ID_Extension_tags_1)
-		/sizeof(asn_DEF_UE_X2AP_ID_Extension_tags_1[0]), /* 1 */
-	asn_DEF_UE_X2AP_ID_Extension_tags_1,	/* Same as above */
-	sizeof(asn_DEF_UE_X2AP_ID_Extension_tags_1)
-		/sizeof(asn_DEF_UE_X2AP_ID_Extension_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_UE_X2AP_ID_Extension_constr_1, UE_X2AP_ID_Extension_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/UE-X2AP-ID-Extension.h b/3rdparty/libe2ap/UE-X2AP-ID-Extension.h
deleted file mode 100644
index 6c4116a..0000000
--- a/3rdparty/libe2ap/UE-X2AP-ID-Extension.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_UE_X2AP_ID_Extension_H_
-#define	_UE_X2AP_ID_Extension_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* UE-X2AP-ID-Extension */
-typedef long	 UE_X2AP_ID_Extension_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_UE_X2AP_ID_Extension;
-asn_struct_free_f UE_X2AP_ID_Extension_free;
-asn_struct_print_f UE_X2AP_ID_Extension_print;
-asn_constr_check_f UE_X2AP_ID_Extension_constraint;
-ber_type_decoder_f UE_X2AP_ID_Extension_decode_ber;
-der_type_encoder_f UE_X2AP_ID_Extension_encode_der;
-xer_type_decoder_f UE_X2AP_ID_Extension_decode_xer;
-xer_type_encoder_f UE_X2AP_ID_Extension_encode_xer;
-per_type_decoder_f UE_X2AP_ID_Extension_decode_uper;
-per_type_encoder_f UE_X2AP_ID_Extension_encode_uper;
-per_type_decoder_f UE_X2AP_ID_Extension_decode_aper;
-per_type_encoder_f UE_X2AP_ID_Extension_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _UE_X2AP_ID_Extension_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/UE-X2AP-ID.c b/3rdparty/libe2ap/UE-X2AP-ID.c
deleted file mode 100644
index 1d025cf..0000000
--- a/3rdparty/libe2ap/UE-X2AP-ID.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "UE-X2AP-ID.h"
-
-int
-UE_X2AP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 4095)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_UE_X2AP_ID_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 12,  12,  0,  4095 }	/* (0..4095) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_UE_X2AP_ID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_UE_X2AP_ID = {
-	"UE-X2AP-ID",
-	"UE-X2AP-ID",
-	&asn_OP_NativeInteger,
-	asn_DEF_UE_X2AP_ID_tags_1,
-	sizeof(asn_DEF_UE_X2AP_ID_tags_1)
-		/sizeof(asn_DEF_UE_X2AP_ID_tags_1[0]), /* 1 */
-	asn_DEF_UE_X2AP_ID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_UE_X2AP_ID_tags_1)
-		/sizeof(asn_DEF_UE_X2AP_ID_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_UE_X2AP_ID_constr_1, UE_X2AP_ID_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/UE-X2AP-ID.h b/3rdparty/libe2ap/UE-X2AP-ID.h
deleted file mode 100644
index 1205c9d..0000000
--- a/3rdparty/libe2ap/UE-X2AP-ID.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_UE_X2AP_ID_H_
-#define	_UE_X2AP_ID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* UE-X2AP-ID */
-typedef long	 UE_X2AP_ID_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_UE_X2AP_ID;
-asn_struct_free_f UE_X2AP_ID_free;
-asn_struct_print_f UE_X2AP_ID_print;
-asn_constr_check_f UE_X2AP_ID_constraint;
-ber_type_decoder_f UE_X2AP_ID_decode_ber;
-der_type_encoder_f UE_X2AP_ID_encode_der;
-xer_type_decoder_f UE_X2AP_ID_decode_xer;
-xer_type_encoder_f UE_X2AP_ID_encode_xer;
-per_type_decoder_f UE_X2AP_ID_decode_uper;
-per_type_encoder_f UE_X2AP_ID_encode_uper;
-per_type_decoder_f UE_X2AP_ID_decode_aper;
-per_type_encoder_f UE_X2AP_ID_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _UE_X2AP_ID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/UEID.c b/3rdparty/libe2ap/UEID.c
deleted file mode 100644
index 5af0727..0000000
--- a/3rdparty/libe2ap/UEID.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "UEID.h"
-
-int
-UEID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 16)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using BIT_STRING,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_UEID_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  16,  16 }	/* (SIZE(16..16)) */,
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_UEID_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_UEID = {
-	"UEID",
-	"UEID",
-	&asn_OP_BIT_STRING,
-	asn_DEF_UEID_tags_1,
-	sizeof(asn_DEF_UEID_tags_1)
-		/sizeof(asn_DEF_UEID_tags_1[0]), /* 1 */
-	asn_DEF_UEID_tags_1,	/* Same as above */
-	sizeof(asn_DEF_UEID_tags_1)
-		/sizeof(asn_DEF_UEID_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_UEID_constr_1, UEID_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_BIT_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/UEID.h b/3rdparty/libe2ap/UEID.h
deleted file mode 100644
index a2dbfe6..0000000
--- a/3rdparty/libe2ap/UEID.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_UEID_H_
-#define	_UEID_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* UEID */
-typedef BIT_STRING_t	 UEID_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_UEID_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_UEID;
-asn_struct_free_f UEID_free;
-asn_struct_print_f UEID_print;
-asn_constr_check_f UEID_constraint;
-ber_type_decoder_f UEID_decode_ber;
-der_type_encoder_f UEID_encode_der;
-xer_type_decoder_f UEID_decode_xer;
-xer_type_encoder_f UEID_encode_xer;
-per_type_decoder_f UEID_decode_uper;
-per_type_encoder_f UEID_encode_uper;
-per_type_decoder_f UEID_decode_aper;
-per_type_encoder_f UEID_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _UEID_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/UL-GBR-PRB-usage.c b/3rdparty/libe2ap/UL-GBR-PRB-usage.c
deleted file mode 100644
index 181ac4c..0000000
--- a/3rdparty/libe2ap/UL-GBR-PRB-usage.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "UL-GBR-PRB-usage.h"
-
-int
-UL_GBR_PRB_usage_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 100)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_UL_GBR_PRB_usage_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 7,  7,  0,  100 }	/* (0..100) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_UL_GBR_PRB_usage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_UL_GBR_PRB_usage = {
-	"UL-GBR-PRB-usage",
-	"UL-GBR-PRB-usage",
-	&asn_OP_NativeInteger,
-	asn_DEF_UL_GBR_PRB_usage_tags_1,
-	sizeof(asn_DEF_UL_GBR_PRB_usage_tags_1)
-		/sizeof(asn_DEF_UL_GBR_PRB_usage_tags_1[0]), /* 1 */
-	asn_DEF_UL_GBR_PRB_usage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_UL_GBR_PRB_usage_tags_1)
-		/sizeof(asn_DEF_UL_GBR_PRB_usage_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_UL_GBR_PRB_usage_constr_1, UL_GBR_PRB_usage_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/UL-GBR-PRB-usage.h b/3rdparty/libe2ap/UL-GBR-PRB-usage.h
deleted file mode 100644
index 318a44e..0000000
--- a/3rdparty/libe2ap/UL-GBR-PRB-usage.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_UL_GBR_PRB_usage_H_
-#define	_UL_GBR_PRB_usage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* UL-GBR-PRB-usage */
-typedef long	 UL_GBR_PRB_usage_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_UL_GBR_PRB_usage_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_UL_GBR_PRB_usage;
-asn_struct_free_f UL_GBR_PRB_usage_free;
-asn_struct_print_f UL_GBR_PRB_usage_print;
-asn_constr_check_f UL_GBR_PRB_usage_constraint;
-ber_type_decoder_f UL_GBR_PRB_usage_decode_ber;
-der_type_encoder_f UL_GBR_PRB_usage_encode_der;
-xer_type_decoder_f UL_GBR_PRB_usage_decode_xer;
-xer_type_encoder_f UL_GBR_PRB_usage_encode_xer;
-per_type_decoder_f UL_GBR_PRB_usage_decode_uper;
-per_type_encoder_f UL_GBR_PRB_usage_encode_uper;
-per_type_decoder_f UL_GBR_PRB_usage_decode_aper;
-per_type_encoder_f UL_GBR_PRB_usage_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _UL_GBR_PRB_usage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/UL-HighInterferenceIndication.c b/3rdparty/libe2ap/UL-HighInterferenceIndication.c
deleted file mode 100644
index 620f811..0000000
--- a/3rdparty/libe2ap/UL-HighInterferenceIndication.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "UL-HighInterferenceIndication.h"
-
-int
-UL_HighInterferenceIndication_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size >= 1 && size <= 110)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using BIT_STRING,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_UL_HighInterferenceIndication_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  7,  7,  1,  110 }	/* (SIZE(1..110,...)) */,
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_UL_HighInterferenceIndication_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_UL_HighInterferenceIndication = {
-	"UL-HighInterferenceIndication",
-	"UL-HighInterferenceIndication",
-	&asn_OP_BIT_STRING,
-	asn_DEF_UL_HighInterferenceIndication_tags_1,
-	sizeof(asn_DEF_UL_HighInterferenceIndication_tags_1)
-		/sizeof(asn_DEF_UL_HighInterferenceIndication_tags_1[0]), /* 1 */
-	asn_DEF_UL_HighInterferenceIndication_tags_1,	/* Same as above */
-	sizeof(asn_DEF_UL_HighInterferenceIndication_tags_1)
-		/sizeof(asn_DEF_UL_HighInterferenceIndication_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_UL_HighInterferenceIndication_constr_1, UL_HighInterferenceIndication_constraint },
-	0, 0,	/* No members */
-	&asn_SPC_BIT_STRING_specs	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/UL-HighInterferenceIndication.h b/3rdparty/libe2ap/UL-HighInterferenceIndication.h
deleted file mode 100644
index 8595758..0000000
--- a/3rdparty/libe2ap/UL-HighInterferenceIndication.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_UL_HighInterferenceIndication_H_
-#define	_UL_HighInterferenceIndication_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* UL-HighInterferenceIndication */
-typedef BIT_STRING_t	 UL_HighInterferenceIndication_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_UL_HighInterferenceIndication_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_UL_HighInterferenceIndication;
-asn_struct_free_f UL_HighInterferenceIndication_free;
-asn_struct_print_f UL_HighInterferenceIndication_print;
-asn_constr_check_f UL_HighInterferenceIndication_constraint;
-ber_type_decoder_f UL_HighInterferenceIndication_decode_ber;
-der_type_encoder_f UL_HighInterferenceIndication_encode_der;
-xer_type_decoder_f UL_HighInterferenceIndication_decode_xer;
-xer_type_encoder_f UL_HighInterferenceIndication_encode_xer;
-per_type_decoder_f UL_HighInterferenceIndication_decode_uper;
-per_type_encoder_f UL_HighInterferenceIndication_encode_uper;
-per_type_decoder_f UL_HighInterferenceIndication_decode_aper;
-per_type_encoder_f UL_HighInterferenceIndication_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _UL_HighInterferenceIndication_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/UL-HighInterferenceIndicationInfo-Item.c b/3rdparty/libe2ap/UL-HighInterferenceIndicationInfo-Item.c
deleted file mode 100644
index 5491844..0000000
--- a/3rdparty/libe2ap/UL-HighInterferenceIndicationInfo-Item.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "UL-HighInterferenceIndicationInfo-Item.h"
-
-#include "ProtocolExtensionContainer.h"
-asn_TYPE_member_t asn_MBR_UL_HighInterferenceIndicationInfo_Item_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct UL_HighInterferenceIndicationInfo_Item, target_Cell_ID),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ECGI,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"target-Cell-ID"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct UL_HighInterferenceIndicationInfo_Item, ul_interferenceindication),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_UL_HighInterferenceIndication,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"ul-interferenceindication"
-		},
-	{ ATF_POINTER, 1, offsetof(struct UL_HighInterferenceIndicationInfo_Item, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P72,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_UL_HighInterferenceIndicationInfo_Item_oms_1[] = { 2 };
-static const ber_tlv_tag_t asn_DEF_UL_HighInterferenceIndicationInfo_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_UL_HighInterferenceIndicationInfo_Item_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* target-Cell-ID */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ul-interferenceindication */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_UL_HighInterferenceIndicationInfo_Item_specs_1 = {
-	sizeof(struct UL_HighInterferenceIndicationInfo_Item),
-	offsetof(struct UL_HighInterferenceIndicationInfo_Item, _asn_ctx),
-	asn_MAP_UL_HighInterferenceIndicationInfo_Item_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_UL_HighInterferenceIndicationInfo_Item_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_UL_HighInterferenceIndicationInfo_Item = {
-	"UL-HighInterferenceIndicationInfo-Item",
-	"UL-HighInterferenceIndicationInfo-Item",
-	&asn_OP_SEQUENCE,
-	asn_DEF_UL_HighInterferenceIndicationInfo_Item_tags_1,
-	sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_Item_tags_1)
-		/sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_Item_tags_1[0]), /* 1 */
-	asn_DEF_UL_HighInterferenceIndicationInfo_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_Item_tags_1)
-		/sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_Item_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_UL_HighInterferenceIndicationInfo_Item_1,
-	3,	/* Elements count */
-	&asn_SPC_UL_HighInterferenceIndicationInfo_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/UL-HighInterferenceIndicationInfo-Item.h b/3rdparty/libe2ap/UL-HighInterferenceIndicationInfo-Item.h
deleted file mode 100644
index c4b3fa9..0000000
--- a/3rdparty/libe2ap/UL-HighInterferenceIndicationInfo-Item.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_UL_HighInterferenceIndicationInfo_Item_H_
-#define	_UL_HighInterferenceIndicationInfo_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ECGI.h"
-#include "UL-HighInterferenceIndication.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* UL-HighInterferenceIndicationInfo-Item */
-typedef struct UL_HighInterferenceIndicationInfo_Item {
-	ECGI_t	 target_Cell_ID;
-	UL_HighInterferenceIndication_t	 ul_interferenceindication;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} UL_HighInterferenceIndicationInfo_Item_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_UL_HighInterferenceIndicationInfo_Item;
-extern asn_SEQUENCE_specifics_t asn_SPC_UL_HighInterferenceIndicationInfo_Item_specs_1;
-extern asn_TYPE_member_t asn_MBR_UL_HighInterferenceIndicationInfo_Item_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _UL_HighInterferenceIndicationInfo_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/UL-HighInterferenceIndicationInfo.c b/3rdparty/libe2ap/UL-HighInterferenceIndicationInfo.c
deleted file mode 100644
index 0e95e92..0000000
--- a/3rdparty/libe2ap/UL-HighInterferenceIndicationInfo.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "UL-HighInterferenceIndicationInfo.h"
-
-#include "UL-HighInterferenceIndicationInfo-Item.h"
-asn_per_constraints_t asn_PER_type_UL_HighInterferenceIndicationInfo_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_UL_HighInterferenceIndicationInfo_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
-		0,
-		&asn_DEF_UL_HighInterferenceIndicationInfo_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_UL_HighInterferenceIndicationInfo_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_UL_HighInterferenceIndicationInfo_specs_1 = {
-	sizeof(struct UL_HighInterferenceIndicationInfo),
-	offsetof(struct UL_HighInterferenceIndicationInfo, _asn_ctx),
-	0,	/* XER encoding is XMLDelimitedItemList */
-};
-asn_TYPE_descriptor_t asn_DEF_UL_HighInterferenceIndicationInfo = {
-	"UL-HighInterferenceIndicationInfo",
-	"UL-HighInterferenceIndicationInfo",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_UL_HighInterferenceIndicationInfo_tags_1,
-	sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_tags_1)
-		/sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_tags_1[0]), /* 1 */
-	asn_DEF_UL_HighInterferenceIndicationInfo_tags_1,	/* Same as above */
-	sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_tags_1)
-		/sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_UL_HighInterferenceIndicationInfo_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_UL_HighInterferenceIndicationInfo_1,
-	1,	/* Single element */
-	&asn_SPC_UL_HighInterferenceIndicationInfo_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/UL-HighInterferenceIndicationInfo.h b/3rdparty/libe2ap/UL-HighInterferenceIndicationInfo.h
deleted file mode 100644
index a107c6c..0000000
--- a/3rdparty/libe2ap/UL-HighInterferenceIndicationInfo.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_UL_HighInterferenceIndicationInfo_H_
-#define	_UL_HighInterferenceIndicationInfo_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct UL_HighInterferenceIndicationInfo_Item;
-
-/* UL-HighInterferenceIndicationInfo */
-typedef struct UL_HighInterferenceIndicationInfo {
-	A_SEQUENCE_OF(struct UL_HighInterferenceIndicationInfo_Item) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} UL_HighInterferenceIndicationInfo_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_UL_HighInterferenceIndicationInfo;
-extern asn_SET_OF_specifics_t asn_SPC_UL_HighInterferenceIndicationInfo_specs_1;
-extern asn_TYPE_member_t asn_MBR_UL_HighInterferenceIndicationInfo_1[1];
-extern asn_per_constraints_t asn_PER_type_UL_HighInterferenceIndicationInfo_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _UL_HighInterferenceIndicationInfo_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/UL-InterferenceOverloadIndication-Item.c b/3rdparty/libe2ap/UL-InterferenceOverloadIndication-Item.c
deleted file mode 100644
index 2fa8d52..0000000
--- a/3rdparty/libe2ap/UL-InterferenceOverloadIndication-Item.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "UL-InterferenceOverloadIndication-Item.h"
-
-/*
- * This type is implemented using NativeEnumerated,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_UL_InterferenceOverloadIndication_Item_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0,  2 }	/* (0..2,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const asn_INTEGER_enum_map_t asn_MAP_UL_InterferenceOverloadIndication_Item_value2enum_1[] = {
-	{ 0,	17,	"high-interference" },
-	{ 1,	19,	"medium-interference" },
-	{ 2,	16,	"low-interference" }
-	/* This list is extensible */
-};
-static const unsigned int asn_MAP_UL_InterferenceOverloadIndication_Item_enum2value_1[] = {
-	0,	/* high-interference(0) */
-	2,	/* low-interference(2) */
-	1	/* medium-interference(1) */
-	/* This list is extensible */
-};
-const asn_INTEGER_specifics_t asn_SPC_UL_InterferenceOverloadIndication_Item_specs_1 = {
-	asn_MAP_UL_InterferenceOverloadIndication_Item_value2enum_1,	/* "tag" => N; sorted by tag */
-	asn_MAP_UL_InterferenceOverloadIndication_Item_enum2value_1,	/* N => "tag"; sorted by N */
-	3,	/* Number of elements in the maps */
-	4,	/* Extensions before this member */
-	1,	/* Strict enumeration */
-	0,	/* Native long size */
-	0
-};
-static const ber_tlv_tag_t asn_DEF_UL_InterferenceOverloadIndication_Item_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_UL_InterferenceOverloadIndication_Item = {
-	"UL-InterferenceOverloadIndication-Item",
-	"UL-InterferenceOverloadIndication-Item",
-	&asn_OP_NativeEnumerated,
-	asn_DEF_UL_InterferenceOverloadIndication_Item_tags_1,
-	sizeof(asn_DEF_UL_InterferenceOverloadIndication_Item_tags_1)
-		/sizeof(asn_DEF_UL_InterferenceOverloadIndication_Item_tags_1[0]), /* 1 */
-	asn_DEF_UL_InterferenceOverloadIndication_Item_tags_1,	/* Same as above */
-	sizeof(asn_DEF_UL_InterferenceOverloadIndication_Item_tags_1)
-		/sizeof(asn_DEF_UL_InterferenceOverloadIndication_Item_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_UL_InterferenceOverloadIndication_Item_constr_1, NativeEnumerated_constraint },
-	0, 0,	/* Defined elsewhere */
-	&asn_SPC_UL_InterferenceOverloadIndication_Item_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/UL-InterferenceOverloadIndication-Item.h b/3rdparty/libe2ap/UL-InterferenceOverloadIndication-Item.h
deleted file mode 100644
index 92c444b..0000000
--- a/3rdparty/libe2ap/UL-InterferenceOverloadIndication-Item.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_UL_InterferenceOverloadIndication_Item_H_
-#define	_UL_InterferenceOverloadIndication_Item_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeEnumerated.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum UL_InterferenceOverloadIndication_Item {
-	UL_InterferenceOverloadIndication_Item_high_interference	= 0,
-	UL_InterferenceOverloadIndication_Item_medium_interference	= 1,
-	UL_InterferenceOverloadIndication_Item_low_interference	= 2
-	/*
-	 * Enumeration is extensible
-	 */
-} e_UL_InterferenceOverloadIndication_Item;
-
-/* UL-InterferenceOverloadIndication-Item */
-typedef long	 UL_InterferenceOverloadIndication_Item_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_UL_InterferenceOverloadIndication_Item_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_UL_InterferenceOverloadIndication_Item;
-extern const asn_INTEGER_specifics_t asn_SPC_UL_InterferenceOverloadIndication_Item_specs_1;
-asn_struct_free_f UL_InterferenceOverloadIndication_Item_free;
-asn_struct_print_f UL_InterferenceOverloadIndication_Item_print;
-asn_constr_check_f UL_InterferenceOverloadIndication_Item_constraint;
-ber_type_decoder_f UL_InterferenceOverloadIndication_Item_decode_ber;
-der_type_encoder_f UL_InterferenceOverloadIndication_Item_encode_der;
-xer_type_decoder_f UL_InterferenceOverloadIndication_Item_decode_xer;
-xer_type_encoder_f UL_InterferenceOverloadIndication_Item_encode_xer;
-per_type_decoder_f UL_InterferenceOverloadIndication_Item_decode_uper;
-per_type_encoder_f UL_InterferenceOverloadIndication_Item_encode_uper;
-per_type_decoder_f UL_InterferenceOverloadIndication_Item_decode_aper;
-per_type_encoder_f UL_InterferenceOverloadIndication_Item_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _UL_InterferenceOverloadIndication_Item_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/UL-InterferenceOverloadIndication.c b/3rdparty/libe2ap/UL-InterferenceOverloadIndication.c
deleted file mode 100644
index e2ca97b..0000000
--- a/3rdparty/libe2ap/UL-InterferenceOverloadIndication.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "UL-InterferenceOverloadIndication.h"
-
-asn_per_constraints_t asn_PER_type_UL_InterferenceOverloadIndication_constr_1 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 7,  7,  1,  110 }	/* (SIZE(1..110)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_UL_InterferenceOverloadIndication_1[] = {
-	{ ATF_POINTER, 0, 0,
-		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
-		0,
-		&asn_DEF_UL_InterferenceOverloadIndication_Item,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		""
-		},
-};
-static const ber_tlv_tag_t asn_DEF_UL_InterferenceOverloadIndication_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-asn_SET_OF_specifics_t asn_SPC_UL_InterferenceOverloadIndication_specs_1 = {
-	sizeof(struct UL_InterferenceOverloadIndication),
-	offsetof(struct UL_InterferenceOverloadIndication, _asn_ctx),
-	1,	/* XER encoding is XMLValueList */
-};
-asn_TYPE_descriptor_t asn_DEF_UL_InterferenceOverloadIndication = {
-	"UL-InterferenceOverloadIndication",
-	"UL-InterferenceOverloadIndication",
-	&asn_OP_SEQUENCE_OF,
-	asn_DEF_UL_InterferenceOverloadIndication_tags_1,
-	sizeof(asn_DEF_UL_InterferenceOverloadIndication_tags_1)
-		/sizeof(asn_DEF_UL_InterferenceOverloadIndication_tags_1[0]), /* 1 */
-	asn_DEF_UL_InterferenceOverloadIndication_tags_1,	/* Same as above */
-	sizeof(asn_DEF_UL_InterferenceOverloadIndication_tags_1)
-		/sizeof(asn_DEF_UL_InterferenceOverloadIndication_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_UL_InterferenceOverloadIndication_constr_1, SEQUENCE_OF_constraint },
-	asn_MBR_UL_InterferenceOverloadIndication_1,
-	1,	/* Single element */
-	&asn_SPC_UL_InterferenceOverloadIndication_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/UL-InterferenceOverloadIndication.h b/3rdparty/libe2ap/UL-InterferenceOverloadIndication.h
deleted file mode 100644
index f5fe89d..0000000
--- a/3rdparty/libe2ap/UL-InterferenceOverloadIndication.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_UL_InterferenceOverloadIndication_H_
-#define	_UL_InterferenceOverloadIndication_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "UL-InterferenceOverloadIndication-Item.h"
-#include "asn_SEQUENCE_OF.h"
-#include "constr_SEQUENCE_OF.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* UL-InterferenceOverloadIndication */
-typedef struct UL_InterferenceOverloadIndication {
-	A_SEQUENCE_OF(UL_InterferenceOverloadIndication_Item_t) list;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} UL_InterferenceOverloadIndication_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_UL_InterferenceOverloadIndication;
-extern asn_SET_OF_specifics_t asn_SPC_UL_InterferenceOverloadIndication_specs_1;
-extern asn_TYPE_member_t asn_MBR_UL_InterferenceOverloadIndication_1[1];
-extern asn_per_constraints_t asn_PER_type_UL_InterferenceOverloadIndication_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _UL_InterferenceOverloadIndication_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/UL-Total-PRB-usage.c b/3rdparty/libe2ap/UL-Total-PRB-usage.c
deleted file mode 100644
index ba9c6d7..0000000
--- a/3rdparty/libe2ap/UL-Total-PRB-usage.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "UL-Total-PRB-usage.h"
-
-int
-UL_Total_PRB_usage_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 100)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_UL_Total_PRB_usage_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 7,  7,  0,  100 }	/* (0..100) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_UL_Total_PRB_usage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_UL_Total_PRB_usage = {
-	"UL-Total-PRB-usage",
-	"UL-Total-PRB-usage",
-	&asn_OP_NativeInteger,
-	asn_DEF_UL_Total_PRB_usage_tags_1,
-	sizeof(asn_DEF_UL_Total_PRB_usage_tags_1)
-		/sizeof(asn_DEF_UL_Total_PRB_usage_tags_1[0]), /* 1 */
-	asn_DEF_UL_Total_PRB_usage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_UL_Total_PRB_usage_tags_1)
-		/sizeof(asn_DEF_UL_Total_PRB_usage_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_UL_Total_PRB_usage_constr_1, UL_Total_PRB_usage_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/UL-Total-PRB-usage.h b/3rdparty/libe2ap/UL-Total-PRB-usage.h
deleted file mode 100644
index 6c49edf..0000000
--- a/3rdparty/libe2ap/UL-Total-PRB-usage.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_UL_Total_PRB_usage_H_
-#define	_UL_Total_PRB_usage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* UL-Total-PRB-usage */
-typedef long	 UL_Total_PRB_usage_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_UL_Total_PRB_usage_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_UL_Total_PRB_usage;
-asn_struct_free_f UL_Total_PRB_usage_free;
-asn_struct_print_f UL_Total_PRB_usage_print;
-asn_constr_check_f UL_Total_PRB_usage_constraint;
-ber_type_decoder_f UL_Total_PRB_usage_decode_ber;
-der_type_encoder_f UL_Total_PRB_usage_encode_der;
-xer_type_decoder_f UL_Total_PRB_usage_decode_xer;
-xer_type_encoder_f UL_Total_PRB_usage_encode_xer;
-per_type_decoder_f UL_Total_PRB_usage_decode_uper;
-per_type_encoder_f UL_Total_PRB_usage_encode_uper;
-per_type_decoder_f UL_Total_PRB_usage_decode_aper;
-per_type_encoder_f UL_Total_PRB_usage_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _UL_Total_PRB_usage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/UL-non-GBR-PRB-usage.c b/3rdparty/libe2ap/UL-non-GBR-PRB-usage.c
deleted file mode 100644
index 3653c00..0000000
--- a/3rdparty/libe2ap/UL-non-GBR-PRB-usage.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "UL-non-GBR-PRB-usage.h"
-
-int
-UL_non_GBR_PRB_usage_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 100)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-asn_per_constraints_t asn_PER_type_UL_non_GBR_PRB_usage_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 7,  7,  0,  100 }	/* (0..100) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_UL_non_GBR_PRB_usage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_UL_non_GBR_PRB_usage = {
-	"UL-non-GBR-PRB-usage",
-	"UL-non-GBR-PRB-usage",
-	&asn_OP_NativeInteger,
-	asn_DEF_UL_non_GBR_PRB_usage_tags_1,
-	sizeof(asn_DEF_UL_non_GBR_PRB_usage_tags_1)
-		/sizeof(asn_DEF_UL_non_GBR_PRB_usage_tags_1[0]), /* 1 */
-	asn_DEF_UL_non_GBR_PRB_usage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_UL_non_GBR_PRB_usage_tags_1)
-		/sizeof(asn_DEF_UL_non_GBR_PRB_usage_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_UL_non_GBR_PRB_usage_constr_1, UL_non_GBR_PRB_usage_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/UL-non-GBR-PRB-usage.h b/3rdparty/libe2ap/UL-non-GBR-PRB-usage.h
deleted file mode 100644
index 29d67ed..0000000
--- a/3rdparty/libe2ap/UL-non-GBR-PRB-usage.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_UL_non_GBR_PRB_usage_H_
-#define	_UL_non_GBR_PRB_usage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* UL-non-GBR-PRB-usage */
-typedef long	 UL_non_GBR_PRB_usage_t;
-
-/* Implementation */
-extern asn_per_constraints_t asn_PER_type_UL_non_GBR_PRB_usage_constr_1;
-extern asn_TYPE_descriptor_t asn_DEF_UL_non_GBR_PRB_usage;
-asn_struct_free_f UL_non_GBR_PRB_usage_free;
-asn_struct_print_f UL_non_GBR_PRB_usage_print;
-asn_constr_check_f UL_non_GBR_PRB_usage_constraint;
-ber_type_decoder_f UL_non_GBR_PRB_usage_decode_ber;
-der_type_encoder_f UL_non_GBR_PRB_usage_encode_der;
-xer_type_decoder_f UL_non_GBR_PRB_usage_decode_xer;
-xer_type_encoder_f UL_non_GBR_PRB_usage_encode_xer;
-per_type_decoder_f UL_non_GBR_PRB_usage_decode_uper;
-per_type_encoder_f UL_non_GBR_PRB_usage_encode_uper;
-per_type_decoder_f UL_non_GBR_PRB_usage_decode_aper;
-per_type_encoder_f UL_non_GBR_PRB_usage_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _UL_non_GBR_PRB_usage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/UL-scheduling-PDCCH-CCE-usage.c b/3rdparty/libe2ap/UL-scheduling-PDCCH-CCE-usage.c
deleted file mode 100644
index 090e255..0000000
--- a/3rdparty/libe2ap/UL-scheduling-PDCCH-CCE-usage.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "UL-scheduling-PDCCH-CCE-usage.h"
-
-int
-UL_scheduling_PDCCH_CCE_usage_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 100)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-/*
- * This type is implemented using NativeInteger,
- * so here we adjust the DEF accordingly.
- */
-static asn_per_constraints_t asn_PER_type_UL_scheduling_PDCCH_CCE_usage_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED,	 7,  7,  0,  100 }	/* (0..100) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static const ber_tlv_tag_t asn_DEF_UL_scheduling_PDCCH_CCE_usage_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
-};
-asn_TYPE_descriptor_t asn_DEF_UL_scheduling_PDCCH_CCE_usage = {
-	"UL-scheduling-PDCCH-CCE-usage",
-	"UL-scheduling-PDCCH-CCE-usage",
-	&asn_OP_NativeInteger,
-	asn_DEF_UL_scheduling_PDCCH_CCE_usage_tags_1,
-	sizeof(asn_DEF_UL_scheduling_PDCCH_CCE_usage_tags_1)
-		/sizeof(asn_DEF_UL_scheduling_PDCCH_CCE_usage_tags_1[0]), /* 1 */
-	asn_DEF_UL_scheduling_PDCCH_CCE_usage_tags_1,	/* Same as above */
-	sizeof(asn_DEF_UL_scheduling_PDCCH_CCE_usage_tags_1)
-		/sizeof(asn_DEF_UL_scheduling_PDCCH_CCE_usage_tags_1[0]), /* 1 */
-	{ 0, &asn_PER_type_UL_scheduling_PDCCH_CCE_usage_constr_1, UL_scheduling_PDCCH_CCE_usage_constraint },
-	0, 0,	/* No members */
-	0	/* No specifics */
-};
-
diff --git a/3rdparty/libe2ap/UL-scheduling-PDCCH-CCE-usage.h b/3rdparty/libe2ap/UL-scheduling-PDCCH-CCE-usage.h
deleted file mode 100644
index 4fb8631..0000000
--- a/3rdparty/libe2ap/UL-scheduling-PDCCH-CCE-usage.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_UL_scheduling_PDCCH_CCE_usage_H_
-#define	_UL_scheduling_PDCCH_CCE_usage_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* UL-scheduling-PDCCH-CCE-usage */
-typedef long	 UL_scheduling_PDCCH_CCE_usage_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_UL_scheduling_PDCCH_CCE_usage;
-asn_struct_free_f UL_scheduling_PDCCH_CCE_usage_free;
-asn_struct_print_f UL_scheduling_PDCCH_CCE_usage_print;
-asn_constr_check_f UL_scheduling_PDCCH_CCE_usage_constraint;
-ber_type_decoder_f UL_scheduling_PDCCH_CCE_usage_decode_ber;
-der_type_encoder_f UL_scheduling_PDCCH_CCE_usage_encode_der;
-xer_type_decoder_f UL_scheduling_PDCCH_CCE_usage_decode_xer;
-xer_type_encoder_f UL_scheduling_PDCCH_CCE_usage_encode_xer;
-per_type_decoder_f UL_scheduling_PDCCH_CCE_usage_decode_uper;
-per_type_encoder_f UL_scheduling_PDCCH_CCE_usage_encode_uper;
-per_type_decoder_f UL_scheduling_PDCCH_CCE_usage_decode_aper;
-per_type_encoder_f UL_scheduling_PDCCH_CCE_usage_encode_aper;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _UL_scheduling_PDCCH_CCE_usage_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/UsableABSInformation.c b/3rdparty/libe2ap/UsableABSInformation.c
deleted file mode 100644
index 044066a..0000000
--- a/3rdparty/libe2ap/UsableABSInformation.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "UsableABSInformation.h"
-
-asn_per_constraints_t asn_PER_type_UsableABSInformation_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_UsableABSInformation_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct UsableABSInformation, choice.fdd),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_UsableABSInformationFDD,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"fdd"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct UsableABSInformation, choice.tdd),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_UsableABSInformationTDD,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"tdd"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_UsableABSInformation_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* fdd */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* tdd */
-};
-asn_CHOICE_specifics_t asn_SPC_UsableABSInformation_specs_1 = {
-	sizeof(struct UsableABSInformation),
-	offsetof(struct UsableABSInformation, _asn_ctx),
-	offsetof(struct UsableABSInformation, present),
-	sizeof(((struct UsableABSInformation *)0)->present),
-	asn_MAP_UsableABSInformation_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0,
-	2	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_UsableABSInformation = {
-	"UsableABSInformation",
-	"UsableABSInformation",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_UsableABSInformation_constr_1, CHOICE_constraint },
-	asn_MBR_UsableABSInformation_1,
-	2,	/* Elements count */
-	&asn_SPC_UsableABSInformation_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/UsableABSInformation.h b/3rdparty/libe2ap/UsableABSInformation.h
deleted file mode 100644
index 1e42589..0000000
--- a/3rdparty/libe2ap/UsableABSInformation.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_UsableABSInformation_H_
-#define	_UsableABSInformation_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "UsableABSInformationFDD.h"
-#include "UsableABSInformationTDD.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum UsableABSInformation_PR {
-	UsableABSInformation_PR_NOTHING,	/* No components present */
-	UsableABSInformation_PR_fdd,
-	UsableABSInformation_PR_tdd
-	/* Extensions may appear below */
-	
-} UsableABSInformation_PR;
-
-/* UsableABSInformation */
-typedef struct UsableABSInformation {
-	UsableABSInformation_PR present;
-	union UsableABSInformation_u {
-		UsableABSInformationFDD_t	 fdd;
-		UsableABSInformationTDD_t	 tdd;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} UsableABSInformation_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_UsableABSInformation;
-extern asn_CHOICE_specifics_t asn_SPC_UsableABSInformation_specs_1;
-extern asn_TYPE_member_t asn_MBR_UsableABSInformation_1[2];
-extern asn_per_constraints_t asn_PER_type_UsableABSInformation_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _UsableABSInformation_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/UsableABSInformationFDD.c b/3rdparty/libe2ap/UsableABSInformationFDD.c
deleted file mode 100644
index b190565..0000000
--- a/3rdparty/libe2ap/UsableABSInformationFDD.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "UsableABSInformationFDD.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_usable_abs_pattern_info_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size == 40)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_usable_abs_pattern_info_constr_2 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED,	 0,  0,  40,  40 }	/* (SIZE(40..40)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_UsableABSInformationFDD_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct UsableABSInformationFDD, usable_abs_pattern_info),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_usable_abs_pattern_info_constr_2,  memb_usable_abs_pattern_info_constraint_1 },
-		0, 0, /* No default value */
-		"usable-abs-pattern-info"
-		},
-	{ ATF_POINTER, 1, offsetof(struct UsableABSInformationFDD, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P73,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_UsableABSInformationFDD_oms_1[] = { 1 };
-static const ber_tlv_tag_t asn_DEF_UsableABSInformationFDD_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_UsableABSInformationFDD_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* usable-abs-pattern-info */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_UsableABSInformationFDD_specs_1 = {
-	sizeof(struct UsableABSInformationFDD),
-	offsetof(struct UsableABSInformationFDD, _asn_ctx),
-	asn_MAP_UsableABSInformationFDD_tag2el_1,
-	2,	/* Count of tags in the map */
-	asn_MAP_UsableABSInformationFDD_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_UsableABSInformationFDD = {
-	"UsableABSInformationFDD",
-	"UsableABSInformationFDD",
-	&asn_OP_SEQUENCE,
-	asn_DEF_UsableABSInformationFDD_tags_1,
-	sizeof(asn_DEF_UsableABSInformationFDD_tags_1)
-		/sizeof(asn_DEF_UsableABSInformationFDD_tags_1[0]), /* 1 */
-	asn_DEF_UsableABSInformationFDD_tags_1,	/* Same as above */
-	sizeof(asn_DEF_UsableABSInformationFDD_tags_1)
-		/sizeof(asn_DEF_UsableABSInformationFDD_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_UsableABSInformationFDD_1,
-	2,	/* Elements count */
-	&asn_SPC_UsableABSInformationFDD_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/UsableABSInformationFDD.h b/3rdparty/libe2ap/UsableABSInformationFDD.h
deleted file mode 100644
index 04ec91c..0000000
--- a/3rdparty/libe2ap/UsableABSInformationFDD.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_UsableABSInformationFDD_H_
-#define	_UsableABSInformationFDD_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* UsableABSInformationFDD */
-typedef struct UsableABSInformationFDD {
-	BIT_STRING_t	 usable_abs_pattern_info;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} UsableABSInformationFDD_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_UsableABSInformationFDD;
-extern asn_SEQUENCE_specifics_t asn_SPC_UsableABSInformationFDD_specs_1;
-extern asn_TYPE_member_t asn_MBR_UsableABSInformationFDD_1[2];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _UsableABSInformationFDD_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/UsableABSInformationTDD.c b/3rdparty/libe2ap/UsableABSInformationTDD.c
deleted file mode 100644
index e7410c5..0000000
--- a/3rdparty/libe2ap/UsableABSInformationTDD.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "UsableABSInformationTDD.h"
-
-#include "ProtocolExtensionContainer.h"
-static int
-memb_usaable_abs_pattern_info_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
-	size_t size;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	if(st->size > 0) {
-		/* Size in bits */
-		size = 8 * st->size - (st->bits_unused & 0x07);
-	} else {
-		size = 0;
-	}
-	
-	if((size >= 1 && size <= 70)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_usaable_abs_pattern_info_constr_2 CC_NOTUSED = {
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  7,  7,  1,  70 }	/* (SIZE(1..70,...)) */,
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_UsableABSInformationTDD_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct UsableABSInformationTDD, usaable_abs_pattern_info),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_BIT_STRING,
-		0,
-		{ 0, &asn_PER_memb_usaable_abs_pattern_info_constr_2,  memb_usaable_abs_pattern_info_constraint_1 },
-		0, 0, /* No default value */
-		"usaable-abs-pattern-info"
-		},
-	{ ATF_POINTER, 1, offsetof(struct UsableABSInformationTDD, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P74,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_UsableABSInformationTDD_oms_1[] = { 1 };
-static const ber_tlv_tag_t asn_DEF_UsableABSInformationTDD_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_UsableABSInformationTDD_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* usaable-abs-pattern-info */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_UsableABSInformationTDD_specs_1 = {
-	sizeof(struct UsableABSInformationTDD),
-	offsetof(struct UsableABSInformationTDD, _asn_ctx),
-	asn_MAP_UsableABSInformationTDD_tag2el_1,
-	2,	/* Count of tags in the map */
-	asn_MAP_UsableABSInformationTDD_oms_1,	/* Optional members */
-	1, 0,	/* Root/Additions */
-	2,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_UsableABSInformationTDD = {
-	"UsableABSInformationTDD",
-	"UsableABSInformationTDD",
-	&asn_OP_SEQUENCE,
-	asn_DEF_UsableABSInformationTDD_tags_1,
-	sizeof(asn_DEF_UsableABSInformationTDD_tags_1)
-		/sizeof(asn_DEF_UsableABSInformationTDD_tags_1[0]), /* 1 */
-	asn_DEF_UsableABSInformationTDD_tags_1,	/* Same as above */
-	sizeof(asn_DEF_UsableABSInformationTDD_tags_1)
-		/sizeof(asn_DEF_UsableABSInformationTDD_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_UsableABSInformationTDD_1,
-	2,	/* Elements count */
-	&asn_SPC_UsableABSInformationTDD_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/UsableABSInformationTDD.h b/3rdparty/libe2ap/UsableABSInformationTDD.h
deleted file mode 100644
index fb53107..0000000
--- a/3rdparty/libe2ap/UsableABSInformationTDD.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_UsableABSInformationTDD_H_
-#define	_UsableABSInformationTDD_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "BIT_STRING.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct ProtocolExtensionContainer;
-
-/* UsableABSInformationTDD */
-typedef struct UsableABSInformationTDD {
-	BIT_STRING_t	 usaable_abs_pattern_info;
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} UsableABSInformationTDD_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_UsableABSInformationTDD;
-extern asn_SEQUENCE_specifics_t asn_SPC_UsableABSInformationTDD_specs_1;
-extern asn_TYPE_member_t asn_MBR_UsableABSInformationTDD_1[2];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _UsableABSInformationTDD_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/WidebandCQI.c b/3rdparty/libe2ap/WidebandCQI.c
deleted file mode 100644
index dbfcf18..0000000
--- a/3rdparty/libe2ap/WidebandCQI.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "WidebandCQI.h"
-
-#include "WidebandCQICodeword1.h"
-#include "ProtocolExtensionContainer.h"
-static int
-memb_widebandCQICodeword0_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 15)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_widebandCQICodeword0_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  4,  4,  0,  15 }	/* (0..15,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_WidebandCQI_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct WidebandCQI, widebandCQICodeword0),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_widebandCQICodeword0_constr_2,  memb_widebandCQICodeword0_constraint_1 },
-		0, 0, /* No default value */
-		"widebandCQICodeword0"
-		},
-	{ ATF_POINTER, 2, offsetof(struct WidebandCQI, widebandCQICodeword1),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		+1,	/* EXPLICIT tag at current level */
-		&asn_DEF_WidebandCQICodeword1,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"widebandCQICodeword1"
-		},
-	{ ATF_POINTER, 1, offsetof(struct WidebandCQI, iE_Extensions),
-		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolExtensionContainer_8858P75,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"iE-Extensions"
-		},
-};
-static const int asn_MAP_WidebandCQI_oms_1[] = { 1, 2 };
-static const ber_tlv_tag_t asn_DEF_WidebandCQI_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_WidebandCQI_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* widebandCQICodeword0 */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* widebandCQICodeword1 */
-    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
-};
-asn_SEQUENCE_specifics_t asn_SPC_WidebandCQI_specs_1 = {
-	sizeof(struct WidebandCQI),
-	offsetof(struct WidebandCQI, _asn_ctx),
-	asn_MAP_WidebandCQI_tag2el_1,
-	3,	/* Count of tags in the map */
-	asn_MAP_WidebandCQI_oms_1,	/* Optional members */
-	2, 0,	/* Root/Additions */
-	3,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_WidebandCQI = {
-	"WidebandCQI",
-	"WidebandCQI",
-	&asn_OP_SEQUENCE,
-	asn_DEF_WidebandCQI_tags_1,
-	sizeof(asn_DEF_WidebandCQI_tags_1)
-		/sizeof(asn_DEF_WidebandCQI_tags_1[0]), /* 1 */
-	asn_DEF_WidebandCQI_tags_1,	/* Same as above */
-	sizeof(asn_DEF_WidebandCQI_tags_1)
-		/sizeof(asn_DEF_WidebandCQI_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_WidebandCQI_1,
-	3,	/* Elements count */
-	&asn_SPC_WidebandCQI_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/WidebandCQI.h b/3rdparty/libe2ap/WidebandCQI.h
deleted file mode 100644
index 495029c..0000000
--- a/3rdparty/libe2ap/WidebandCQI.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_WidebandCQI_H_
-#define	_WidebandCQI_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Forward declarations */
-struct WidebandCQICodeword1;
-struct ProtocolExtensionContainer;
-
-/* WidebandCQI */
-typedef struct WidebandCQI {
-	long	 widebandCQICodeword0;
-	struct WidebandCQICodeword1	*widebandCQICodeword1;	/* OPTIONAL */
-	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} WidebandCQI_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_WidebandCQI;
-extern asn_SEQUENCE_specifics_t asn_SPC_WidebandCQI_specs_1;
-extern asn_TYPE_member_t asn_MBR_WidebandCQI_1[3];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _WidebandCQI_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/WidebandCQICodeword1.c b/3rdparty/libe2ap/WidebandCQICodeword1.c
deleted file mode 100644
index d1de59d..0000000
--- a/3rdparty/libe2ap/WidebandCQICodeword1.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "WidebandCQICodeword1.h"
-
-static int
-memb_four_bitCQI_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 15)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static int
-memb_three_bitSpatialDifferentialCQI_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
-			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
-	long value;
-	
-	if(!sptr) {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: value not given (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-	
-	value = *(const long *)sptr;
-	
-	if((value >= 0 && value <= 7)) {
-		/* Constraint check succeeded */
-		return 0;
-	} else {
-		ASN__CTFAIL(app_key, td, sptr,
-			"%s: constraint failed (%s:%d)",
-			td->name, __FILE__, __LINE__);
-		return -1;
-	}
-}
-
-static asn_per_constraints_t asn_PER_memb_four_bitCQI_constr_2 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  4,  4,  0,  15 }	/* (0..15,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-static asn_per_constraints_t asn_PER_memb_three_bitSpatialDifferentialCQI_constr_3 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0,  7 }	/* (0..7,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_per_constraints_t asn_PER_type_WidebandCQICodeword1_constr_1 CC_NOTUSED = {
-	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0,  1 }	/* (0..1,...) */,
-	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
-	0, 0	/* No PER value map */
-};
-asn_TYPE_member_t asn_MBR_WidebandCQICodeword1_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct WidebandCQICodeword1, choice.four_bitCQI),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_four_bitCQI_constr_2,  memb_four_bitCQI_constraint_1 },
-		0, 0, /* No default value */
-		"four-bitCQI"
-		},
-	{ ATF_NOFLAGS, 0, offsetof(struct WidebandCQICodeword1, choice.three_bitSpatialDifferentialCQI),
-		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_NativeInteger,
-		0,
-		{ 0, &asn_PER_memb_three_bitSpatialDifferentialCQI_constr_3,  memb_three_bitSpatialDifferentialCQI_constraint_1 },
-		0, 0, /* No default value */
-		"three-bitSpatialDifferentialCQI"
-		},
-};
-static const asn_TYPE_tag2member_t asn_MAP_WidebandCQICodeword1_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* four-bitCQI */
-    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* three-bitSpatialDifferentialCQI */
-};
-asn_CHOICE_specifics_t asn_SPC_WidebandCQICodeword1_specs_1 = {
-	sizeof(struct WidebandCQICodeword1),
-	offsetof(struct WidebandCQICodeword1, _asn_ctx),
-	offsetof(struct WidebandCQICodeword1, present),
-	sizeof(((struct WidebandCQICodeword1 *)0)->present),
-	asn_MAP_WidebandCQICodeword1_tag2el_1,
-	2,	/* Count of tags in the map */
-	0, 0,
-	2	/* Extensions start */
-};
-asn_TYPE_descriptor_t asn_DEF_WidebandCQICodeword1 = {
-	"WidebandCQICodeword1",
-	"WidebandCQICodeword1",
-	&asn_OP_CHOICE,
-	0,	/* No effective tags (pointer) */
-	0,	/* No effective tags (count) */
-	0,	/* No tags (pointer) */
-	0,	/* No tags (count) */
-	{ 0, &asn_PER_type_WidebandCQICodeword1_constr_1, CHOICE_constraint },
-	asn_MBR_WidebandCQICodeword1_1,
-	2,	/* Elements count */
-	&asn_SPC_WidebandCQICodeword1_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/WidebandCQICodeword1.h b/3rdparty/libe2ap/WidebandCQICodeword1.h
deleted file mode 100644
index d3831c7..0000000
--- a/3rdparty/libe2ap/WidebandCQICodeword1.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-IEs"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_WidebandCQICodeword1_H_
-#define	_WidebandCQICodeword1_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "NativeInteger.h"
-#include "constr_CHOICE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Dependencies */
-typedef enum WidebandCQICodeword1_PR {
-	WidebandCQICodeword1_PR_NOTHING,	/* No components present */
-	WidebandCQICodeword1_PR_four_bitCQI,
-	WidebandCQICodeword1_PR_three_bitSpatialDifferentialCQI
-	/* Extensions may appear below */
-	
-} WidebandCQICodeword1_PR;
-
-/* WidebandCQICodeword1 */
-typedef struct WidebandCQICodeword1 {
-	WidebandCQICodeword1_PR present;
-	union WidebandCQICodeword1_u {
-		long	 four_bitCQI;
-		long	 three_bitSpatialDifferentialCQI;
-		/*
-		 * This type is extensible,
-		 * possible extensions are below.
-		 */
-	} choice;
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} WidebandCQICodeword1_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_WidebandCQICodeword1;
-extern asn_CHOICE_specifics_t asn_SPC_WidebandCQICodeword1_specs_1;
-extern asn_TYPE_member_t asn_MBR_WidebandCQICodeword1_1[2];
-extern asn_per_constraints_t asn_PER_type_WidebandCQICodeword1_constr_1;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _WidebandCQICodeword1_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/X2SetupFailure.c b/3rdparty/libe2ap/X2SetupFailure.c
deleted file mode 100644
index 940611a..0000000
--- a/3rdparty/libe2ap/X2SetupFailure.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "X2SetupFailure.h"
-
-asn_TYPE_member_t asn_MBR_X2SetupFailure_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupFailure, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P19,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_X2SetupFailure_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_X2SetupFailure_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_X2SetupFailure_specs_1 = {
-	sizeof(struct X2SetupFailure),
-	offsetof(struct X2SetupFailure, _asn_ctx),
-	asn_MAP_X2SetupFailure_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_X2SetupFailure = {
-	"X2SetupFailure",
-	"X2SetupFailure",
-	&asn_OP_SEQUENCE,
-	asn_DEF_X2SetupFailure_tags_1,
-	sizeof(asn_DEF_X2SetupFailure_tags_1)
-		/sizeof(asn_DEF_X2SetupFailure_tags_1[0]), /* 1 */
-	asn_DEF_X2SetupFailure_tags_1,	/* Same as above */
-	sizeof(asn_DEF_X2SetupFailure_tags_1)
-		/sizeof(asn_DEF_X2SetupFailure_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_X2SetupFailure_1,
-	1,	/* Elements count */
-	&asn_SPC_X2SetupFailure_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/X2SetupFailure.h b/3rdparty/libe2ap/X2SetupFailure.h
deleted file mode 100644
index 1fc07c5..0000000
--- a/3rdparty/libe2ap/X2SetupFailure.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_X2SetupFailure_H_
-#define	_X2SetupFailure_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* X2SetupFailure */
-typedef struct X2SetupFailure {
-	ProtocolIE_Container_8807P19_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} X2SetupFailure_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_X2SetupFailure;
-extern asn_SEQUENCE_specifics_t asn_SPC_X2SetupFailure_specs_1;
-extern asn_TYPE_member_t asn_MBR_X2SetupFailure_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _X2SetupFailure_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/X2SetupRequest.c b/3rdparty/libe2ap/X2SetupRequest.c
deleted file mode 100644
index ac8270b..0000000
--- a/3rdparty/libe2ap/X2SetupRequest.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "X2SetupRequest.h"
-
-asn_TYPE_member_t asn_MBR_X2SetupRequest_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupRequest, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P17,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_X2SetupRequest_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_X2SetupRequest_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_X2SetupRequest_specs_1 = {
-	sizeof(struct X2SetupRequest),
-	offsetof(struct X2SetupRequest, _asn_ctx),
-	asn_MAP_X2SetupRequest_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_X2SetupRequest = {
-	"X2SetupRequest",
-	"X2SetupRequest",
-	&asn_OP_SEQUENCE,
-	asn_DEF_X2SetupRequest_tags_1,
-	sizeof(asn_DEF_X2SetupRequest_tags_1)
-		/sizeof(asn_DEF_X2SetupRequest_tags_1[0]), /* 1 */
-	asn_DEF_X2SetupRequest_tags_1,	/* Same as above */
-	sizeof(asn_DEF_X2SetupRequest_tags_1)
-		/sizeof(asn_DEF_X2SetupRequest_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_X2SetupRequest_1,
-	1,	/* Elements count */
-	&asn_SPC_X2SetupRequest_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/X2SetupRequest.h b/3rdparty/libe2ap/X2SetupRequest.h
deleted file mode 100644
index ec511f5..0000000
--- a/3rdparty/libe2ap/X2SetupRequest.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_X2SetupRequest_H_
-#define	_X2SetupRequest_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* X2SetupRequest */
-typedef struct X2SetupRequest {
-	ProtocolIE_Container_8807P17_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} X2SetupRequest_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_X2SetupRequest;
-extern asn_SEQUENCE_specifics_t asn_SPC_X2SetupRequest_specs_1;
-extern asn_TYPE_member_t asn_MBR_X2SetupRequest_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _X2SetupRequest_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/X2SetupResponse.c b/3rdparty/libe2ap/X2SetupResponse.c
deleted file mode 100644
index 819f436..0000000
--- a/3rdparty/libe2ap/X2SetupResponse.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#include "X2SetupResponse.h"
-
-asn_TYPE_member_t asn_MBR_X2SetupResponse_1[] = {
-	{ ATF_NOFLAGS, 0, offsetof(struct X2SetupResponse, protocolIEs),
-		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
-		-1,	/* IMPLICIT tag at current level */
-		&asn_DEF_ProtocolIE_Container_8807P18,
-		0,
-		{ 0, 0, 0 },
-		0, 0, /* No default value */
-		"protocolIEs"
-		},
-};
-static const ber_tlv_tag_t asn_DEF_X2SetupResponse_tags_1[] = {
-	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
-};
-static const asn_TYPE_tag2member_t asn_MAP_X2SetupResponse_tag2el_1[] = {
-    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */
-};
-asn_SEQUENCE_specifics_t asn_SPC_X2SetupResponse_specs_1 = {
-	sizeof(struct X2SetupResponse),
-	offsetof(struct X2SetupResponse, _asn_ctx),
-	asn_MAP_X2SetupResponse_tag2el_1,
-	1,	/* Count of tags in the map */
-	0, 0, 0,	/* Optional elements (not needed) */
-	1,	/* First extension addition */
-};
-asn_TYPE_descriptor_t asn_DEF_X2SetupResponse = {
-	"X2SetupResponse",
-	"X2SetupResponse",
-	&asn_OP_SEQUENCE,
-	asn_DEF_X2SetupResponse_tags_1,
-	sizeof(asn_DEF_X2SetupResponse_tags_1)
-		/sizeof(asn_DEF_X2SetupResponse_tags_1[0]), /* 1 */
-	asn_DEF_X2SetupResponse_tags_1,	/* Same as above */
-	sizeof(asn_DEF_X2SetupResponse_tags_1)
-		/sizeof(asn_DEF_X2SetupResponse_tags_1[0]), /* 1 */
-	{ 0, 0, SEQUENCE_constraint },
-	asn_MBR_X2SetupResponse_1,
-	1,	/* Elements count */
-	&asn_SPC_X2SetupResponse_specs_1	/* Additional specs */
-};
-
diff --git a/3rdparty/libe2ap/X2SetupResponse.h b/3rdparty/libe2ap/X2SetupResponse.h
deleted file mode 100644
index f6946bd..0000000
--- a/3rdparty/libe2ap/X2SetupResponse.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- * From ASN.1 module "X2AP-PDU-Contents"
- * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
- * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
- */
-
-#ifndef	_X2SetupResponse_H_
-#define	_X2SetupResponse_H_
-
-
-#include "asn_application.h"
-
-/* Including external dependencies */
-#include "ProtocolIE-Container.h"
-#include "constr_SEQUENCE.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* X2SetupResponse */
-typedef struct X2SetupResponse {
-	ProtocolIE_Container_8807P18_t	 protocolIEs;
-	/*
-	 * This type is extensible,
-	 * possible extensions are below.
-	 */
-	
-	/* Context for parsing across buffer boundaries */
-	asn_struct_ctx_t _asn_ctx;
-} X2SetupResponse_t;
-
-/* Implementation */
-extern asn_TYPE_descriptor_t asn_DEF_X2SetupResponse;
-extern asn_SEQUENCE_specifics_t asn_SPC_X2SetupResponse_specs_1;
-extern asn_TYPE_member_t asn_MBR_X2SetupResponse_1[1];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _X2SetupResponse_H_ */
-#include "asn_internal.h"
diff --git a/3rdparty/libe2ap/asn_constant.h b/3rdparty/libe2ap/asn_constant.h
deleted file mode 100644
index 516818a..0000000
--- a/3rdparty/libe2ap/asn_constant.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
- */
-
-#ifndef _ASN_CONSTANT_H
-#define _ASN_CONSTANT_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define maxofRANfunctionID (256)
-#define maxofRICactionID (16)
-#define maxofInterfaceProtocolIE (15)
-#define maxofActionParameters (255)
-#define maxPrivateIEs (65535)
-#define maxProtocolExtensions (65535)
-#define maxProtocolIEs (65535)
-#define maxEARFCN (65535)
-#define maxEARFCNPlusOne (65536)
-#define newmaxEARFCN (262143)
-#define maxCellineNB (256)
-#define maxnoofBands (16)
-#define maxNrOfErrors (256)
-#define maxnoofBPLMNs (6)
-#define maxnoofNeighbours (512)
-#define maxnoofPRBs (110)
-#define maxPools (16)
-#define maxnoofMBSFN (8)
-#define maxFailedMeasObjects (32)
-#define maxnoofMBMSServiceAreaIdentities (256)
-#define maxnoofCoMPHypothesisSet (256)
-#define maxnoofCoMPCells (32)
-#define maxUEReport (128)
-#define maxCellReport (9)
-#define maxnoofPA (3)
-#define maxCSIProcess (4)
-#define maxCSIReport (2)
-#define maxSubband (14)
-#define maxofNRNeighbours (1024)
-#define maxCellinengNB (16384)
-#define maxnoofCellIDforQMC (32)
-#define maxnoofProtectedResourcePatterns (16)
-#define maxnoofNrCellBands (32)
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _ASN_CONSTANT_H */
