# This file contains dependency information for the asn1c compiler's skeletons.
# Feel free to edit this file.
# The format is like this:
# 	<filename> <dependent-file> ...
#

ANY.h ANY.c
OPEN_TYPE.h OPEN_TYPE.c constr_CHOICE.h
BMPString.h BMPString.c UTF8String.h
BOOLEAN.h BOOLEAN.c
ENUMERATED.h ENUMERATED.c INTEGER.h NativeEnumerated.h
GeneralString.h GeneralString.c
GeneralizedTime.h GeneralizedTime.c
GraphicString.h GraphicString.c
IA5String.h IA5String.c
INTEGER.h INTEGER.c
ISO646String.h ISO646String.c
NULL.h NULL.c BOOLEAN.h
NativeEnumerated.h NativeEnumerated.c NativeInteger.h
NativeInteger.h NativeInteger.c INTEGER.h
NativeReal.h NativeReal.c REAL.h
NumericString.h NumericString.c
OBJECT_IDENTIFIER.h OBJECT_IDENTIFIER.c INTEGER.h
ObjectDescriptor.h ObjectDescriptor.c GraphicString.h
PrintableString.h PrintableString.c
REAL.h REAL.c INTEGER.h
RELATIVE-OID.h RELATIVE-OID.c OBJECT_IDENTIFIER.h
T61String.h T61String.c
TeletexString.h TeletexString.c	
UTCTime.h UTCTime.c GeneralizedTime.h
UTF8String.h UTF8String.c
UniversalString.h UniversalString.c UTF8String.h
VideotexString.h VideotexString.c
VisibleString.h VisibleString.c
asn_SEQUENCE_OF.h asn_SEQUENCE_OF.c asn_SET_OF.h
asn_SET_OF.h asn_SET_OF.c
constr_CHOICE.h constr_CHOICE.c
constr_SEQUENCE.h constr_SEQUENCE.c OPEN_TYPE.h
constr_SEQUENCE_OF.h constr_SEQUENCE_OF.c asn_SEQUENCE_OF.h constr_SET_OF.h
constr_SET.h constr_SET.c
constr_SET_OF.h constr_SET_OF.c asn_SET_OF.h

COMMON-FILES:			# THIS IS A SPECIAL SECTION
asn_application.h asn_application.c		# Applications should include this file
asn_ioc.h			# Information Object Classes, runtime support
asn_system.h			# Platform-dependent types
asn_codecs.h			# Return types of encoders and decoders
asn_internal.h asn_internal.c			# Internal stuff
asn_random_fill.h asn_random_fill.c		# Initialize with a random value
asn_bit_data.h asn_bit_data.c         # Bit streaming support
OCTET_STRING.h OCTET_STRING.c	# This one is used too widely
BIT_STRING.h BIT_STRING.c	# This one is necessary for the above one
asn_codecs_prim.c asn_codecs_prim.h	# enc/decoders for primitive types
ber_tlv_length.h ber_tlv_length.c	# BER TLV L (length)
ber_tlv_tag.h ber_tlv_tag.c	# BER TLV T (tag)
ber_decoder.h ber_decoder.c	# BER decoder support code
der_encoder.h der_encoder.c	# DER encoder support code
constr_TYPE.h constr_TYPE.c	# Description of a type
constraints.h constraints.c	# Subtype constraints support
xer_support.h xer_support.c	# XML parsing
xer_decoder.h xer_decoder.c	# XER decoding support
xer_encoder.h xer_encoder.c	# XER encoding support
per_support.h per_support.c	# PER parsing
per_decoder.h per_decoder.c	# PER decoding support
per_encoder.h per_encoder.c	# PER encoding support
per_opentype.h per_opentype.c	# PER "open type" handling

CONVERTER:			# THIS IS A SPECIAL SECTION
converter-example.c		# A default name for the example transcoder

CODEC-OER:			# THIS IS A SPECIAL SECTION
oer_decoder.h
oer_encoder.h
oer_support.h
oer_decoder.h oer_decoder.c OPEN_TYPE.h
oer_encoder.h oer_encoder.c
oer_support.h oer_support.c
OPEN_TYPE.h OPEN_TYPE_oer.c constr_CHOICE.h
INTEGER.h INTEGER_oer.c
BIT_STRING.h BIT_STRING_oer.c OCTET_STRING_oer.c
NativeInteger.h NativeInteger_oer.c
NativeEnumerated.h NativeEnumerated_oer.c
constr_CHOICE.h constr_CHOICE_oer.c
constr_SEQUENCE.h constr_SEQUENCE_oer.c
constr_SET_OF.h constr_SET_OF_oer.c

CODEC-PER:			# THIS IS A SPECIAL SECTION
