
/*** <<< INCLUDES [CN-IntegerUnlimited] >>> ***/

#include <INTEGER.h>

/*** <<< TYPE-DECLS [CN-IntegerUnlimited] >>> ***/

typedef INTEGER_t	 CN_IntegerUnlimited_t;

/*** <<< FUNC-DECLS [CN-IntegerUnlimited] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_CN_IntegerUnlimited;
asn_struct_free_f CN_IntegerUnlimited_free;
asn_struct_print_f CN_IntegerUnlimited_print;
asn_constr_check_f CN_IntegerUnlimited_constraint;
ber_type_decoder_f CN_IntegerUnlimited_decode_ber;
der_type_encoder_f CN_IntegerUnlimited_encode_der;
xer_type_decoder_f CN_IntegerUnlimited_decode_xer;
xer_type_encoder_f CN_IntegerUnlimited_encode_xer;

/*** <<< CODE [CN-IntegerUnlimited] >>> ***/

int
CN_IntegerUnlimited_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	/* Replace with underlying type checker */
	td->check_constraints = asn_DEF_INTEGER.check_constraints;
	return td->check_constraints(td, sptr, ctfailcb, app_key);
}

/*
 * This type is implemented using INTEGER,
 * so here we adjust the DEF accordingly.
 */
static void
CN_IntegerUnlimited_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_INTEGER.free_struct;
	td->print_struct   = asn_DEF_INTEGER.print_struct;
	td->ber_decoder    = asn_DEF_INTEGER.ber_decoder;
	td->der_encoder    = asn_DEF_INTEGER.der_encoder;
	td->xer_decoder    = asn_DEF_INTEGER.xer_decoder;
	td->xer_encoder    = asn_DEF_INTEGER.xer_encoder;
	td->uper_decoder   = asn_DEF_INTEGER.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_INTEGER.per_constraints;
	td->elements       = asn_DEF_INTEGER.elements;
	td->elements_count = asn_DEF_INTEGER.elements_count;
	td->specifics      = asn_DEF_INTEGER.specifics;
}

void
CN_IntegerUnlimited_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	CN_IntegerUnlimited_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
CN_IntegerUnlimited_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	CN_IntegerUnlimited_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
CN_IntegerUnlimited_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	CN_IntegerUnlimited_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
CN_IntegerUnlimited_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	CN_IntegerUnlimited_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
CN_IntegerUnlimited_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	CN_IntegerUnlimited_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
CN_IntegerUnlimited_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	CN_IntegerUnlimited_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [CN-IntegerUnlimited] >>> ***/

static ber_tlv_tag_t asn_DEF_CN_IntegerUnlimited_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_CN_IntegerUnlimited = {
	"CN-IntegerUnlimited",
	"CN-IntegerUnlimited",
	CN_IntegerUnlimited_free,
	CN_IntegerUnlimited_print,
	CN_IntegerUnlimited_constraint,
	CN_IntegerUnlimited_decode_ber,
	CN_IntegerUnlimited_encode_der,
	CN_IntegerUnlimited_decode_xer,
	CN_IntegerUnlimited_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_CN_IntegerUnlimited_tags_1,
	sizeof(asn_DEF_CN_IntegerUnlimited_tags_1)
		/sizeof(asn_DEF_CN_IntegerUnlimited_tags_1[0]), /* 1 */
	asn_DEF_CN_IntegerUnlimited_tags_1,	/* Same as above */
	sizeof(asn_DEF_CN_IntegerUnlimited_tags_1)
		/sizeof(asn_DEF_CN_IntegerUnlimited_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [CN-IntegerMinMax] >>> ***/

#include <INTEGER.h>

/*** <<< TYPE-DECLS [CN-IntegerMinMax] >>> ***/

typedef INTEGER_t	 CN_IntegerMinMax_t;

/*** <<< FUNC-DECLS [CN-IntegerMinMax] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinMax;
asn_struct_free_f CN_IntegerMinMax_free;
asn_struct_print_f CN_IntegerMinMax_print;
asn_constr_check_f CN_IntegerMinMax_constraint;
ber_type_decoder_f CN_IntegerMinMax_decode_ber;
der_type_encoder_f CN_IntegerMinMax_encode_der;
xer_type_decoder_f CN_IntegerMinMax_decode_xer;
xer_type_encoder_f CN_IntegerMinMax_encode_xer;

/*** <<< CODE [CN-IntegerMinMax] >>> ***/

int
CN_IntegerMinMax_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	const INTEGER_t *st = (const INTEGER_t *)sptr;
	
	if(!sptr) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	/* Replace with underlying type checker */
	td->check_constraints = asn_DEF_INTEGER.check_constraints;
	return td->check_constraints(td, sptr, ctfailcb, app_key);
}

/*
 * This type is implemented using INTEGER,
 * so here we adjust the DEF accordingly.
 */
static void
CN_IntegerMinMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_INTEGER.free_struct;
	td->print_struct   = asn_DEF_INTEGER.print_struct;
	td->ber_decoder    = asn_DEF_INTEGER.ber_decoder;
	td->der_encoder    = asn_DEF_INTEGER.der_encoder;
	td->xer_decoder    = asn_DEF_INTEGER.xer_decoder;
	td->xer_encoder    = asn_DEF_INTEGER.xer_encoder;
	td->uper_decoder   = asn_DEF_INTEGER.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_INTEGER.per_constraints;
	td->elements       = asn_DEF_INTEGER.elements;
	td->elements_count = asn_DEF_INTEGER.elements_count;
	td->specifics      = asn_DEF_INTEGER.specifics;
}

void
CN_IntegerMinMax_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	CN_IntegerMinMax_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
CN_IntegerMinMax_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	CN_IntegerMinMax_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
CN_IntegerMinMax_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	CN_IntegerMinMax_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
CN_IntegerMinMax_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	CN_IntegerMinMax_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
CN_IntegerMinMax_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	CN_IntegerMinMax_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
CN_IntegerMinMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	CN_IntegerMinMax_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [CN-IntegerMinMax] >>> ***/

