/*
 * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
 * From ASN.1 module "RUA-IEs"
 * 	found in "../../asn1/rua/RUA-IEs.asn"
 */

#include <osmocom/rua/RUA_IE-Extensions.h>

static asn_per_constraints_t asn_PER_type_RUA_IE_Extensions_constr_1 GCC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_CONSTRAINED,	 16,  16,  1l,  65535l }	/* (SIZE(1..65535)) */,
	0, 0	/* No PER value map */
};
static asn_TYPE_member_t asn_MBR_RUA_IE_Extensions_1[] = {
	{ ATF_POINTER, 0, 0,
		-1 /* Ambiguous tag (CHOICE?) */,
		0,
		&asn_DEF_RUA_IE,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		""
		},
};
static const ber_tlv_tag_t asn_DEF_RUA_IE_Extensions_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_RUA_IE_Extensions_specs_1 = {
	sizeof(struct RUA_IE_Extensions),
	offsetof(struct RUA_IE_Extensions, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_RUA_IE_Extensions = {
	"RUA_IE-Extensions",
	"RUA_IE-Extensions",
	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_RUA_IE_Extensions_tags_1,
	sizeof(asn_DEF_RUA_IE_Extensions_tags_1)
		/sizeof(asn_DEF_RUA_IE_Extensions_tags_1[0]), /* 1 */
	asn_DEF_RUA_IE_Extensions_tags_1,	/* Same as above */
	sizeof(asn_DEF_RUA_IE_Extensions_tags_1)
		/sizeof(asn_DEF_RUA_IE_Extensions_tags_1[0]), /* 1 */
	&asn_PER_type_RUA_IE_Extensions_constr_1,
	asn_MBR_RUA_IE_Extensions_1,
	1,	/* Single element */
	&asn_SPC_RUA_IE_Extensions_specs_1	/* Additional specs */
};

