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

#include <osmocom/ranap/RANAP_LocationRelatedDataRequestType.h>

static asn_TYPE_member_t asn_MBR_RANAP_LocationRelatedDataRequestType_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LocationRelatedDataRequestType, requestedLocationRelatedDataType),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_RequestedLocationRelatedDataType,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"requestedLocationRelatedDataType"
		},
	{ ATF_POINTER, 1, offsetof(struct RANAP_LocationRelatedDataRequestType, requestedGPSAssistanceData),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_RequestedGPSAssistanceData,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"requestedGPSAssistanceData"
		},
};
static const int asn_MAP_RANAP_LocationRelatedDataRequestType_oms_1[] = { 1 };
static const ber_tlv_tag_t asn_DEF_RANAP_LocationRelatedDataRequestType_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_RANAP_LocationRelatedDataRequestType_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* requestedLocationRelatedDataType */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* requestedGPSAssistanceData */
};
static asn_SEQUENCE_specifics_t asn_SPC_RANAP_LocationRelatedDataRequestType_specs_1 = {
	sizeof(struct RANAP_LocationRelatedDataRequestType),
	offsetof(struct RANAP_LocationRelatedDataRequestType, _asn_ctx),
	asn_MAP_RANAP_LocationRelatedDataRequestType_tag2el_1,
	2,	/* Count of tags in the map */
	asn_MAP_RANAP_LocationRelatedDataRequestType_oms_1,	/* Optional members */
	1, 0,	/* Root/Additions */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_RANAP_LocationRelatedDataRequestType = {
	"RANAP_LocationRelatedDataRequestType",
	"RANAP_LocationRelatedDataRequestType",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	SEQUENCE_decode_uper,
	SEQUENCE_encode_uper,
	SEQUENCE_decode_aper,
	SEQUENCE_encode_aper,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_RANAP_LocationRelatedDataRequestType_tags_1,
	sizeof(asn_DEF_RANAP_LocationRelatedDataRequestType_tags_1)
		/sizeof(asn_DEF_RANAP_LocationRelatedDataRequestType_tags_1[0]), /* 1 */
	asn_DEF_RANAP_LocationRelatedDataRequestType_tags_1,	/* Same as above */
	sizeof(asn_DEF_RANAP_LocationRelatedDataRequestType_tags_1)
		/sizeof(asn_DEF_RANAP_LocationRelatedDataRequestType_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_RANAP_LocationRelatedDataRequestType_1,
	2,	/* Elements count */
	&asn_SPC_RANAP_LocationRelatedDataRequestType_specs_1	/* Additional specs */
};