static ber_tlv_tag_t asn_DEF_CN_IntegerMinMax_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinMax = {
	"CN-IntegerMinMax",
	"CN-IntegerMinMax",
	CN_IntegerMinMax_free,
	CN_IntegerMinMax_print,
	CN_IntegerMinMax_constraint,
	CN_IntegerMinMax_decode_ber,
	CN_IntegerMinMax_encode_der,
	CN_IntegerMinMax_decode_xer,
	CN_IntegerMinMax_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_CN_IntegerMinMax_tags_1,
	sizeof(asn_DEF_CN_IntegerMinMax_tags_1)
		/sizeof(asn_DEF_CN_IntegerMinMax_tags_1[0]), /* 1 */
	asn_DEF_CN_IntegerMinMax_tags_1,	/* Same as above */
	sizeof(asn_DEF_CN_IntegerMinMax_tags_1)
		/sizeof(asn_DEF_CN_IntegerMinMax_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [CN-IntegerMinLow] >>> ***/

#include <INTEGER.h>

/*** <<< TYPE-DECLS [CN-IntegerMinLow] >>> ***/

typedef INTEGER_t	 CN_IntegerMinLow_t;

/*** <<< FUNC-DECLS [CN-IntegerMinLow] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinLow;
asn_struct_free_f CN_IntegerMinLow_free;
asn_struct_print_f CN_IntegerMinLow_print;
asn_constr_check_f CN_IntegerMinLow_constraint;
ber_type_decoder_f CN_IntegerMinLow_decode_ber;
der_type_encoder_f CN_IntegerMinLow_encode_der;
xer_type_decoder_f CN_IntegerMinLow_decode_xer;
xer_type_encoder_f CN_IntegerMinLow_encode_xer;

/*** <<< CODE [CN-IntegerMinLow] >>> ***/

int
CN_IntegerMinLow_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	const INTEGER_t *st = (const INTEGER_t *)sptr;
	long value;
	
	if(!sptr) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if(asn_INTEGER2long(st, &value)) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value too large (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if((value <= 1)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using INTEGER,
 * so here we adjust the DEF accordingly.
 */
static void
CN_IntegerMinLow_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_INTEGER.free_struct;
	td->print_struct   = asn_DEF_INTEGER.print_struct;
	td->ber_decoder    = asn_DEF_INTEGER.ber_decoder;
	td->der_encoder    = asn_DEF_INTEGER.der_encoder;
	td->xer_decoder    = asn_DEF_INTEGER.xer_decoder;
	td->xer_encoder    = asn_DEF_INTEGER.xer_encoder;
	td->uper_decoder   = asn_DEF_INTEGER.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_INTEGER.per_constraints;
	td->elements       = asn_DEF_INTEGER.elements;
	td->elements_count = asn_DEF_INTEGER.elements_count;
	td->specifics      = asn_DEF_INTEGER.specifics;
}

void
CN_IntegerMinLow_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	CN_IntegerMinLow_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
CN_IntegerMinLow_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	CN_IntegerMinLow_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
CN_IntegerMinLow_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	CN_IntegerMinLow_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
CN_IntegerMinLow_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	CN_IntegerMinLow_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
CN_IntegerMinLow_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	CN_IntegerMinLow_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
CN_IntegerMinLow_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	CN_IntegerMinLow_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [CN-IntegerMinLow] >>> ***/

static ber_tlv_tag_t asn_DEF_CN_IntegerMinLow_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinLow = {
	"CN-IntegerMinLow",
	"CN-IntegerMinLow",
	CN_IntegerMinLow_free,
	CN_IntegerMinLow_print,
	CN_IntegerMinLow_constraint,
	CN_IntegerMinLow_decode_ber,
	CN_IntegerMinLow_encode_der,
	CN_IntegerMinLow_decode_xer,
	CN_IntegerMinLow_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_CN_IntegerMinLow_tags_1,
	sizeof(asn_DEF_CN_IntegerMinLow_tags_1)
		/sizeof(asn_DEF_CN_IntegerMinLow_tags_1[0]), /* 1 */
	asn_DEF_CN_IntegerMinLow_tags_1,	/* Same as above */
	sizeof(asn_DEF_CN_IntegerMinLow_tags_1)
		/sizeof(asn_DEF_CN_IntegerMinLow_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [NO-IntegerMinHigh] >>> ***/

#include <INTEGER.h>

/*** <<< TYPE-DECLS [NO-IntegerMinHigh] >>> ***/

typedef INTEGER_t	 NO_IntegerMinHigh_t;

/*** <<< FUNC-DECLS [NO-IntegerMinHigh] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerMinHigh;
asn_struct_free_f NO_IntegerMinHigh_free;
asn_struct_print_f NO_IntegerMinHigh_print;
asn_constr_check_f NO_IntegerMinHigh_constraint;
ber_type_decoder_f NO_IntegerMinHigh_decode_ber;
der_type_encoder_f NO_IntegerMinHigh_encode_der;
xer_type_decoder_f NO_IntegerMinHigh_decode_xer;
xer_type_encoder_f NO_IntegerMinHigh_encode_xer;

/*** <<< CODE [NO-IntegerMinHigh] >>> ***/

int
NO_IntegerMinHigh_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	const INTEGER_t *st = (const INTEGER_t *)sptr;
	long value;
	
	if(!sptr) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if(asn_INTEGER2long(st, &value)) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value too large (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if((value <= 3000000000)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using INTEGER,
 * so here we adjust the DEF accordingly.
 */
static void
NO_IntegerMinHigh_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_INTEGER.free_struct;
	td->print_struct   = asn_DEF_INTEGER.print_struct;
	td->ber_decoder    = asn_DEF_INTEGER.ber_decoder;
	td->der_encoder    = asn_DEF_INTEGER.der_encoder;
	td->xer_decoder    = asn_DEF_INTEGER.xer_decoder;
	td->xer_encoder    = asn_DEF_INTEGER.xer_encoder;
	td->uper_decoder   = asn_DEF_INTEGER.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_INTEGER.per_constraints;
	td->elements       = asn_DEF_INTEGER.elements;
	td->elements_count = asn_DEF_INTEGER.elements_count;
	td->specifics      = asn_DEF_INTEGER.specifics;
}

void
NO_IntegerMinHigh_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	NO_IntegerMinHigh_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
NO_IntegerMinHigh_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerMinHigh_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
NO_IntegerMinHigh_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	NO_IntegerMinHigh_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
NO_IntegerMinHigh_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerMinHigh_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
NO_IntegerMinHigh_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	NO_IntegerMinHigh_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
NO_IntegerMinHigh_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerMinHigh_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [NO-IntegerMinHigh] >>> ***/

static ber_tlv_tag_t asn_DEF_NO_IntegerMinHigh_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_NO_IntegerMinHigh = {
	"NO-IntegerMinHigh",
	"NO-IntegerMinHigh",
	NO_IntegerMinHigh_free,
	NO_IntegerMinHigh_print,
	NO_IntegerMinHigh_constraint,
	NO_IntegerMinHigh_decode_ber,
	NO_IntegerMinHigh_encode_der,
	NO_IntegerMinHigh_decode_xer,
	NO_IntegerMinHigh_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_NO_IntegerMinHigh_tags_1,
	sizeof(asn_DEF_NO_IntegerMinHigh_tags_1)
		/sizeof(asn_DEF_NO_IntegerMinHigh_tags_1[0]), /* 1 */
	asn_DEF_NO_IntegerMinHigh_tags_1,	/* Same as above */
	sizeof(asn_DEF_NO_IntegerMinHigh_tags_1)
		/sizeof(asn_DEF_NO_IntegerMinHigh_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [NO-IntegerLowHigh] >>> ***/

#include <INTEGER.h>

/*** <<< TYPE-DECLS [NO-IntegerLowHigh] >>> ***/

typedef INTEGER_t	 NO_IntegerLowHigh_t;

/*** <<< FUNC-DECLS [NO-IntegerLowHigh] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowHigh;
asn_struct_free_f NO_IntegerLowHigh_free;
asn_struct_print_f NO_IntegerLowHigh_print;
asn_constr_check_f NO_IntegerLowHigh_constraint;
ber_type_decoder_f NO_IntegerLowHigh_decode_ber;
der_type_encoder_f NO_IntegerLowHigh_encode_der;
xer_type_decoder_f NO_IntegerLowHigh_decode_xer;
xer_type_encoder_f NO_IntegerLowHigh_encode_xer;

/*** <<< CODE [NO-IntegerLowHigh] >>> ***/

int
NO_IntegerLowHigh_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	const INTEGER_t *st = (const INTEGER_t *)sptr;
	long value;
	
	if(!sptr) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if(asn_INTEGER2long(st, &value)) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value too large (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if((value >= 1 && value <= 3000000000)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using INTEGER,
 * so here we adjust the DEF accordingly.
 */
static void
NO_IntegerLowHigh_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_INTEGER.free_struct;
	td->print_struct   = asn_DEF_INTEGER.print_struct;
	td->ber_decoder    = asn_DEF_INTEGER.ber_decoder;
	td->der_encoder    = asn_DEF_INTEGER.der_encoder;
	td->xer_decoder    = asn_DEF_INTEGER.xer_decoder;
	td->xer_encoder    = asn_DEF_INTEGER.xer_encoder;
	td->uper_decoder   = asn_DEF_INTEGER.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_INTEGER.per_constraints;
	td->elements       = asn_DEF_INTEGER.elements;
	td->elements_count = asn_DEF_INTEGER.elements_count;
	td->specifics      = asn_DEF_INTEGER.specifics;
}

void
NO_IntegerLowHigh_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	NO_IntegerLowHigh_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
NO_IntegerLowHigh_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerLowHigh_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
NO_IntegerLowHigh_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	NO_IntegerLowHigh_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
NO_IntegerLowHigh_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerLowHigh_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
NO_IntegerLowHigh_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	NO_IntegerLowHigh_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
NO_IntegerLowHigh_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerLowHigh_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [NO-IntegerLowHigh] >>> ***/

static ber_tlv_tag_t asn_DEF_NO_IntegerLowHigh_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowHigh = {
	"NO-IntegerLowHigh",
	"NO-IntegerLowHigh",
	NO_IntegerLowHigh_free,
	NO_IntegerLowHigh_print,
	NO_IntegerLowHigh_constraint,
	NO_IntegerLowHigh_decode_ber,
	NO_IntegerLowHigh_encode_der,
	NO_IntegerLowHigh_decode_xer,
	NO_IntegerLowHigh_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_NO_IntegerLowHigh_tags_1,
	sizeof(asn_DEF_NO_IntegerLowHigh_tags_1)
		/sizeof(asn_DEF_NO_IntegerLowHigh_tags_1[0]), /* 1 */
	asn_DEF_NO_IntegerLowHigh_tags_1,	/* Same as above */
	sizeof(asn_DEF_NO_IntegerLowHigh_tags_1)
		/sizeof(asn_DEF_NO_IntegerLowHigh_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [CN-IntegerLowMax] >>> ***/

#include <INTEGER.h>

/*** <<< TYPE-DECLS [CN-IntegerLowMax] >>> ***/

typedef INTEGER_t	 CN_IntegerLowMax_t;

/*** <<< FUNC-DECLS [CN-IntegerLowMax] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_CN_IntegerLowMax;
asn_struct_free_f CN_IntegerLowMax_free;
asn_struct_print_f CN_IntegerLowMax_print;
asn_constr_check_f CN_IntegerLowMax_constraint;
ber_type_decoder_f CN_IntegerLowMax_decode_ber;
der_type_encoder_f CN_IntegerLowMax_encode_der;
xer_type_decoder_f CN_IntegerLowMax_decode_xer;
xer_type_encoder_f CN_IntegerLowMax_encode_xer;

/*** <<< CODE [CN-IntegerLowMax] >>> ***/

int
CN_IntegerLowMax_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	const INTEGER_t *st = (const INTEGER_t *)sptr;
	long value;
	
	if(!sptr) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if(asn_INTEGER2long(st, &value)) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value too large (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if((value >= 1)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using INTEGER,
 * so here we adjust the DEF accordingly.
 */
static void
CN_IntegerLowMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_INTEGER.free_struct;
	td->print_struct   = asn_DEF_INTEGER.print_struct;
	td->ber_decoder    = asn_DEF_INTEGER.ber_decoder;
	td->der_encoder    = asn_DEF_INTEGER.der_encoder;
	td->xer_decoder    = asn_DEF_INTEGER.xer_decoder;
	td->xer_encoder    = asn_DEF_INTEGER.xer_encoder;
	td->uper_decoder   = asn_DEF_INTEGER.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_INTEGER.per_constraints;
	td->elements       = asn_DEF_INTEGER.elements;
	td->elements_count = asn_DEF_INTEGER.elements_count;
	td->specifics      = asn_DEF_INTEGER.specifics;
}

void
CN_IntegerLowMax_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	CN_IntegerLowMax_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
CN_IntegerLowMax_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	CN_IntegerLowMax_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
CN_IntegerLowMax_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	CN_IntegerLowMax_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
CN_IntegerLowMax_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	CN_IntegerLowMax_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
CN_IntegerLowMax_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	CN_IntegerLowMax_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
CN_IntegerLowMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	CN_IntegerLowMax_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [CN-IntegerLowMax] >>> ***/

static ber_tlv_tag_t asn_DEF_CN_IntegerLowMax_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_CN_IntegerLowMax = {
	"CN-IntegerLowMax",
	"CN-IntegerLowMax",
	CN_IntegerLowMax_free,
	CN_IntegerLowMax_print,
	CN_IntegerLowMax_constraint,
	CN_IntegerLowMax_decode_ber,
	CN_IntegerLowMax_encode_der,
	CN_IntegerLowMax_decode_xer,
	CN_IntegerLowMax_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_CN_IntegerLowMax_tags_1,
	sizeof(asn_DEF_CN_IntegerLowMax_tags_1)
		/sizeof(asn_DEF_CN_IntegerLowMax_tags_1[0]), /* 1 */
	asn_DEF_CN_IntegerLowMax_tags_1,	/* Same as above */
	sizeof(asn_DEF_CN_IntegerLowMax_tags_1)
		/sizeof(asn_DEF_CN_IntegerLowMax_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [NO-IntegerHighMax] >>> ***/

#include <INTEGER.h>

/*** <<< TYPE-DECLS [NO-IntegerHighMax] >>> ***/

typedef INTEGER_t	 NO_IntegerHighMax_t;

/*** <<< FUNC-DECLS [NO-IntegerHighMax] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerHighMax;
asn_struct_free_f NO_IntegerHighMax_free;
asn_struct_print_f NO_IntegerHighMax_print;
asn_constr_check_f NO_IntegerHighMax_constraint;
ber_type_decoder_f NO_IntegerHighMax_decode_ber;
der_type_encoder_f NO_IntegerHighMax_encode_der;
xer_type_decoder_f NO_IntegerHighMax_decode_xer;
xer_type_encoder_f NO_IntegerHighMax_encode_xer;

/*** <<< CODE [NO-IntegerHighMax] >>> ***/

int
NO_IntegerHighMax_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	const INTEGER_t *st = (const INTEGER_t *)sptr;
	long value;
	
	if(!sptr) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if(asn_INTEGER2long(st, &value)) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value too large (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if((value >= 3000000000)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using INTEGER,
 * so here we adjust the DEF accordingly.
 */
static void
NO_IntegerHighMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_INTEGER.free_struct;
	td->print_struct   = asn_DEF_INTEGER.print_struct;
	td->ber_decoder    = asn_DEF_INTEGER.ber_decoder;
	td->der_encoder    = asn_DEF_INTEGER.der_encoder;
	td->xer_decoder    = asn_DEF_INTEGER.xer_decoder;
	td->xer_encoder    = asn_DEF_INTEGER.xer_encoder;
	td->uper_decoder   = asn_DEF_INTEGER.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_INTEGER.per_constraints;
	td->elements       = asn_DEF_INTEGER.elements;
	td->elements_count = asn_DEF_INTEGER.elements_count;
	td->specifics      = asn_DEF_INTEGER.specifics;
}

void
NO_IntegerHighMax_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	NO_IntegerHighMax_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
NO_IntegerHighMax_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerHighMax_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
NO_IntegerHighMax_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	NO_IntegerHighMax_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
NO_IntegerHighMax_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerHighMax_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
NO_IntegerHighMax_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	NO_IntegerHighMax_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
NO_IntegerHighMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerHighMax_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [NO-IntegerHighMax] >>> ***/

static ber_tlv_tag_t asn_DEF_NO_IntegerHighMax_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_NO_IntegerHighMax = {
	"NO-IntegerHighMax",
	"NO-IntegerHighMax",
	NO_IntegerHighMax_free,
	NO_IntegerHighMax_print,
	NO_IntegerHighMax_constraint,
	NO_IntegerHighMax_decode_ber,
	NO_IntegerHighMax_encode_der,
	NO_IntegerHighMax_decode_xer,
	NO_IntegerHighMax_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_NO_IntegerHighMax_tags_1,
	sizeof(asn_DEF_NO_IntegerHighMax_tags_1)
		/sizeof(asn_DEF_NO_IntegerHighMax_tags_1[0]), /* 1 */
	asn_DEF_NO_IntegerHighMax_tags_1,	/* Same as above */
	sizeof(asn_DEF_NO_IntegerHighMax_tags_1)
		/sizeof(asn_DEF_NO_IntegerHighMax_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [NO-IntegerLowestMax] >>> ***/

#include <INTEGER.h>

/*** <<< TYPE-DECLS [NO-IntegerLowestMax] >>> ***/

typedef INTEGER_t	 NO_IntegerLowestMax_t;

/*** <<< FUNC-DECLS [NO-IntegerLowestMax] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowestMax;
asn_struct_free_f NO_IntegerLowestMax_free;
asn_struct_print_f NO_IntegerLowestMax_print;
asn_constr_check_f NO_IntegerLowestMax_constraint;
ber_type_decoder_f NO_IntegerLowestMax_decode_ber;
der_type_encoder_f NO_IntegerLowestMax_encode_der;
xer_type_decoder_f NO_IntegerLowestMax_decode_xer;
xer_type_encoder_f NO_IntegerLowestMax_encode_xer;

/*** <<< CODE [NO-IntegerLowestMax] >>> ***/

int
NO_IntegerLowestMax_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	const INTEGER_t *st = (const INTEGER_t *)sptr;
	long value;
	
	if(!sptr) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if(asn_INTEGER2long(st, &value)) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value too large (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if((value >= -3000000000)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using INTEGER,
 * so here we adjust the DEF accordingly.
 */
static void
NO_IntegerLowestMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_INTEGER.free_struct;
	td->print_struct   = asn_DEF_INTEGER.print_struct;
	td->ber_decoder    = asn_DEF_INTEGER.ber_decoder;
	td->der_encoder    = asn_DEF_INTEGER.der_encoder;
	td->xer_decoder    = asn_DEF_INTEGER.xer_decoder;
	td->xer_encoder    = asn_DEF_INTEGER.xer_encoder;
	td->uper_decoder   = asn_DEF_INTEGER.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_INTEGER.per_constraints;
	td->elements       = asn_DEF_INTEGER.elements;
	td->elements_count = asn_DEF_INTEGER.elements_count;
	td->specifics      = asn_DEF_INTEGER.specifics;
}

void
NO_IntegerLowestMax_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	NO_IntegerLowestMax_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
NO_IntegerLowestMax_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerLowestMax_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
NO_IntegerLowestMax_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	NO_IntegerLowestMax_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
NO_IntegerLowestMax_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerLowestMax_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
NO_IntegerLowestMax_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	NO_IntegerLowestMax_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
NO_IntegerLowestMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerLowestMax_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [NO-IntegerLowestMax] >>> ***/

static ber_tlv_tag_t asn_DEF_NO_IntegerLowestMax_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowestMax = {
	"NO-IntegerLowestMax",
	"NO-IntegerLowestMax",
	NO_IntegerLowestMax_free,
	NO_IntegerLowestMax_print,
	NO_IntegerLowestMax_constraint,
	NO_IntegerLowestMax_decode_ber,
	NO_IntegerLowestMax_encode_der,
	NO_IntegerLowestMax_decode_xer,
	NO_IntegerLowestMax_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_NO_IntegerLowestMax_tags_1,
	sizeof(asn_DEF_NO_IntegerLowestMax_tags_1)
		/sizeof(asn_DEF_NO_IntegerLowestMax_tags_1[0]), /* 1 */
	asn_DEF_NO_IntegerLowestMax_tags_1,	/* Same as above */
	sizeof(asn_DEF_NO_IntegerLowestMax_tags_1)
		/sizeof(asn_DEF_NO_IntegerLowestMax_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [NO-IntegerOutRange] >>> ***/

#include <INTEGER.h>

/*** <<< TYPE-DECLS [NO-IntegerOutRange] >>> ***/

typedef INTEGER_t	 NO_IntegerOutRange_t;

/*** <<< FUNC-DECLS [NO-IntegerOutRange] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutRange;
asn_struct_free_f NO_IntegerOutRange_free;
asn_struct_print_f NO_IntegerOutRange_print;
asn_constr_check_f NO_IntegerOutRange_constraint;
ber_type_decoder_f NO_IntegerOutRange_decode_ber;
der_type_encoder_f NO_IntegerOutRange_encode_der;
xer_type_decoder_f NO_IntegerOutRange_decode_xer;
xer_type_encoder_f NO_IntegerOutRange_encode_xer;

/*** <<< CODE [NO-IntegerOutRange] >>> ***/

int
NO_IntegerOutRange_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	const INTEGER_t *st = (const INTEGER_t *)sptr;
	long value;
	
	if(!sptr) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if(asn_INTEGER2long(st, &value)) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value too large (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if((value >= 3000000000 && value <= 3000000001)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using INTEGER,
 * so here we adjust the DEF accordingly.
 */
static void
NO_IntegerOutRange_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_INTEGER.free_struct;
	td->print_struct   = asn_DEF_INTEGER.print_struct;
	td->ber_decoder    = asn_DEF_INTEGER.ber_decoder;
	td->der_encoder    = asn_DEF_INTEGER.der_encoder;
	td->xer_decoder    = asn_DEF_INTEGER.xer_decoder;
	td->xer_encoder    = asn_DEF_INTEGER.xer_encoder;
	td->uper_decoder   = asn_DEF_INTEGER.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_INTEGER.per_constraints;
	td->elements       = asn_DEF_INTEGER.elements;
	td->elements_count = asn_DEF_INTEGER.elements_count;
	td->specifics      = asn_DEF_INTEGER.specifics;
}

void
NO_IntegerOutRange_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	NO_IntegerOutRange_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
NO_IntegerOutRange_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerOutRange_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
NO_IntegerOutRange_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	NO_IntegerOutRange_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
NO_IntegerOutRange_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerOutRange_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
NO_IntegerOutRange_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	NO_IntegerOutRange_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
NO_IntegerOutRange_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerOutRange_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [NO-IntegerOutRange] >>> ***/

static ber_tlv_tag_t asn_DEF_NO_IntegerOutRange_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutRange = {
	"NO-IntegerOutRange",
	"NO-IntegerOutRange",
	NO_IntegerOutRange_free,
	NO_IntegerOutRange_print,
	NO_IntegerOutRange_constraint,
	NO_IntegerOutRange_decode_ber,
	NO_IntegerOutRange_encode_der,
	NO_IntegerOutRange_decode_xer,
	NO_IntegerOutRange_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_NO_IntegerOutRange_tags_1,
	sizeof(asn_DEF_NO_IntegerOutRange_tags_1)
		/sizeof(asn_DEF_NO_IntegerOutRange_tags_1[0]), /* 1 */
	asn_DEF_NO_IntegerOutRange_tags_1,	/* Same as above */
	sizeof(asn_DEF_NO_IntegerOutRange_tags_1)
		/sizeof(asn_DEF_NO_IntegerOutRange_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [NO-IntegerOutValue] >>> ***/

#include <INTEGER.h>

/*** <<< TYPE-DECLS [NO-IntegerOutValue] >>> ***/

typedef INTEGER_t	 NO_IntegerOutValue_t;

/*** <<< FUNC-DECLS [NO-IntegerOutValue] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutValue;
asn_struct_free_f NO_IntegerOutValue_free;
asn_struct_print_f NO_IntegerOutValue_print;
asn_constr_check_f NO_IntegerOutValue_constraint;
ber_type_decoder_f NO_IntegerOutValue_decode_ber;
der_type_encoder_f NO_IntegerOutValue_encode_der;
xer_type_decoder_f NO_IntegerOutValue_decode_xer;
xer_type_encoder_f NO_IntegerOutValue_encode_xer;

/*** <<< CODE [NO-IntegerOutValue] >>> ***/

int
NO_IntegerOutValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	const INTEGER_t *st = (const INTEGER_t *)sptr;
	long value;
	
	if(!sptr) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if(asn_INTEGER2long(st, &value)) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value too large (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if((value == 3000000000)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using INTEGER,
 * so here we adjust the DEF accordingly.
 */
static void
NO_IntegerOutValue_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_INTEGER.free_struct;
	td->print_struct   = asn_DEF_INTEGER.print_struct;
	td->ber_decoder    = asn_DEF_INTEGER.ber_decoder;
	td->der_encoder    = asn_DEF_INTEGER.der_encoder;
	td->xer_decoder    = asn_DEF_INTEGER.xer_decoder;
	td->xer_encoder    = asn_DEF_INTEGER.xer_encoder;
	td->uper_decoder   = asn_DEF_INTEGER.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_INTEGER.per_constraints;
	td->elements       = asn_DEF_INTEGER.elements;
	td->elements_count = asn_DEF_INTEGER.elements_count;
	td->specifics      = asn_DEF_INTEGER.specifics;
}

void
NO_IntegerOutValue_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	NO_IntegerOutValue_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
NO_IntegerOutValue_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerOutValue_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
NO_IntegerOutValue_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	NO_IntegerOutValue_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
NO_IntegerOutValue_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerOutValue_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
NO_IntegerOutValue_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	NO_IntegerOutValue_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
NO_IntegerOutValue_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerOutValue_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [NO-IntegerOutValue] >>> ***/

static ber_tlv_tag_t asn_DEF_NO_IntegerOutValue_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutValue = {
	"NO-IntegerOutValue",
	"NO-IntegerOutValue",
	NO_IntegerOutValue_free,
	NO_IntegerOutValue_print,
	NO_IntegerOutValue_constraint,
	NO_IntegerOutValue_decode_ber,
	NO_IntegerOutValue_encode_der,
	NO_IntegerOutValue_decode_xer,
	NO_IntegerOutValue_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_NO_IntegerOutValue_tags_1,
	sizeof(asn_DEF_NO_IntegerOutValue_tags_1)
		/sizeof(asn_DEF_NO_IntegerOutValue_tags_1[0]), /* 1 */
	asn_DEF_NO_IntegerOutValue_tags_1,	/* Same as above */
	sizeof(asn_DEF_NO_IntegerOutValue_tags_1)
		/sizeof(asn_DEF_NO_IntegerOutValue_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [OK-IntegerInRange1] >>> ***/

#include <NativeInteger.h>

/*** <<< TYPE-DECLS [OK-IntegerInRange1] >>> ***/

typedef long	 OK_IntegerInRange1_t;

/*** <<< FUNC-DECLS [OK-IntegerInRange1] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange1;
asn_struct_free_f OK_IntegerInRange1_free;
asn_struct_print_f OK_IntegerInRange1_print;
asn_constr_check_f OK_IntegerInRange1_constraint;
ber_type_decoder_f OK_IntegerInRange1_decode_ber;
der_type_encoder_f OK_IntegerInRange1_encode_der;
xer_type_decoder_f OK_IntegerInRange1_decode_xer;
xer_type_encoder_f OK_IntegerInRange1_encode_xer;

/*** <<< CODE [OK-IntegerInRange1] >>> ***/

int
OK_IntegerInRange1_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= -100 && value <= 100)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using NativeInteger,
 * so here we adjust the DEF accordingly.
 */
static void
OK_IntegerInRange1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_NativeInteger.free_struct;
	td->print_struct   = asn_DEF_NativeInteger.print_struct;
	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
	td->elements       = asn_DEF_NativeInteger.elements;
	td->elements_count = asn_DEF_NativeInteger.elements_count;
	td->specifics      = asn_DEF_NativeInteger.specifics;
}

void
OK_IntegerInRange1_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	OK_IntegerInRange1_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
OK_IntegerInRange1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	OK_IntegerInRange1_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
OK_IntegerInRange1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	OK_IntegerInRange1_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
OK_IntegerInRange1_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	OK_IntegerInRange1_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
OK_IntegerInRange1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	OK_IntegerInRange1_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
OK_IntegerInRange1_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	OK_IntegerInRange1_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [OK-IntegerInRange1] >>> ***/

static ber_tlv_tag_t asn_DEF_OK_IntegerInRange1_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange1 = {
	"OK-IntegerInRange1",
	"OK-IntegerInRange1",
	OK_IntegerInRange1_free,
	OK_IntegerInRange1_print,
	OK_IntegerInRange1_constraint,
	OK_IntegerInRange1_decode_ber,
	OK_IntegerInRange1_encode_der,
	OK_IntegerInRange1_decode_xer,
	OK_IntegerInRange1_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_OK_IntegerInRange1_tags_1,
	sizeof(asn_DEF_OK_IntegerInRange1_tags_1)
		/sizeof(asn_DEF_OK_IntegerInRange1_tags_1[0]), /* 1 */
	asn_DEF_OK_IntegerInRange1_tags_1,	/* Same as above */
	sizeof(asn_DEF_OK_IntegerInRange1_tags_1)
		/sizeof(asn_DEF_OK_IntegerInRange1_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [OK-IntegerInRange2] >>> ***/

#include <NativeInteger.h>

/*** <<< TYPE-DECLS [OK-IntegerInRange2] >>> ***/

typedef long	 OK_IntegerInRange2_t;

/*** <<< FUNC-DECLS [OK-IntegerInRange2] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange2;
asn_struct_free_f OK_IntegerInRange2_free;
asn_struct_print_f OK_IntegerInRange2_print;
asn_constr_check_f OK_IntegerInRange2_constraint;
ber_type_decoder_f OK_IntegerInRange2_decode_ber;
der_type_encoder_f OK_IntegerInRange2_encode_der;
xer_type_decoder_f OK_IntegerInRange2_decode_xer;
xer_type_encoder_f OK_IntegerInRange2_encode_xer;

/*** <<< CODE [OK-IntegerInRange2] >>> ***/

int
OK_IntegerInRange2_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if(((value == -100) || (value == 100))) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using NativeInteger,
 * so here we adjust the DEF accordingly.
 */
static void
OK_IntegerInRange2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_NativeInteger.free_struct;
	td->print_struct   = asn_DEF_NativeInteger.print_struct;
	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
	td->elements       = asn_DEF_NativeInteger.elements;
	td->elements_count = asn_DEF_NativeInteger.elements_count;
	td->specifics      = asn_DEF_NativeInteger.specifics;
}

void
OK_IntegerInRange2_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	OK_IntegerInRange2_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
OK_IntegerInRange2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	OK_IntegerInRange2_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
OK_IntegerInRange2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	OK_IntegerInRange2_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
OK_IntegerInRange2_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	OK_IntegerInRange2_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
OK_IntegerInRange2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	OK_IntegerInRange2_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
OK_IntegerInRange2_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	OK_IntegerInRange2_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [OK-IntegerInRange2] >>> ***/

static ber_tlv_tag_t asn_DEF_OK_IntegerInRange2_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange2 = {
	"OK-IntegerInRange2",
	"OK-IntegerInRange2",
	OK_IntegerInRange2_free,
	OK_IntegerInRange2_print,
	OK_IntegerInRange2_constraint,
	OK_IntegerInRange2_decode_ber,
	OK_IntegerInRange2_encode_der,
	OK_IntegerInRange2_decode_xer,
	OK_IntegerInRange2_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_OK_IntegerInRange2_tags_1,
	sizeof(asn_DEF_OK_IntegerInRange2_tags_1)
		/sizeof(asn_DEF_OK_IntegerInRange2_tags_1[0]), /* 1 */
	asn_DEF_OK_IntegerInRange2_tags_1,	/* Same as above */
	sizeof(asn_DEF_OK_IntegerInRange2_tags_1)
		/sizeof(asn_DEF_OK_IntegerInRange2_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [OK-IntegerInRange3] >>> ***/

#include <NativeInteger.h>

/*** <<< TYPE-DECLS [OK-IntegerInRange3] >>> ***/

typedef long	 OK_IntegerInRange3_t;

/*** <<< FUNC-DECLS [OK-IntegerInRange3] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange3;
asn_struct_free_f OK_IntegerInRange3_free;
asn_struct_print_f OK_IntegerInRange3_print;
asn_constr_check_f OK_IntegerInRange3_constraint;
ber_type_decoder_f OK_IntegerInRange3_decode_ber;
der_type_encoder_f OK_IntegerInRange3_encode_der;
xer_type_decoder_f OK_IntegerInRange3_decode_xer;
xer_type_encoder_f OK_IntegerInRange3_encode_xer;

/*** <<< CODE [OK-IntegerInRange3] >>> ***/

int
OK_IntegerInRange3_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= -2147483648 && value <= 2147483647)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using NativeInteger,
 * so here we adjust the DEF accordingly.
 */
static void
OK_IntegerInRange3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_NativeInteger.free_struct;
	td->print_struct   = asn_DEF_NativeInteger.print_struct;
	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
	td->elements       = asn_DEF_NativeInteger.elements;
	td->elements_count = asn_DEF_NativeInteger.elements_count;
	td->specifics      = asn_DEF_NativeInteger.specifics;
}

void
OK_IntegerInRange3_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	OK_IntegerInRange3_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
OK_IntegerInRange3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	OK_IntegerInRange3_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
OK_IntegerInRange3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	OK_IntegerInRange3_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
OK_IntegerInRange3_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	OK_IntegerInRange3_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
OK_IntegerInRange3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	OK_IntegerInRange3_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
OK_IntegerInRange3_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	OK_IntegerInRange3_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [OK-IntegerInRange3] >>> ***/

static ber_tlv_tag_t asn_DEF_OK_IntegerInRange3_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange3 = {
	"OK-IntegerInRange3",
	"OK-IntegerInRange3",
	OK_IntegerInRange3_free,
	OK_IntegerInRange3_print,
	OK_IntegerInRange3_constraint,
	OK_IntegerInRange3_decode_ber,
	OK_IntegerInRange3_encode_der,
	OK_IntegerInRange3_decode_xer,
	OK_IntegerInRange3_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_OK_IntegerInRange3_tags_1,
	sizeof(asn_DEF_OK_IntegerInRange3_tags_1)
		/sizeof(asn_DEF_OK_IntegerInRange3_tags_1[0]), /* 1 */
	asn_DEF_OK_IntegerInRange3_tags_1,	/* Same as above */
	sizeof(asn_DEF_OK_IntegerInRange3_tags_1)
		/sizeof(asn_DEF_OK_IntegerInRange3_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [OK-IntegerInRange4] >>> ***/

#include <NativeInteger.h>

/*** <<< TYPE-DECLS [OK-IntegerInRange4] >>> ***/

typedef long	 OK_IntegerInRange4_t;

/*** <<< FUNC-DECLS [OK-IntegerInRange4] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange4;
asn_struct_free_f OK_IntegerInRange4_free;
asn_struct_print_f OK_IntegerInRange4_print;
asn_constr_check_f OK_IntegerInRange4_constraint;
ber_type_decoder_f OK_IntegerInRange4_decode_ber;
der_type_encoder_f OK_IntegerInRange4_encode_der;
xer_type_decoder_f OK_IntegerInRange4_decode_xer;
xer_type_encoder_f OK_IntegerInRange4_encode_xer;

/*** <<< CODE [OK-IntegerInRange4] >>> ***/

int
OK_IntegerInRange4_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if(((value == -2147483648) || (value == 2147483647))) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using NativeInteger,
 * so here we adjust the DEF accordingly.
 */
static void
OK_IntegerInRange4_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_NativeInteger.free_struct;
	td->print_struct   = asn_DEF_NativeInteger.print_struct;
	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
	td->elements       = asn_DEF_NativeInteger.elements;
	td->elements_count = asn_DEF_NativeInteger.elements_count;
	td->specifics      = asn_DEF_NativeInteger.specifics;
}

void
OK_IntegerInRange4_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	OK_IntegerInRange4_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
OK_IntegerInRange4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	OK_IntegerInRange4_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
OK_IntegerInRange4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	OK_IntegerInRange4_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
OK_IntegerInRange4_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	OK_IntegerInRange4_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
OK_IntegerInRange4_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	OK_IntegerInRange4_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
OK_IntegerInRange4_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	OK_IntegerInRange4_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [OK-IntegerInRange4] >>> ***/

static ber_tlv_tag_t asn_DEF_OK_IntegerInRange4_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange4 = {
	"OK-IntegerInRange4",
	"OK-IntegerInRange4",
	OK_IntegerInRange4_free,
	OK_IntegerInRange4_print,
	OK_IntegerInRange4_constraint,
	OK_IntegerInRange4_decode_ber,
	OK_IntegerInRange4_encode_der,
	OK_IntegerInRange4_decode_xer,
	OK_IntegerInRange4_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_OK_IntegerInRange4_tags_1,
	sizeof(asn_DEF_OK_IntegerInRange4_tags_1)
		/sizeof(asn_DEF_OK_IntegerInRange4_tags_1[0]), /* 1 */
	asn_DEF_OK_IntegerInRange4_tags_1,	/* Same as above */
	sizeof(asn_DEF_OK_IntegerInRange4_tags_1)
		/sizeof(asn_DEF_OK_IntegerInRange4_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [OK-IntegerInRange5] >>> ***/

#include <INTEGER.h>

/*** <<< TYPE-DECLS [OK-IntegerInRange5] >>> ***/

typedef INTEGER_t	 OK_IntegerInRange5_t;

/*** <<< FUNC-DECLS [OK-IntegerInRange5] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange5;
asn_struct_free_f OK_IntegerInRange5_free;
asn_struct_print_f OK_IntegerInRange5_print;
asn_constr_check_f OK_IntegerInRange5_constraint;
ber_type_decoder_f OK_IntegerInRange5_decode_ber;
der_type_encoder_f OK_IntegerInRange5_encode_der;
xer_type_decoder_f OK_IntegerInRange5_decode_xer;
xer_type_encoder_f OK_IntegerInRange5_encode_xer;

/*** <<< CODE [OK-IntegerInRange5] >>> ***/

int
OK_IntegerInRange5_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	const INTEGER_t *st = (const INTEGER_t *)sptr;
	long value;
	
	if(!sptr) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if(asn_INTEGER2long(st, &value)) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value too large (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if(((value == -2147483648) || (value == 2147483647))) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using INTEGER,
 * so here we adjust the DEF accordingly.
 */
static void
OK_IntegerInRange5_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_INTEGER.free_struct;
	td->print_struct   = asn_DEF_INTEGER.print_struct;
	td->ber_decoder    = asn_DEF_INTEGER.ber_decoder;
	td->der_encoder    = asn_DEF_INTEGER.der_encoder;
	td->xer_decoder    = asn_DEF_INTEGER.xer_decoder;
	td->xer_encoder    = asn_DEF_INTEGER.xer_encoder;
	td->uper_decoder   = asn_DEF_INTEGER.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_INTEGER.per_constraints;
	td->elements       = asn_DEF_INTEGER.elements;
	td->elements_count = asn_DEF_INTEGER.elements_count;
	td->specifics      = asn_DEF_INTEGER.specifics;
}

void
OK_IntegerInRange5_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	OK_IntegerInRange5_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
OK_IntegerInRange5_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	OK_IntegerInRange5_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
OK_IntegerInRange5_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	OK_IntegerInRange5_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
OK_IntegerInRange5_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	OK_IntegerInRange5_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
OK_IntegerInRange5_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	OK_IntegerInRange5_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
OK_IntegerInRange5_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	OK_IntegerInRange5_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [OK-IntegerInRange5] >>> ***/

static ber_tlv_tag_t asn_DEF_OK_IntegerInRange5_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange5 = {
	"OK-IntegerInRange5",
	"OK-IntegerInRange5",
	OK_IntegerInRange5_free,
	OK_IntegerInRange5_print,
	OK_IntegerInRange5_constraint,
	OK_IntegerInRange5_decode_ber,
	OK_IntegerInRange5_encode_der,
	OK_IntegerInRange5_decode_xer,
	OK_IntegerInRange5_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_OK_IntegerInRange5_tags_1,
	sizeof(asn_DEF_OK_IntegerInRange5_tags_1)
		/sizeof(asn_DEF_OK_IntegerInRange5_tags_1[0]), /* 1 */
	asn_DEF_OK_IntegerInRange5_tags_1,	/* Same as above */
	sizeof(asn_DEF_OK_IntegerInRange5_tags_1)
		/sizeof(asn_DEF_OK_IntegerInRange5_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [NO-IntegerInRange6] >>> ***/

#include <INTEGER.h>

/*** <<< TYPE-DECLS [NO-IntegerInRange6] >>> ***/

typedef INTEGER_t	 NO_IntegerInRange6_t;

/*** <<< FUNC-DECLS [NO-IntegerInRange6] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerInRange6;
asn_struct_free_f NO_IntegerInRange6_free;
asn_struct_print_f NO_IntegerInRange6_print;
asn_constr_check_f NO_IntegerInRange6_constraint;
ber_type_decoder_f NO_IntegerInRange6_decode_ber;
der_type_encoder_f NO_IntegerInRange6_encode_der;
xer_type_decoder_f NO_IntegerInRange6_decode_xer;
xer_type_encoder_f NO_IntegerInRange6_encode_xer;

/*** <<< CODE [NO-IntegerInRange6] >>> ***/

int
NO_IntegerInRange6_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	const INTEGER_t *st = (const INTEGER_t *)sptr;
	long value;
	
	if(!sptr) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if(asn_INTEGER2long(st, &value)) {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: value too large (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if((value >= 0 && value <= 4294967295)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using INTEGER,
 * so here we adjust the DEF accordingly.
 */
static void
NO_IntegerInRange6_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_INTEGER.free_struct;
	td->print_struct   = asn_DEF_INTEGER.print_struct;
	td->ber_decoder    = asn_DEF_INTEGER.ber_decoder;
	td->der_encoder    = asn_DEF_INTEGER.der_encoder;
	td->xer_decoder    = asn_DEF_INTEGER.xer_decoder;
	td->xer_encoder    = asn_DEF_INTEGER.xer_encoder;
	td->uper_decoder   = asn_DEF_INTEGER.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_INTEGER.per_constraints;
	td->elements       = asn_DEF_INTEGER.elements;
	td->elements_count = asn_DEF_INTEGER.elements_count;
	td->specifics      = asn_DEF_INTEGER.specifics;
}

void
NO_IntegerInRange6_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	NO_IntegerInRange6_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
NO_IntegerInRange6_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerInRange6_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
NO_IntegerInRange6_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	NO_IntegerInRange6_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
NO_IntegerInRange6_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerInRange6_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
NO_IntegerInRange6_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	NO_IntegerInRange6_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
NO_IntegerInRange6_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerInRange6_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [NO-IntegerInRange6] >>> ***/

static ber_tlv_tag_t asn_DEF_NO_IntegerInRange6_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_NO_IntegerInRange6 = {
	"NO-IntegerInRange6",
	"NO-IntegerInRange6",
	NO_IntegerInRange6_free,
	NO_IntegerInRange6_print,
	NO_IntegerInRange6_constraint,
	NO_IntegerInRange6_decode_ber,
	NO_IntegerInRange6_encode_der,
	NO_IntegerInRange6_decode_xer,
	NO_IntegerInRange6_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_NO_IntegerInRange6_tags_1,
	sizeof(asn_DEF_NO_IntegerInRange6_tags_1)
		/sizeof(asn_DEF_NO_IntegerInRange6_tags_1[0]), /* 1 */
	asn_DEF_NO_IntegerInRange6_tags_1,	/* Same as above */
	sizeof(asn_DEF_NO_IntegerInRange6_tags_1)
		/sizeof(asn_DEF_NO_IntegerInRange6_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [CN-IntegerEnumerated1] >>> ***/

#include <INTEGER.h>

/*** <<< DEPS [CN-IntegerEnumerated1] >>> ***/

typedef enum CN_IntegerEnumerated1 {
	CN_IntegerEnumerated1_a	= 1,
	CN_IntegerEnumerated1_b	= 2
} e_CN_IntegerEnumerated1;

/*** <<< TYPE-DECLS [CN-IntegerEnumerated1] >>> ***/

typedef INTEGER_t	 CN_IntegerEnumerated1_t;

/*** <<< FUNC-DECLS [CN-IntegerEnumerated1] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_CN_IntegerEnumerated1;
asn_struct_free_f CN_IntegerEnumerated1_free;
asn_struct_print_f CN_IntegerEnumerated1_print;
asn_constr_check_f CN_IntegerEnumerated1_constraint;
ber_type_decoder_f CN_IntegerEnumerated1_decode_ber;
der_type_encoder_f CN_IntegerEnumerated1_encode_der;
xer_type_decoder_f CN_IntegerEnumerated1_decode_xer;
xer_type_encoder_f CN_IntegerEnumerated1_encode_xer;

/*** <<< CODE [CN-IntegerEnumerated1] >>> ***/

int
CN_IntegerEnumerated1_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	/* Replace with underlying type checker */
	td->check_constraints = asn_DEF_INTEGER.check_constraints;
	return td->check_constraints(td, sptr, ctfailcb, app_key);
}

/*
 * This type is implemented using INTEGER,
 * so here we adjust the DEF accordingly.
 */
static void
CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_INTEGER.free_struct;
	td->print_struct   = asn_DEF_INTEGER.print_struct;
	td->ber_decoder    = asn_DEF_INTEGER.ber_decoder;
	td->der_encoder    = asn_DEF_INTEGER.der_encoder;
	td->xer_decoder    = asn_DEF_INTEGER.xer_decoder;
	td->xer_encoder    = asn_DEF_INTEGER.xer_encoder;
	td->uper_decoder   = asn_DEF_INTEGER.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_INTEGER.per_constraints;
	td->elements       = asn_DEF_INTEGER.elements;
	td->elements_count = asn_DEF_INTEGER.elements_count;
	td->specifics      = asn_DEF_INTEGER.specifics;
}

void
CN_IntegerEnumerated1_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
CN_IntegerEnumerated1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
CN_IntegerEnumerated1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
CN_IntegerEnumerated1_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
CN_IntegerEnumerated1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
CN_IntegerEnumerated1_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [CN-IntegerEnumerated1] >>> ***/

static ber_tlv_tag_t asn_DEF_CN_IntegerEnumerated1_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_CN_IntegerEnumerated1 = {
	"CN-IntegerEnumerated1",
	"CN-IntegerEnumerated1",
	CN_IntegerEnumerated1_free,
	CN_IntegerEnumerated1_print,
	CN_IntegerEnumerated1_constraint,
	CN_IntegerEnumerated1_decode_ber,
	CN_IntegerEnumerated1_encode_der,
	CN_IntegerEnumerated1_decode_xer,
	CN_IntegerEnumerated1_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_CN_IntegerEnumerated1_tags_1,
	sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1)
		/sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1[0]), /* 1 */
	asn_DEF_CN_IntegerEnumerated1_tags_1,	/* Same as above */
	sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1)
		/sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* Defined elsewhere */
	0	/* No specifics */
};


/*** <<< INCLUDES [NO-IntegerEnumerated2] >>> ***/

#include <INTEGER.h>

/*** <<< DEPS [NO-IntegerEnumerated2] >>> ***/

typedef enum NO_IntegerEnumerated2 {
	NO_IntegerEnumerated2_a	= 1,
	NO_IntegerEnumerated2_b	= 3000000000
} e_NO_IntegerEnumerated2;

/*** <<< TYPE-DECLS [NO-IntegerEnumerated2] >>> ***/

typedef INTEGER_t	 NO_IntegerEnumerated2_t;

/*** <<< FUNC-DECLS [NO-IntegerEnumerated2] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerEnumerated2;
asn_struct_free_f NO_IntegerEnumerated2_free;
asn_struct_print_f NO_IntegerEnumerated2_print;
asn_constr_check_f NO_IntegerEnumerated2_constraint;
ber_type_decoder_f NO_IntegerEnumerated2_decode_ber;
der_type_encoder_f NO_IntegerEnumerated2_encode_der;
xer_type_decoder_f NO_IntegerEnumerated2_decode_xer;
xer_type_encoder_f NO_IntegerEnumerated2_encode_xer;

/*** <<< CODE [NO-IntegerEnumerated2] >>> ***/

int
NO_IntegerEnumerated2_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	/* Replace with underlying type checker */
	td->check_constraints = asn_DEF_INTEGER.check_constraints;
	return td->check_constraints(td, sptr, ctfailcb, app_key);
}

/*
 * This type is implemented using INTEGER,
 * so here we adjust the DEF accordingly.
 */
static void
NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_INTEGER.free_struct;
	td->print_struct   = asn_DEF_INTEGER.print_struct;
	td->ber_decoder    = asn_DEF_INTEGER.ber_decoder;
	td->der_encoder    = asn_DEF_INTEGER.der_encoder;
	td->xer_decoder    = asn_DEF_INTEGER.xer_decoder;
	td->xer_encoder    = asn_DEF_INTEGER.xer_encoder;
	td->uper_decoder   = asn_DEF_INTEGER.uper_decoder;
	if(!td->per_constraints)
		td->per_constraints = asn_DEF_INTEGER.per_constraints;
	td->elements       = asn_DEF_INTEGER.elements;
	td->elements_count = asn_DEF_INTEGER.elements_count;
	td->specifics      = asn_DEF_INTEGER.specifics;
}

void
NO_IntegerEnumerated2_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
NO_IntegerEnumerated2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
NO_IntegerEnumerated2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
NO_IntegerEnumerated2_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
NO_IntegerEnumerated2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
NO_IntegerEnumerated2_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


/*** <<< STAT-DEFS [NO-IntegerEnumerated2] >>> ***/

static ber_tlv_tag_t asn_DEF_NO_IntegerEnumerated2_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_NO_IntegerEnumerated2 = {
	"NO-IntegerEnumerated2",
	"NO-IntegerEnumerated2",
	NO_IntegerEnumerated2_free,
	NO_IntegerEnumerated2_print,
	NO_IntegerEnumerated2_constraint,
	NO_IntegerEnumerated2_decode_ber,
	NO_IntegerEnumerated2_encode_der,
	NO_IntegerEnumerated2_decode_xer,
	NO_IntegerEnumerated2_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_NO_IntegerEnumerated2_tags_1,
	sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1)
		/sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1[0]), /* 1 */
	asn_DEF_NO_IntegerEnumerated2_tags_1,	/* Same as above */
	sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1)
		/sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* Defined elsewhere */
	0	/* No specifics */
};

