/*
 * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
 * From ASN.1 module "RANAP-PDU"
 * 	found in "../../asn1/ranap/RANAP-PDU.asn"
 */

#include "RANAP_DirectTransfer-IE-ContainerList.h"

static asn_per_constraints_t asn_PER_type_RANAP_DirectTransfer_IE_ContainerList_constr_1 GCC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_CONSTRAINED,	 4,  4,  1l,  15l }	/* (SIZE(1..15)) */,
	0, 0	/* No PER value map */
};
static asn_TYPE_member_t asn_MBR_RANAP_DirectTransfer_IE_ContainerList_1[] = {
	{ ATF_POINTER, 0, 0,
		-1 /* Ambiguous tag (CHOICE?) */,
		0,
		&asn_DEF_RANAP_ProtocolIE_Container,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		""
		},
};
static const ber_tlv_tag_t asn_DEF_RANAP_DirectTransfer_IE_ContainerList_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_RANAP_DirectTransfer_IE_ContainerList_specs_1 = {
	sizeof(struct RANAP_DirectTransfer_IE_ContainerList),
	offsetof(struct RANAP_DirectTransfer_IE_ContainerList, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_RANAP_DirectTransfer_IE_ContainerList = {
	"RANAP_DirectTransfer-IE-ContainerList",
	"RANAP_DirectTransfer-IE-ContainerList",
	SEQUENCE_OF_free,
	SEQUENCE_OF_print,
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	SEQUENCE_OF_decode_xer,
	SEQUENCE_OF_encode_xer,
	SEQUENCE_OF_decode_uper,
	SEQUENCE_OF_encode_uper,
	SEQUENCE_OF_decode_aper,
	SEQUENCE_OF_encode_aper,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_RANAP_DirectTransfer_IE_ContainerList_tags_1,
	sizeof(asn_DEF_RANAP_DirectTransfer_IE_ContainerList_tags_1)
		/sizeof(asn_DEF_RANAP_DirectTransfer_IE_ContainerList_tags_1[0]), /* 1 */
	asn_DEF_RANAP_DirectTransfer_IE_ContainerList_tags_1,	/* Same as above */
	sizeof(asn_DEF_RANAP_DirectTransfer_IE_ContainerList_tags_1)
		/sizeof(asn_DEF_RANAP_DirectTransfer_IE_ContainerList_tags_1[0]), /* 1 */
	&asn_PER_type_RANAP_DirectTransfer_IE_ContainerList_constr_1,
	asn_MBR_RANAP_DirectTransfer_IE_ContainerList_1,
	1,	/* Single element */
	&asn_SPC_RANAP_DirectTransfer_IE_ContainerList_specs_1	/* Additional specs */
};

