/*
 * 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_LocationReportingTransferInformation.h>

static asn_TYPE_member_t asn_MBR_RANAP_LocationReportingTransferInformation_1[] = {
	{ ATF_POINTER, 12, offsetof(struct RANAP_LocationReportingTransferInformation, reportChangeOfSAI),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_ReportChangeOfSAI,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"reportChangeOfSAI"
		},
	{ ATF_POINTER, 11, offsetof(struct RANAP_LocationReportingTransferInformation, periodicReportingIndicator),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_PeriodicReportingIndicator,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"periodicReportingIndicator"
		},
	{ ATF_POINTER, 10, offsetof(struct RANAP_LocationReportingTransferInformation, directReportingIndicator),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_DirectReportingIndicator,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"directReportingIndicator"
		},
	{ ATF_POINTER, 9, offsetof(struct RANAP_LocationReportingTransferInformation, verticalAccuracyCode),
		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_VerticalAccuracyCode,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"verticalAccuracyCode"
		},
	{ ATF_POINTER, 8, offsetof(struct RANAP_LocationReportingTransferInformation, positioningPriorityChangeSAI),
		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_PositioningPriority,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"positioningPriorityChangeSAI"
		},
	{ ATF_POINTER, 7, offsetof(struct RANAP_LocationReportingTransferInformation, positioningPriorityDirect),
		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_PositioningPriority,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"positioningPriorityDirect"
		},
	{ ATF_POINTER, 6, offsetof(struct RANAP_LocationReportingTransferInformation, clientTypePeriodic),
		(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_ClientType,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"clientTypePeriodic"
		},
	{ ATF_POINTER, 5, offsetof(struct RANAP_LocationReportingTransferInformation, clientTypeDirect),
		(ASN_TAG_CLASS_CONTEXT | (7 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_ClientType,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"clientTypeDirect"
		},
	{ ATF_POINTER, 4, offsetof(struct RANAP_LocationReportingTransferInformation, responseTime),
		(ASN_TAG_CLASS_CONTEXT | (8 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_ResponseTime,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"responseTime"
		},
	{ ATF_POINTER, 3, offsetof(struct RANAP_LocationReportingTransferInformation, includeVelocity),
		(ASN_TAG_CLASS_CONTEXT | (9 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_IncludeVelocity,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"includeVelocity"
		},
	{ ATF_POINTER, 2, offsetof(struct RANAP_LocationReportingTransferInformation, periodicLocationInfo),
		(ASN_TAG_CLASS_CONTEXT | (10 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_PeriodicLocationInfo,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"periodicLocationInfo"
		},
	{ ATF_POINTER, 1, offsetof(struct RANAP_LocationReportingTransferInformation, iE_Extensions),
		(ASN_TAG_CLASS_CONTEXT | (11 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_IE_Extensions,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"iE-Extensions"
		},
};
static const int asn_MAP_RANAP_LocationReportingTransferInformation_oms_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
static const ber_tlv_tag_t asn_DEF_RANAP_LocationReportingTransferInformation_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_RANAP_LocationReportingTransferInformation_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* reportChangeOfSAI */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* periodicReportingIndicator */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* directReportingIndicator */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* verticalAccuracyCode */
    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* positioningPriorityChangeSAI */
    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* positioningPriorityDirect */
    { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* clientTypePeriodic */
    { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* clientTypeDirect */
    { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* responseTime */
    { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 }, /* includeVelocity */
    { (ASN_TAG_CLASS_CONTEXT | (10 << 2)), 10, 0, 0 }, /* periodicLocationInfo */
    { (ASN_TAG_CLASS_CONTEXT | (11 << 2)), 11, 0, 0 } /* iE-Extensions */
};
static asn_SEQUENCE_specifics_t asn_SPC_RANAP_LocationReportingTransferInformation_specs_1 = {
	sizeof(struct RANAP_LocationReportingTransferInformation),
	offsetof(struct RANAP_LocationReportingTransferInformation, _asn_ctx),
	asn_MAP_RANAP_LocationReportingTransferInformation_tag2el_1,
	12,	/* Count of tags in the map */
	asn_MAP_RANAP_LocationReportingTransferInformation_oms_1,	/* Optional members */
	12, 0,	/* Root/Additions */
	11,	/* Start extensions */
	13	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_RANAP_LocationReportingTransferInformation = {
	"RANAP_LocationReportingTransferInformation",
	"RANAP_LocationReportingTransferInformation",
	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_LocationReportingTransferInformation_tags_1,
	sizeof(asn_DEF_RANAP_LocationReportingTransferInformation_tags_1)
		/sizeof(asn_DEF_RANAP_LocationReportingTransferInformation_tags_1[0]), /* 1 */
	asn_DEF_RANAP_LocationReportingTransferInformation_tags_1,	/* Same as above */
	sizeof(asn_DEF_RANAP_LocationReportingTransferInformation_tags_1)
		/sizeof(asn_DEF_RANAP_LocationReportingTransferInformation_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_RANAP_LocationReportingTransferInformation_1,
	12,	/* Elements count */
	&asn_SPC_RANAP_LocationReportingTransferInformation_specs_1	/* Additional specs */
};

