/*
 * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
 * From ASN.1 module "HNBAP-IEs"
 * 	found in "../../asn1/hnbap/HNBAP-IEs.asn"
 * 	`asn1c -gen-PER`
 */

#include <osmocom/hnbap/ConfigurationInformation.h>

static asn_per_constraints_t asn_PER_type_ConfigurationInformation_constr_1 GCC_NOTUSED = {
	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_TYPE_member_t asn_MBR_ConfigurationInformation_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ConfigurationInformation, choice.provided),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_HNBConfigurationInformationProvided,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"provided"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ConfigurationInformation, choice.missing),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_HNBConfigurationInformationMissing,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"missing"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_ConfigurationInformation_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* provided */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* missing */
};
static asn_CHOICE_specifics_t asn_SPC_ConfigurationInformation_specs_1 = {
	sizeof(struct ConfigurationInformation),
	offsetof(struct ConfigurationInformation, _asn_ctx),
	offsetof(struct ConfigurationInformation, present),
	sizeof(((struct ConfigurationInformation *)0)->present),
	asn_MAP_ConfigurationInformation_tag2el_1,
	2,	/* Count of tags in the map */
	0,
	2	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_ConfigurationInformation = {
	"ConfigurationInformation",
	"ConfigurationInformation",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_decode_xer,
	CHOICE_encode_xer,
	CHOICE_decode_uper,
	CHOICE_encode_uper,
	CHOICE_decode_aper,
	CHOICE_encode_aper,
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	&asn_PER_type_ConfigurationInformation_constr_1,
	asn_MBR_ConfigurationInformation_1,
	2,	/* Elements count */
	&asn_SPC_ConfigurationInformation_specs_1	/* Additional specs */
};

