// This C++ header file was generated by the TTCN-3 compiler
// of the TTCN-3 Test Executor version CRL 113 200/6 R6A
// for Lénárd Nagy (elnrnag@elx78355y6x) on Thu Oct 24 10:29:40 2019

// Copyright (c) 2000-2019 Ericsson Telecom AB

// Do not edit this file unless you know what you are doing.

#ifndef UnifiedDiagnosticServices_HH
#define UnifiedDiagnosticServices_HH

#ifdef TITAN_RUNTIME_2
#error Generated code does not match with used runtime.\
 Code was generated without -R option but -DTITAN_RUNTIME_2 was used.
#endif

/* Header file includes */

#include <TTCN3.hh>
#include "General_Types.hh"

#if TTCN3_VERSION != 60600
#error Version mismatch detected.\
 Please check the version of the TTCN-3 compiler and the base library.\
 Run make clean and rebuild the project if the version of the compiler changed recently.
#endif

#ifndef LINUX
#error This file should be compiled on LINUX
#endif

#undef UnifiedDiagnosticServices_HH
#endif

namespace UnifiedDiagnosticServices {

/* Forward declarations of classes */

class SuppressPosRspMsgIndicationBitType;
class SuppressPosRspMsgIndicationBitType_template;
class DefaultSessionRequest;
class DefaultSessionRequest_template;
class ProgrammingSessionRequest;
class ProgrammingSessionRequest_template;
class ExtendedDiagnosticSessionRequest;
class ExtendedDiagnosticSessionRequest_template;
class SafetySystemDiagnosticSessionRequest;
class SafetySystemDiagnosticSessionRequest_template;
class DiagnosticSessionRequestType;
class DiagnosticSessionRequestType_template;
class DiagnosticSessionControlRequestSID;
class DiagnosticSessionControlRequestSID_template;
class DiagnosticSessionResponseType;
class DiagnosticSessionResponseType_template;
class DefaultSessionResponse;
class DefaultSessionResponse_template;
class ProgrammingSessionResponse;
class ProgrammingSessionResponse_template;
class ExtendedDiagnosticSessionResponse;
class ExtendedDiagnosticSessionResponse_template;
class SafetySystemDiagnosticSessionResponse;
class SafetySystemDiagnosticSessionResponse_template;
class DiagnosticSessionControlResponseSID;
class DiagnosticSessionControlResponseSID_template;
class HardResetRequest;
class HardResetRequest_template;
class KeyOffOnResetRequest;
class KeyOffOnResetRequest_template;
class SoftResetRequest;
class SoftResetRequest_template;
class EnableRapidPowerShutDownRequest;
class EnableRapidPowerShutDownRequest_template;
class DisableRapidPowerShutDownRequest;
class DisableRapidPowerShutDownRequest_template;
class ECUResetRequestType;
class ECUResetRequestType_template;
class HardResetResponse;
class HardResetResponse_template;
class KeyOffOnResetResponse;
class KeyOffOnResetResponse_template;
class SoftResetResponse;
class SoftResetResponse_template;
class EnableRapidPowerShutDownResponse;
class EnableRapidPowerShutDownResponse_template;
class DisableRapidPowerShutDownResponse;
class DisableRapidPowerShutDownResponse_template;
class ECUResetResponseType;
class ECUResetResponseType_template;
class ECUResetRequestSID;
class ECUResetRequestSID_template;
class ECUResetResponseSID;
class ECUResetResponseSID_template;
class RequestSeedRequest0;
class RequestSeedRequest0_template;
class SendKeyRequest0;
class SendKeyRequest0_template;
class RequestSeedRequest1;
class RequestSeedRequest1_template;
class SendKeyRequest1;
class SendKeyRequest1_template;
class SecurityAccessRequestType;
class SecurityAccessRequestType_template;
class SecurityAccessRequestSID;
class SecurityAccessRequestSID_template;
class RequestSeedResponse0;
class RequestSeedResponse0_template;
class SendKeyResponse0;
class SendKeyResponse0_template;
class RequestSeedResponse1;
class RequestSeedResponse1_template;
class SendKeyResponse1;
class SendKeyResponse1_template;
class SecurityAccessResponseType;
class SecurityAccessResponseType_template;
class SecurityAccessResponseSID;
class SecurityAccessResponseSID_template;
class e__ControlType;
class e__ControlType_template;
class e__DisableEnable;
class e__DisableEnable_template;
class e__CommunicationMessages;
class e__CommunicationMessages_template;
class CommunicationType;
class CommunicationType_template;
class EnableRxAndTxRequest;
class EnableRxAndTxRequest_template;
class EnableRxAndDisableTxRequest;
class EnableRxAndDisableTxRequest_template;
class DisableRxAndEnableTxRequest;
class DisableRxAndEnableTxRequest_template;
class DisableRxAndTxRequest;
class DisableRxAndTxRequest_template;
class EnableRxAndDisableTxWithEnhancedAddressInformationRequest;
class EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template;
class EnableRxAndTxWithEnhancedAddressInformationRequest;
class EnableRxAndTxWithEnhancedAddressInformationRequest_template;
class CommunicationControlRequestType;
class CommunicationControlRequestType_template;
class CommunicationControlRequestSID;
class CommunicationControlRequestSID_template;
class CommunicationControlResponseSID;
class CommunicationControlResponseSID_template;
class TesterPresentRequestSID;
class TesterPresentRequestSID_template;
class TesterPresentResponseSID;
class TesterPresentResponseSID_template;
class ReadDataByIdentifierRequest1;
class ReadDataByIdentifierRequest1_template;
class ReadDataByIdentifierRequest2;
class ReadDataByIdentifierRequest2_template;
class ReadDataByIdentifierRequest3;
class ReadDataByIdentifierRequest3_template;
class ReadDataByIdentifierRequest;
class ReadDataByIdentifierRequest_template;
class ReadDataByIdentifierRequestSID;
class ReadDataByIdentifierRequestSID_template;
class ReadDataByIdentifierResponse1;
class ReadDataByIdentifierResponse1_template;
class ReadDataByIdentifierResponse2;
class ReadDataByIdentifierResponse2_template;
class ReadDataByIdentifierResponse3;
class ReadDataByIdentifierResponse3_template;
class ReadDataByIdentifierResponse;
class ReadDataByIdentifierResponse_template;
class ReadDataByIdentifierResponseSID;
class ReadDataByIdentifierResponseSID_template;
class WriteDataByIdentifierRequest1;
class WriteDataByIdentifierRequest1_template;
class WriteDataByIdentifierRequest2;
class WriteDataByIdentifierRequest2_template;
class WriteDataByIdentifierRequest3;
class WriteDataByIdentifierRequest3_template;
class WriteDataByIdentifierRequest;
class WriteDataByIdentifierRequest_template;
class WriteDataByIdentifierRequestSID;
class WriteDataByIdentifierRequestSID_template;
class WriteDataByIdentifierResponse1;
class WriteDataByIdentifierResponse1_template;
class WriteDataByIdentifierResponse2;
class WriteDataByIdentifierResponse2_template;
class WriteDataByIdentifierResponse3;
class WriteDataByIdentifierResponse3_template;
class WriteDataByIdentifierResponse;
class WriteDataByIdentifierResponse_template;
class WriteDataByIdentifierResponseSID;
class WriteDataByIdentifierResponseSID_template;
class e__RequestSID;
class e__RequestSID_template;
class e__ResponseCode;
class e__ResponseCode_template;
class NegativeResponseCodeSID;
class NegativeResponseCodeSID_template;
class TopLevelMessage__UDS__requests;
class TopLevelMessage__UDS__requests_template;
class TopLevelMessage__UDS__responses;
class TopLevelMessage__UDS__responses_template;

} /* end of namespace */

#ifndef UnifiedDiagnosticServices_HH
#define UnifiedDiagnosticServices_HH

namespace UnifiedDiagnosticServices {

/* Type definitions */

typedef OCTETSTRING SID;
typedef OCTETSTRING_template SID_template;
typedef BITSTRING DiagnosticSessionType;
typedef BITSTRING_template DiagnosticSessionType_template;
typedef BITSTRING ResetType;
typedef BITSTRING_template ResetType_template;
typedef OCTETSTRING PowerDownTime;
typedef OCTETSTRING_template PowerDownTime_template;
typedef BITSTRING SecurityAccessType;
typedef BITSTRING_template SecurityAccessType_template;
typedef BITSTRING ControlType;
typedef BITSTRING_template ControlType_template;
typedef OCTETSTRING NodeIdentificationNumber;
typedef OCTETSTRING_template NodeIdentificationNumber_template;
typedef OCTETSTRING ServiceIdentifier;
typedef OCTETSTRING_template ServiceIdentifier_template;

/* Class definitions */

class SuppressPosRspMsgIndicationBitType : public Base_Type { // enum
friend class SuppressPosRspMsgIndicationBitType_template;
public:
enum enum_type { doNotsuppresssPos = 0, suppresssPos = 1, UNKNOWN_VALUE = 2, UNBOUND_VALUE = 3 };
private:
enum_type enum_value;

public:
SuppressPosRspMsgIndicationBitType();
SuppressPosRspMsgIndicationBitType(int other_value);
SuppressPosRspMsgIndicationBitType(enum_type other_value);
SuppressPosRspMsgIndicationBitType(const SuppressPosRspMsgIndicationBitType& other_value);

SuppressPosRspMsgIndicationBitType& operator=(int other_value);
SuppressPosRspMsgIndicationBitType& operator=(enum_type other_value);
SuppressPosRspMsgIndicationBitType& operator=(const SuppressPosRspMsgIndicationBitType& other_value);

boolean operator==(enum_type other_value) const;
boolean operator==(const SuppressPosRspMsgIndicationBitType& other_value) const;
inline boolean operator!=(enum_type other_value) const { return !(*this == other_value); }
inline boolean operator!=(const SuppressPosRspMsgIndicationBitType& other_value) const { return !(*this == other_value); }
boolean operator<(enum_type other_value) const;
boolean operator<(const SuppressPosRspMsgIndicationBitType& other_value) const;
boolean operator>(enum_type other_value) const;
boolean operator>(const SuppressPosRspMsgIndicationBitType& other_value) const;
inline boolean operator<=(enum_type other_value) const { return !(*this > other_value); }
inline boolean operator<=(const SuppressPosRspMsgIndicationBitType& other_value) const { return !(*this > other_value); }
inline boolean operator>=(enum_type other_value) const { return !(*this < other_value); }
inline boolean operator>=(const SuppressPosRspMsgIndicationBitType& other_value) const { return !(*this < other_value); }

static const char *enum_to_str(enum_type enum_par);
static enum_type str_to_enum(const char *str_par);
static boolean is_valid_enum(int int_par);

static int enum2int(enum_type enum_par);
static int enum2int(const SuppressPosRspMsgIndicationBitType& enum_par);
int as_int() const { return enum2int(enum_value); }
void from_int(int p_val) { *this = p_val; }
void int2enum(int int_val);
operator enum_type() const;
inline boolean is_bound() const { return enum_value != UNBOUND_VALUE; }
inline boolean is_value() const { return enum_value != UNBOUND_VALUE; }
inline void clean_up(){ enum_value = UNBOUND_VALUE; }
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class SuppressPosRspMsgIndicationBitType_template : public Base_Template {
union {
SuppressPosRspMsgIndicationBitType::enum_type single_value;
struct {
unsigned int n_values;
SuppressPosRspMsgIndicationBitType_template *list_value;
} value_list;
};

void copy_template(const SuppressPosRspMsgIndicationBitType_template& other_value);

public:
SuppressPosRspMsgIndicationBitType_template();
SuppressPosRspMsgIndicationBitType_template(template_sel other_value);
SuppressPosRspMsgIndicationBitType_template(int other_value);
SuppressPosRspMsgIndicationBitType_template(SuppressPosRspMsgIndicationBitType::enum_type other_value);
SuppressPosRspMsgIndicationBitType_template(const SuppressPosRspMsgIndicationBitType& other_value);
SuppressPosRspMsgIndicationBitType_template(const OPTIONAL<SuppressPosRspMsgIndicationBitType>& other_value);
SuppressPosRspMsgIndicationBitType_template(const SuppressPosRspMsgIndicationBitType_template& other_value);
~SuppressPosRspMsgIndicationBitType_template();

boolean is_bound() const;
boolean is_value() const;
void clean_up();
SuppressPosRspMsgIndicationBitType_template& operator=(template_sel other_value);
SuppressPosRspMsgIndicationBitType_template& operator=(int other_value);
SuppressPosRspMsgIndicationBitType_template& operator=(SuppressPosRspMsgIndicationBitType::enum_type other_value);
SuppressPosRspMsgIndicationBitType_template& operator=(const SuppressPosRspMsgIndicationBitType& other_value);
SuppressPosRspMsgIndicationBitType_template& operator=(const OPTIONAL<SuppressPosRspMsgIndicationBitType>& other_value);
SuppressPosRspMsgIndicationBitType_template& operator=(const SuppressPosRspMsgIndicationBitType_template& other_value);

boolean match(SuppressPosRspMsgIndicationBitType::enum_type other_value, boolean legacy = FALSE) const;
boolean match(const SuppressPosRspMsgIndicationBitType& other_value, boolean legacy = FALSE) const;
SuppressPosRspMsgIndicationBitType::enum_type valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
SuppressPosRspMsgIndicationBitType_template& list_item(unsigned int list_index);
void log() const;
void log_match(const SuppressPosRspMsgIndicationBitType& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class DefaultSessionRequest : public Base_Type {
  BITSTRING field_diagnosticSessionType;
public:
  DefaultSessionRequest();
  DefaultSessionRequest(const BITSTRING& par_diagnosticSessionType);
  DefaultSessionRequest(const DefaultSessionRequest& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  DefaultSessionRequest& operator=(const DefaultSessionRequest& other_value);
  boolean operator==(const DefaultSessionRequest& other_value) const;
  inline boolean operator!=(const DefaultSessionRequest& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& diagnosticSessionType()
    {return field_diagnosticSessionType;}
  inline const BITSTRING& diagnosticSessionType() const
    {return field_diagnosticSessionType;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class DefaultSessionRequest_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
DefaultSessionRequest_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const DefaultSessionRequest& other_value);
void copy_template(const DefaultSessionRequest_template& other_value);

public:
DefaultSessionRequest_template();
DefaultSessionRequest_template(template_sel other_value);
DefaultSessionRequest_template(const DefaultSessionRequest& other_value);
DefaultSessionRequest_template(const OPTIONAL<DefaultSessionRequest>& other_value);
DefaultSessionRequest_template(const DefaultSessionRequest_template& other_value);
~DefaultSessionRequest_template();
DefaultSessionRequest_template& operator=(template_sel other_value);
DefaultSessionRequest_template& operator=(const DefaultSessionRequest& other_value);
DefaultSessionRequest_template& operator=(const OPTIONAL<DefaultSessionRequest>& other_value);
DefaultSessionRequest_template& operator=(const DefaultSessionRequest_template& other_value);
boolean match(const DefaultSessionRequest& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
DefaultSessionRequest valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
DefaultSessionRequest_template& list_item(unsigned int list_index) const;
BITSTRING_template& diagnosticSessionType();
const BITSTRING_template& diagnosticSessionType() const;
int size_of() const;
void log() const;
void log_match(const DefaultSessionRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class ProgrammingSessionRequest : public Base_Type {
  BITSTRING field_diagnosticSessionType;
public:
  ProgrammingSessionRequest();
  ProgrammingSessionRequest(const BITSTRING& par_diagnosticSessionType);
  ProgrammingSessionRequest(const ProgrammingSessionRequest& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  ProgrammingSessionRequest& operator=(const ProgrammingSessionRequest& other_value);
  boolean operator==(const ProgrammingSessionRequest& other_value) const;
  inline boolean operator!=(const ProgrammingSessionRequest& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& diagnosticSessionType()
    {return field_diagnosticSessionType;}
  inline const BITSTRING& diagnosticSessionType() const
    {return field_diagnosticSessionType;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ProgrammingSessionRequest_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
ProgrammingSessionRequest_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const ProgrammingSessionRequest& other_value);
void copy_template(const ProgrammingSessionRequest_template& other_value);

public:
ProgrammingSessionRequest_template();
ProgrammingSessionRequest_template(template_sel other_value);
ProgrammingSessionRequest_template(const ProgrammingSessionRequest& other_value);
ProgrammingSessionRequest_template(const OPTIONAL<ProgrammingSessionRequest>& other_value);
ProgrammingSessionRequest_template(const ProgrammingSessionRequest_template& other_value);
~ProgrammingSessionRequest_template();
ProgrammingSessionRequest_template& operator=(template_sel other_value);
ProgrammingSessionRequest_template& operator=(const ProgrammingSessionRequest& other_value);
ProgrammingSessionRequest_template& operator=(const OPTIONAL<ProgrammingSessionRequest>& other_value);
ProgrammingSessionRequest_template& operator=(const ProgrammingSessionRequest_template& other_value);
boolean match(const ProgrammingSessionRequest& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
ProgrammingSessionRequest valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
ProgrammingSessionRequest_template& list_item(unsigned int list_index) const;
BITSTRING_template& diagnosticSessionType();
const BITSTRING_template& diagnosticSessionType() const;
int size_of() const;
void log() const;
void log_match(const ProgrammingSessionRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class ExtendedDiagnosticSessionRequest : public Base_Type {
  BITSTRING field_diagnosticSessionType;
public:
  ExtendedDiagnosticSessionRequest();
  ExtendedDiagnosticSessionRequest(const BITSTRING& par_diagnosticSessionType);
  ExtendedDiagnosticSessionRequest(const ExtendedDiagnosticSessionRequest& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  ExtendedDiagnosticSessionRequest& operator=(const ExtendedDiagnosticSessionRequest& other_value);
  boolean operator==(const ExtendedDiagnosticSessionRequest& other_value) const;
  inline boolean operator!=(const ExtendedDiagnosticSessionRequest& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& diagnosticSessionType()
    {return field_diagnosticSessionType;}
  inline const BITSTRING& diagnosticSessionType() const
    {return field_diagnosticSessionType;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ExtendedDiagnosticSessionRequest_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
ExtendedDiagnosticSessionRequest_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const ExtendedDiagnosticSessionRequest& other_value);
void copy_template(const ExtendedDiagnosticSessionRequest_template& other_value);

public:
ExtendedDiagnosticSessionRequest_template();
ExtendedDiagnosticSessionRequest_template(template_sel other_value);
ExtendedDiagnosticSessionRequest_template(const ExtendedDiagnosticSessionRequest& other_value);
ExtendedDiagnosticSessionRequest_template(const OPTIONAL<ExtendedDiagnosticSessionRequest>& other_value);
ExtendedDiagnosticSessionRequest_template(const ExtendedDiagnosticSessionRequest_template& other_value);
~ExtendedDiagnosticSessionRequest_template();
ExtendedDiagnosticSessionRequest_template& operator=(template_sel other_value);
ExtendedDiagnosticSessionRequest_template& operator=(const ExtendedDiagnosticSessionRequest& other_value);
ExtendedDiagnosticSessionRequest_template& operator=(const OPTIONAL<ExtendedDiagnosticSessionRequest>& other_value);
ExtendedDiagnosticSessionRequest_template& operator=(const ExtendedDiagnosticSessionRequest_template& other_value);
boolean match(const ExtendedDiagnosticSessionRequest& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
ExtendedDiagnosticSessionRequest valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
ExtendedDiagnosticSessionRequest_template& list_item(unsigned int list_index) const;
BITSTRING_template& diagnosticSessionType();
const BITSTRING_template& diagnosticSessionType() const;
int size_of() const;
void log() const;
void log_match(const ExtendedDiagnosticSessionRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class SafetySystemDiagnosticSessionRequest : public Base_Type {
  BITSTRING field_diagnosticSessionType;
public:
  SafetySystemDiagnosticSessionRequest();
  SafetySystemDiagnosticSessionRequest(const BITSTRING& par_diagnosticSessionType);
  SafetySystemDiagnosticSessionRequest(const SafetySystemDiagnosticSessionRequest& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  SafetySystemDiagnosticSessionRequest& operator=(const SafetySystemDiagnosticSessionRequest& other_value);
  boolean operator==(const SafetySystemDiagnosticSessionRequest& other_value) const;
  inline boolean operator!=(const SafetySystemDiagnosticSessionRequest& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& diagnosticSessionType()
    {return field_diagnosticSessionType;}
  inline const BITSTRING& diagnosticSessionType() const
    {return field_diagnosticSessionType;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class SafetySystemDiagnosticSessionRequest_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
SafetySystemDiagnosticSessionRequest_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const SafetySystemDiagnosticSessionRequest& other_value);
void copy_template(const SafetySystemDiagnosticSessionRequest_template& other_value);

public:
SafetySystemDiagnosticSessionRequest_template();
SafetySystemDiagnosticSessionRequest_template(template_sel other_value);
SafetySystemDiagnosticSessionRequest_template(const SafetySystemDiagnosticSessionRequest& other_value);
SafetySystemDiagnosticSessionRequest_template(const OPTIONAL<SafetySystemDiagnosticSessionRequest>& other_value);
SafetySystemDiagnosticSessionRequest_template(const SafetySystemDiagnosticSessionRequest_template& other_value);
~SafetySystemDiagnosticSessionRequest_template();
SafetySystemDiagnosticSessionRequest_template& operator=(template_sel other_value);
SafetySystemDiagnosticSessionRequest_template& operator=(const SafetySystemDiagnosticSessionRequest& other_value);
SafetySystemDiagnosticSessionRequest_template& operator=(const OPTIONAL<SafetySystemDiagnosticSessionRequest>& other_value);
SafetySystemDiagnosticSessionRequest_template& operator=(const SafetySystemDiagnosticSessionRequest_template& other_value);
boolean match(const SafetySystemDiagnosticSessionRequest& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
SafetySystemDiagnosticSessionRequest valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
SafetySystemDiagnosticSessionRequest_template& list_item(unsigned int list_index) const;
BITSTRING_template& diagnosticSessionType();
const BITSTRING_template& diagnosticSessionType() const;
int size_of() const;
void log() const;
void log_match(const SafetySystemDiagnosticSessionRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class DiagnosticSessionRequestType : public Base_Type {
public:
enum union_selection_type { UNBOUND_VALUE = 0, ALT_defaultSession = 1, ALT_programmingSession = 2, ALT_extendedDiagnosticSession = 3, ALT_safetySystemDiagnosticSession = 4 };
private:
union_selection_type union_selection;
union {
DefaultSessionRequest *field_defaultSession;
ProgrammingSessionRequest *field_programmingSession;
ExtendedDiagnosticSessionRequest *field_extendedDiagnosticSession;
SafetySystemDiagnosticSessionRequest *field_safetySystemDiagnosticSession;
};
void copy_value(const DiagnosticSessionRequestType& other_value);

public:
DiagnosticSessionRequestType();
DiagnosticSessionRequestType(const DiagnosticSessionRequestType& other_value);
~DiagnosticSessionRequestType();
DiagnosticSessionRequestType& operator=(const DiagnosticSessionRequestType& other_value);
boolean operator==(const DiagnosticSessionRequestType& other_value) const;
inline boolean operator!=(const DiagnosticSessionRequestType& other_value) const { return !(*this == other_value); }
DefaultSessionRequest& defaultSession();
const DefaultSessionRequest& defaultSession() const;
ProgrammingSessionRequest& programmingSession();
const ProgrammingSessionRequest& programmingSession() const;
ExtendedDiagnosticSessionRequest& extendedDiagnosticSession();
const ExtendedDiagnosticSessionRequest& extendedDiagnosticSession() const;
SafetySystemDiagnosticSessionRequest& safetySystemDiagnosticSession();
const SafetySystemDiagnosticSessionRequest& safetySystemDiagnosticSession() const;
inline union_selection_type get_selection() const { return union_selection; }
boolean ischosen(union_selection_type checked_selection) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
  void set_implicit_omit();
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class DiagnosticSessionRequestType_template : public Base_Template {
union {
struct {
DiagnosticSessionRequestType::union_selection_type union_selection;
union {
DefaultSessionRequest_template *field_defaultSession;
ProgrammingSessionRequest_template *field_programmingSession;
ExtendedDiagnosticSessionRequest_template *field_extendedDiagnosticSession;
SafetySystemDiagnosticSessionRequest_template *field_safetySystemDiagnosticSession;
};
} single_value;
struct {
unsigned int n_values;
DiagnosticSessionRequestType_template *list_value;
} value_list;
};
void copy_value(const DiagnosticSessionRequestType& other_value);

void copy_template(const DiagnosticSessionRequestType_template& other_value);

public:
DiagnosticSessionRequestType_template();
DiagnosticSessionRequestType_template(template_sel other_value);
DiagnosticSessionRequestType_template(const DiagnosticSessionRequestType& other_value);
DiagnosticSessionRequestType_template(const OPTIONAL<DiagnosticSessionRequestType>& other_value);
DiagnosticSessionRequestType_template(const DiagnosticSessionRequestType_template& other_value);
~DiagnosticSessionRequestType_template();
void clean_up();
DiagnosticSessionRequestType_template& operator=(template_sel other_value);
DiagnosticSessionRequestType_template& operator=(const DiagnosticSessionRequestType& other_value);
DiagnosticSessionRequestType_template& operator=(const OPTIONAL<DiagnosticSessionRequestType>& other_value);
DiagnosticSessionRequestType_template& operator=(const DiagnosticSessionRequestType_template& other_value);
boolean match(const DiagnosticSessionRequestType& other_value, boolean legacy = FALSE) const;
boolean is_value() const;DiagnosticSessionRequestType valueof() const;
DiagnosticSessionRequestType_template& list_item(unsigned int list_index) const;
void set_type(template_sel template_type, unsigned int list_length);
DefaultSessionRequest_template& defaultSession();
const DefaultSessionRequest_template& defaultSession() const;
ProgrammingSessionRequest_template& programmingSession();
const ProgrammingSessionRequest_template& programmingSession() const;
ExtendedDiagnosticSessionRequest_template& extendedDiagnosticSession();
const ExtendedDiagnosticSessionRequest_template& extendedDiagnosticSession() const;
SafetySystemDiagnosticSessionRequest_template& safetySystemDiagnosticSession();
const SafetySystemDiagnosticSessionRequest_template& safetySystemDiagnosticSession() const;
boolean ischosen(DiagnosticSessionRequestType::union_selection_type checked_selection) const;
void log() const;
void log_match(const DiagnosticSessionRequestType& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class DiagnosticSessionControlRequestSID : public Base_Type {
  OCTETSTRING field_sid;
  SuppressPosRspMsgIndicationBitType field_suppressPosRspMsgIndicationBit;
  DiagnosticSessionRequestType field_diagnosticSessionType;
public:
  DiagnosticSessionControlRequestSID();
  DiagnosticSessionControlRequestSID(const OCTETSTRING& par_sid,
    const SuppressPosRspMsgIndicationBitType& par_suppressPosRspMsgIndicationBit,
    const DiagnosticSessionRequestType& par_diagnosticSessionType);
  DiagnosticSessionControlRequestSID(const DiagnosticSessionControlRequestSID& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  DiagnosticSessionControlRequestSID& operator=(const DiagnosticSessionControlRequestSID& other_value);
  boolean operator==(const DiagnosticSessionControlRequestSID& other_value) const;
  inline boolean operator!=(const DiagnosticSessionControlRequestSID& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& sid()
    {return field_sid;}
  inline const OCTETSTRING& sid() const
    {return field_sid;}
  inline SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit()
    {return field_suppressPosRspMsgIndicationBit;}
  inline const SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit() const
    {return field_suppressPosRspMsgIndicationBit;}
  inline DiagnosticSessionRequestType& diagnosticSessionType()
    {return field_diagnosticSessionType;}
  inline const DiagnosticSessionRequestType& diagnosticSessionType() const
    {return field_diagnosticSessionType;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class DiagnosticSessionControlRequestSID_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
DiagnosticSessionControlRequestSID_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const DiagnosticSessionControlRequestSID& other_value);
void copy_template(const DiagnosticSessionControlRequestSID_template& other_value);

public:
DiagnosticSessionControlRequestSID_template();
DiagnosticSessionControlRequestSID_template(template_sel other_value);
DiagnosticSessionControlRequestSID_template(const DiagnosticSessionControlRequestSID& other_value);
DiagnosticSessionControlRequestSID_template(const OPTIONAL<DiagnosticSessionControlRequestSID>& other_value);
DiagnosticSessionControlRequestSID_template(const DiagnosticSessionControlRequestSID_template& other_value);
~DiagnosticSessionControlRequestSID_template();
DiagnosticSessionControlRequestSID_template& operator=(template_sel other_value);
DiagnosticSessionControlRequestSID_template& operator=(const DiagnosticSessionControlRequestSID& other_value);
DiagnosticSessionControlRequestSID_template& operator=(const OPTIONAL<DiagnosticSessionControlRequestSID>& other_value);
DiagnosticSessionControlRequestSID_template& operator=(const DiagnosticSessionControlRequestSID_template& other_value);
boolean match(const DiagnosticSessionControlRequestSID& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
DiagnosticSessionControlRequestSID valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
DiagnosticSessionControlRequestSID_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& sid();
const OCTETSTRING_template& sid() const;
SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit();
const SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit() const;
DiagnosticSessionRequestType_template& diagnosticSessionType();
const DiagnosticSessionRequestType_template& diagnosticSessionType() const;
int size_of() const;
void log() const;
void log_match(const DiagnosticSessionControlRequestSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class DiagnosticSessionResponseType : public Base_Type {
public:
enum union_selection_type { UNBOUND_VALUE = 0, ALT_defaultSession = 1, ALT_programmingSession = 2, ALT_extendedDiagnosticSession = 3, ALT_safetySystemDiagnosticSession = 4 };
private:
union_selection_type union_selection;
union {
DefaultSessionResponse *field_defaultSession;
ProgrammingSessionResponse *field_programmingSession;
ExtendedDiagnosticSessionResponse *field_extendedDiagnosticSession;
SafetySystemDiagnosticSessionResponse *field_safetySystemDiagnosticSession;
};
void copy_value(const DiagnosticSessionResponseType& other_value);

public:
DiagnosticSessionResponseType();
DiagnosticSessionResponseType(const DiagnosticSessionResponseType& other_value);
~DiagnosticSessionResponseType();
DiagnosticSessionResponseType& operator=(const DiagnosticSessionResponseType& other_value);
boolean operator==(const DiagnosticSessionResponseType& other_value) const;
inline boolean operator!=(const DiagnosticSessionResponseType& other_value) const { return !(*this == other_value); }
DefaultSessionResponse& defaultSession();
const DefaultSessionResponse& defaultSession() const;
ProgrammingSessionResponse& programmingSession();
const ProgrammingSessionResponse& programmingSession() const;
ExtendedDiagnosticSessionResponse& extendedDiagnosticSession();
const ExtendedDiagnosticSessionResponse& extendedDiagnosticSession() const;
SafetySystemDiagnosticSessionResponse& safetySystemDiagnosticSession();
const SafetySystemDiagnosticSessionResponse& safetySystemDiagnosticSession() const;
inline union_selection_type get_selection() const { return union_selection; }
boolean ischosen(union_selection_type checked_selection) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
  void set_implicit_omit();
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class DiagnosticSessionResponseType_template : public Base_Template {
union {
struct {
DiagnosticSessionResponseType::union_selection_type union_selection;
union {
DefaultSessionResponse_template *field_defaultSession;
ProgrammingSessionResponse_template *field_programmingSession;
ExtendedDiagnosticSessionResponse_template *field_extendedDiagnosticSession;
SafetySystemDiagnosticSessionResponse_template *field_safetySystemDiagnosticSession;
};
} single_value;
struct {
unsigned int n_values;
DiagnosticSessionResponseType_template *list_value;
} value_list;
};
void copy_value(const DiagnosticSessionResponseType& other_value);

void copy_template(const DiagnosticSessionResponseType_template& other_value);

public:
DiagnosticSessionResponseType_template();
DiagnosticSessionResponseType_template(template_sel other_value);
DiagnosticSessionResponseType_template(const DiagnosticSessionResponseType& other_value);
DiagnosticSessionResponseType_template(const OPTIONAL<DiagnosticSessionResponseType>& other_value);
DiagnosticSessionResponseType_template(const DiagnosticSessionResponseType_template& other_value);
~DiagnosticSessionResponseType_template();
void clean_up();
DiagnosticSessionResponseType_template& operator=(template_sel other_value);
DiagnosticSessionResponseType_template& operator=(const DiagnosticSessionResponseType& other_value);
DiagnosticSessionResponseType_template& operator=(const OPTIONAL<DiagnosticSessionResponseType>& other_value);
DiagnosticSessionResponseType_template& operator=(const DiagnosticSessionResponseType_template& other_value);
boolean match(const DiagnosticSessionResponseType& other_value, boolean legacy = FALSE) const;
boolean is_value() const;DiagnosticSessionResponseType valueof() const;
DiagnosticSessionResponseType_template& list_item(unsigned int list_index) const;
void set_type(template_sel template_type, unsigned int list_length);
DefaultSessionResponse_template& defaultSession();
const DefaultSessionResponse_template& defaultSession() const;
ProgrammingSessionResponse_template& programmingSession();
const ProgrammingSessionResponse_template& programmingSession() const;
ExtendedDiagnosticSessionResponse_template& extendedDiagnosticSession();
const ExtendedDiagnosticSessionResponse_template& extendedDiagnosticSession() const;
SafetySystemDiagnosticSessionResponse_template& safetySystemDiagnosticSession();
const SafetySystemDiagnosticSessionResponse_template& safetySystemDiagnosticSession() const;
boolean ischosen(DiagnosticSessionResponseType::union_selection_type checked_selection) const;
void log() const;
void log_match(const DiagnosticSessionResponseType& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class DefaultSessionResponse : public Base_Type {
  BITSTRING field_diagnosticSessionType;
  OCTETSTRING field_p2ServerMax;
  OCTETSTRING field_p2StarServerMax;
public:
  DefaultSessionResponse();
  DefaultSessionResponse(const BITSTRING& par_diagnosticSessionType,
    const OCTETSTRING& par_p2ServerMax,
    const OCTETSTRING& par_p2StarServerMax);
  DefaultSessionResponse(const DefaultSessionResponse& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  DefaultSessionResponse& operator=(const DefaultSessionResponse& other_value);
  boolean operator==(const DefaultSessionResponse& other_value) const;
  inline boolean operator!=(const DefaultSessionResponse& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& diagnosticSessionType()
    {return field_diagnosticSessionType;}
  inline const BITSTRING& diagnosticSessionType() const
    {return field_diagnosticSessionType;}
  inline OCTETSTRING& p2ServerMax()
    {return field_p2ServerMax;}
  inline const OCTETSTRING& p2ServerMax() const
    {return field_p2ServerMax;}
  inline OCTETSTRING& p2StarServerMax()
    {return field_p2StarServerMax;}
  inline const OCTETSTRING& p2StarServerMax() const
    {return field_p2StarServerMax;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class DefaultSessionResponse_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
DefaultSessionResponse_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const DefaultSessionResponse& other_value);
void copy_template(const DefaultSessionResponse_template& other_value);

public:
DefaultSessionResponse_template();
DefaultSessionResponse_template(template_sel other_value);
DefaultSessionResponse_template(const DefaultSessionResponse& other_value);
DefaultSessionResponse_template(const OPTIONAL<DefaultSessionResponse>& other_value);
DefaultSessionResponse_template(const DefaultSessionResponse_template& other_value);
~DefaultSessionResponse_template();
DefaultSessionResponse_template& operator=(template_sel other_value);
DefaultSessionResponse_template& operator=(const DefaultSessionResponse& other_value);
DefaultSessionResponse_template& operator=(const OPTIONAL<DefaultSessionResponse>& other_value);
DefaultSessionResponse_template& operator=(const DefaultSessionResponse_template& other_value);
boolean match(const DefaultSessionResponse& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
DefaultSessionResponse valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
DefaultSessionResponse_template& list_item(unsigned int list_index) const;
BITSTRING_template& diagnosticSessionType();
const BITSTRING_template& diagnosticSessionType() const;
OCTETSTRING_template& p2ServerMax();
const OCTETSTRING_template& p2ServerMax() const;
OCTETSTRING_template& p2StarServerMax();
const OCTETSTRING_template& p2StarServerMax() const;
int size_of() const;
void log() const;
void log_match(const DefaultSessionResponse& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class ProgrammingSessionResponse : public Base_Type {
  BITSTRING field_diagnosticSessionType;
  OCTETSTRING field_p2ServerMax;
  OCTETSTRING field_p2StarServerMax;
public:
  ProgrammingSessionResponse();
  ProgrammingSessionResponse(const BITSTRING& par_diagnosticSessionType,
    const OCTETSTRING& par_p2ServerMax,
    const OCTETSTRING& par_p2StarServerMax);
  ProgrammingSessionResponse(const ProgrammingSessionResponse& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  ProgrammingSessionResponse& operator=(const ProgrammingSessionResponse& other_value);
  boolean operator==(const ProgrammingSessionResponse& other_value) const;
  inline boolean operator!=(const ProgrammingSessionResponse& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& diagnosticSessionType()
    {return field_diagnosticSessionType;}
  inline const BITSTRING& diagnosticSessionType() const
    {return field_diagnosticSessionType;}
  inline OCTETSTRING& p2ServerMax()
    {return field_p2ServerMax;}
  inline const OCTETSTRING& p2ServerMax() const
    {return field_p2ServerMax;}
  inline OCTETSTRING& p2StarServerMax()
    {return field_p2StarServerMax;}
  inline const OCTETSTRING& p2StarServerMax() const
    {return field_p2StarServerMax;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ProgrammingSessionResponse_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
ProgrammingSessionResponse_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const ProgrammingSessionResponse& other_value);
void copy_template(const ProgrammingSessionResponse_template& other_value);

public:
ProgrammingSessionResponse_template();
ProgrammingSessionResponse_template(template_sel other_value);
ProgrammingSessionResponse_template(const ProgrammingSessionResponse& other_value);
ProgrammingSessionResponse_template(const OPTIONAL<ProgrammingSessionResponse>& other_value);
ProgrammingSessionResponse_template(const ProgrammingSessionResponse_template& other_value);
~ProgrammingSessionResponse_template();
ProgrammingSessionResponse_template& operator=(template_sel other_value);
ProgrammingSessionResponse_template& operator=(const ProgrammingSessionResponse& other_value);
ProgrammingSessionResponse_template& operator=(const OPTIONAL<ProgrammingSessionResponse>& other_value);
ProgrammingSessionResponse_template& operator=(const ProgrammingSessionResponse_template& other_value);
boolean match(const ProgrammingSessionResponse& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
ProgrammingSessionResponse valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
ProgrammingSessionResponse_template& list_item(unsigned int list_index) const;
BITSTRING_template& diagnosticSessionType();
const BITSTRING_template& diagnosticSessionType() const;
OCTETSTRING_template& p2ServerMax();
const OCTETSTRING_template& p2ServerMax() const;
OCTETSTRING_template& p2StarServerMax();
const OCTETSTRING_template& p2StarServerMax() const;
int size_of() const;
void log() const;
void log_match(const ProgrammingSessionResponse& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class ExtendedDiagnosticSessionResponse : public Base_Type {
  BITSTRING field_diagnosticSessionType;
  OCTETSTRING field_p2ServerMax;
  OCTETSTRING field_p2StarServerMax;
public:
  ExtendedDiagnosticSessionResponse();
  ExtendedDiagnosticSessionResponse(const BITSTRING& par_diagnosticSessionType,
    const OCTETSTRING& par_p2ServerMax,
    const OCTETSTRING& par_p2StarServerMax);
  ExtendedDiagnosticSessionResponse(const ExtendedDiagnosticSessionResponse& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  ExtendedDiagnosticSessionResponse& operator=(const ExtendedDiagnosticSessionResponse& other_value);
  boolean operator==(const ExtendedDiagnosticSessionResponse& other_value) const;
  inline boolean operator!=(const ExtendedDiagnosticSessionResponse& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& diagnosticSessionType()
    {return field_diagnosticSessionType;}
  inline const BITSTRING& diagnosticSessionType() const
    {return field_diagnosticSessionType;}
  inline OCTETSTRING& p2ServerMax()
    {return field_p2ServerMax;}
  inline const OCTETSTRING& p2ServerMax() const
    {return field_p2ServerMax;}
  inline OCTETSTRING& p2StarServerMax()
    {return field_p2StarServerMax;}
  inline const OCTETSTRING& p2StarServerMax() const
    {return field_p2StarServerMax;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ExtendedDiagnosticSessionResponse_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
ExtendedDiagnosticSessionResponse_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const ExtendedDiagnosticSessionResponse& other_value);
void copy_template(const ExtendedDiagnosticSessionResponse_template& other_value);

public:
ExtendedDiagnosticSessionResponse_template();
ExtendedDiagnosticSessionResponse_template(template_sel other_value);
ExtendedDiagnosticSessionResponse_template(const ExtendedDiagnosticSessionResponse& other_value);
ExtendedDiagnosticSessionResponse_template(const OPTIONAL<ExtendedDiagnosticSessionResponse>& other_value);
ExtendedDiagnosticSessionResponse_template(const ExtendedDiagnosticSessionResponse_template& other_value);
~ExtendedDiagnosticSessionResponse_template();
ExtendedDiagnosticSessionResponse_template& operator=(template_sel other_value);
ExtendedDiagnosticSessionResponse_template& operator=(const ExtendedDiagnosticSessionResponse& other_value);
ExtendedDiagnosticSessionResponse_template& operator=(const OPTIONAL<ExtendedDiagnosticSessionResponse>& other_value);
ExtendedDiagnosticSessionResponse_template& operator=(const ExtendedDiagnosticSessionResponse_template& other_value);
boolean match(const ExtendedDiagnosticSessionResponse& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
ExtendedDiagnosticSessionResponse valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
ExtendedDiagnosticSessionResponse_template& list_item(unsigned int list_index) const;
BITSTRING_template& diagnosticSessionType();
const BITSTRING_template& diagnosticSessionType() const;
OCTETSTRING_template& p2ServerMax();
const OCTETSTRING_template& p2ServerMax() const;
OCTETSTRING_template& p2StarServerMax();
const OCTETSTRING_template& p2StarServerMax() const;
int size_of() const;
void log() const;
void log_match(const ExtendedDiagnosticSessionResponse& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class SafetySystemDiagnosticSessionResponse : public Base_Type {
  BITSTRING field_diagnosticSessionType;
  OCTETSTRING field_p2ServerMax;
  OCTETSTRING field_p2StarServerMax;
public:
  SafetySystemDiagnosticSessionResponse();
  SafetySystemDiagnosticSessionResponse(const BITSTRING& par_diagnosticSessionType,
    const OCTETSTRING& par_p2ServerMax,
    const OCTETSTRING& par_p2StarServerMax);
  SafetySystemDiagnosticSessionResponse(const SafetySystemDiagnosticSessionResponse& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  SafetySystemDiagnosticSessionResponse& operator=(const SafetySystemDiagnosticSessionResponse& other_value);
  boolean operator==(const SafetySystemDiagnosticSessionResponse& other_value) const;
  inline boolean operator!=(const SafetySystemDiagnosticSessionResponse& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& diagnosticSessionType()
    {return field_diagnosticSessionType;}
  inline const BITSTRING& diagnosticSessionType() const
    {return field_diagnosticSessionType;}
  inline OCTETSTRING& p2ServerMax()
    {return field_p2ServerMax;}
  inline const OCTETSTRING& p2ServerMax() const
    {return field_p2ServerMax;}
  inline OCTETSTRING& p2StarServerMax()
    {return field_p2StarServerMax;}
  inline const OCTETSTRING& p2StarServerMax() const
    {return field_p2StarServerMax;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class SafetySystemDiagnosticSessionResponse_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
SafetySystemDiagnosticSessionResponse_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const SafetySystemDiagnosticSessionResponse& other_value);
void copy_template(const SafetySystemDiagnosticSessionResponse_template& other_value);

public:
SafetySystemDiagnosticSessionResponse_template();
SafetySystemDiagnosticSessionResponse_template(template_sel other_value);
SafetySystemDiagnosticSessionResponse_template(const SafetySystemDiagnosticSessionResponse& other_value);
SafetySystemDiagnosticSessionResponse_template(const OPTIONAL<SafetySystemDiagnosticSessionResponse>& other_value);
SafetySystemDiagnosticSessionResponse_template(const SafetySystemDiagnosticSessionResponse_template& other_value);
~SafetySystemDiagnosticSessionResponse_template();
SafetySystemDiagnosticSessionResponse_template& operator=(template_sel other_value);
SafetySystemDiagnosticSessionResponse_template& operator=(const SafetySystemDiagnosticSessionResponse& other_value);
SafetySystemDiagnosticSessionResponse_template& operator=(const OPTIONAL<SafetySystemDiagnosticSessionResponse>& other_value);
SafetySystemDiagnosticSessionResponse_template& operator=(const SafetySystemDiagnosticSessionResponse_template& other_value);
boolean match(const SafetySystemDiagnosticSessionResponse& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
SafetySystemDiagnosticSessionResponse valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
SafetySystemDiagnosticSessionResponse_template& list_item(unsigned int list_index) const;
BITSTRING_template& diagnosticSessionType();
const BITSTRING_template& diagnosticSessionType() const;
OCTETSTRING_template& p2ServerMax();
const OCTETSTRING_template& p2ServerMax() const;
OCTETSTRING_template& p2StarServerMax();
const OCTETSTRING_template& p2StarServerMax() const;
int size_of() const;
void log() const;
void log_match(const SafetySystemDiagnosticSessionResponse& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class DiagnosticSessionControlResponseSID : public Base_Type {
  OCTETSTRING field_sid;
  BITSTRING field_reserved;
  DiagnosticSessionResponseType field_diagnosticSessionType;
public:
  DiagnosticSessionControlResponseSID();
  DiagnosticSessionControlResponseSID(const OCTETSTRING& par_sid,
    const BITSTRING& par_reserved,
    const DiagnosticSessionResponseType& par_diagnosticSessionType);
  DiagnosticSessionControlResponseSID(const DiagnosticSessionControlResponseSID& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  DiagnosticSessionControlResponseSID& operator=(const DiagnosticSessionControlResponseSID& other_value);
  boolean operator==(const DiagnosticSessionControlResponseSID& other_value) const;
  inline boolean operator!=(const DiagnosticSessionControlResponseSID& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& sid()
    {return field_sid;}
  inline const OCTETSTRING& sid() const
    {return field_sid;}
  inline BITSTRING& reserved()
    {return field_reserved;}
  inline const BITSTRING& reserved() const
    {return field_reserved;}
  inline DiagnosticSessionResponseType& diagnosticSessionType()
    {return field_diagnosticSessionType;}
  inline const DiagnosticSessionResponseType& diagnosticSessionType() const
    {return field_diagnosticSessionType;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class DiagnosticSessionControlResponseSID_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
DiagnosticSessionControlResponseSID_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const DiagnosticSessionControlResponseSID& other_value);
void copy_template(const DiagnosticSessionControlResponseSID_template& other_value);

public:
DiagnosticSessionControlResponseSID_template();
DiagnosticSessionControlResponseSID_template(template_sel other_value);
DiagnosticSessionControlResponseSID_template(const DiagnosticSessionControlResponseSID& other_value);
DiagnosticSessionControlResponseSID_template(const OPTIONAL<DiagnosticSessionControlResponseSID>& other_value);
DiagnosticSessionControlResponseSID_template(const DiagnosticSessionControlResponseSID_template& other_value);
~DiagnosticSessionControlResponseSID_template();
DiagnosticSessionControlResponseSID_template& operator=(template_sel other_value);
DiagnosticSessionControlResponseSID_template& operator=(const DiagnosticSessionControlResponseSID& other_value);
DiagnosticSessionControlResponseSID_template& operator=(const OPTIONAL<DiagnosticSessionControlResponseSID>& other_value);
DiagnosticSessionControlResponseSID_template& operator=(const DiagnosticSessionControlResponseSID_template& other_value);
boolean match(const DiagnosticSessionControlResponseSID& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
DiagnosticSessionControlResponseSID valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
DiagnosticSessionControlResponseSID_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& sid();
const OCTETSTRING_template& sid() const;
BITSTRING_template& reserved();
const BITSTRING_template& reserved() const;
DiagnosticSessionResponseType_template& diagnosticSessionType();
const DiagnosticSessionResponseType_template& diagnosticSessionType() const;
int size_of() const;
void log() const;
void log_match(const DiagnosticSessionControlResponseSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class HardResetRequest : public Base_Type {
  BITSTRING field_resetType;
public:
  HardResetRequest();
  HardResetRequest(const BITSTRING& par_resetType);
  HardResetRequest(const HardResetRequest& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  HardResetRequest& operator=(const HardResetRequest& other_value);
  boolean operator==(const HardResetRequest& other_value) const;
  inline boolean operator!=(const HardResetRequest& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& resetType()
    {return field_resetType;}
  inline const BITSTRING& resetType() const
    {return field_resetType;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class HardResetRequest_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
HardResetRequest_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const HardResetRequest& other_value);
void copy_template(const HardResetRequest_template& other_value);

public:
HardResetRequest_template();
HardResetRequest_template(template_sel other_value);
HardResetRequest_template(const HardResetRequest& other_value);
HardResetRequest_template(const OPTIONAL<HardResetRequest>& other_value);
HardResetRequest_template(const HardResetRequest_template& other_value);
~HardResetRequest_template();
HardResetRequest_template& operator=(template_sel other_value);
HardResetRequest_template& operator=(const HardResetRequest& other_value);
HardResetRequest_template& operator=(const OPTIONAL<HardResetRequest>& other_value);
HardResetRequest_template& operator=(const HardResetRequest_template& other_value);
boolean match(const HardResetRequest& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
HardResetRequest valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
HardResetRequest_template& list_item(unsigned int list_index) const;
BITSTRING_template& resetType();
const BITSTRING_template& resetType() const;
int size_of() const;
void log() const;
void log_match(const HardResetRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class KeyOffOnResetRequest : public Base_Type {
  BITSTRING field_resetType;
public:
  KeyOffOnResetRequest();
  KeyOffOnResetRequest(const BITSTRING& par_resetType);
  KeyOffOnResetRequest(const KeyOffOnResetRequest& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  KeyOffOnResetRequest& operator=(const KeyOffOnResetRequest& other_value);
  boolean operator==(const KeyOffOnResetRequest& other_value) const;
  inline boolean operator!=(const KeyOffOnResetRequest& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& resetType()
    {return field_resetType;}
  inline const BITSTRING& resetType() const
    {return field_resetType;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class KeyOffOnResetRequest_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
KeyOffOnResetRequest_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const KeyOffOnResetRequest& other_value);
void copy_template(const KeyOffOnResetRequest_template& other_value);

public:
KeyOffOnResetRequest_template();
KeyOffOnResetRequest_template(template_sel other_value);
KeyOffOnResetRequest_template(const KeyOffOnResetRequest& other_value);
KeyOffOnResetRequest_template(const OPTIONAL<KeyOffOnResetRequest>& other_value);
KeyOffOnResetRequest_template(const KeyOffOnResetRequest_template& other_value);
~KeyOffOnResetRequest_template();
KeyOffOnResetRequest_template& operator=(template_sel other_value);
KeyOffOnResetRequest_template& operator=(const KeyOffOnResetRequest& other_value);
KeyOffOnResetRequest_template& operator=(const OPTIONAL<KeyOffOnResetRequest>& other_value);
KeyOffOnResetRequest_template& operator=(const KeyOffOnResetRequest_template& other_value);
boolean match(const KeyOffOnResetRequest& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
KeyOffOnResetRequest valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
KeyOffOnResetRequest_template& list_item(unsigned int list_index) const;
BITSTRING_template& resetType();
const BITSTRING_template& resetType() const;
int size_of() const;
void log() const;
void log_match(const KeyOffOnResetRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class SoftResetRequest : public Base_Type {
  BITSTRING field_resetType;
public:
  SoftResetRequest();
  SoftResetRequest(const BITSTRING& par_resetType);
  SoftResetRequest(const SoftResetRequest& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  SoftResetRequest& operator=(const SoftResetRequest& other_value);
  boolean operator==(const SoftResetRequest& other_value) const;
  inline boolean operator!=(const SoftResetRequest& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& resetType()
    {return field_resetType;}
  inline const BITSTRING& resetType() const
    {return field_resetType;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class SoftResetRequest_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
SoftResetRequest_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const SoftResetRequest& other_value);
void copy_template(const SoftResetRequest_template& other_value);

public:
SoftResetRequest_template();
SoftResetRequest_template(template_sel other_value);
SoftResetRequest_template(const SoftResetRequest& other_value);
SoftResetRequest_template(const OPTIONAL<SoftResetRequest>& other_value);
SoftResetRequest_template(const SoftResetRequest_template& other_value);
~SoftResetRequest_template();
SoftResetRequest_template& operator=(template_sel other_value);
SoftResetRequest_template& operator=(const SoftResetRequest& other_value);
SoftResetRequest_template& operator=(const OPTIONAL<SoftResetRequest>& other_value);
SoftResetRequest_template& operator=(const SoftResetRequest_template& other_value);
boolean match(const SoftResetRequest& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
SoftResetRequest valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
SoftResetRequest_template& list_item(unsigned int list_index) const;
BITSTRING_template& resetType();
const BITSTRING_template& resetType() const;
int size_of() const;
void log() const;
void log_match(const SoftResetRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class EnableRapidPowerShutDownRequest : public Base_Type {
  BITSTRING field_resetType;
public:
  EnableRapidPowerShutDownRequest();
  EnableRapidPowerShutDownRequest(const BITSTRING& par_resetType);
  EnableRapidPowerShutDownRequest(const EnableRapidPowerShutDownRequest& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  EnableRapidPowerShutDownRequest& operator=(const EnableRapidPowerShutDownRequest& other_value);
  boolean operator==(const EnableRapidPowerShutDownRequest& other_value) const;
  inline boolean operator!=(const EnableRapidPowerShutDownRequest& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& resetType()
    {return field_resetType;}
  inline const BITSTRING& resetType() const
    {return field_resetType;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class EnableRapidPowerShutDownRequest_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
EnableRapidPowerShutDownRequest_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const EnableRapidPowerShutDownRequest& other_value);
void copy_template(const EnableRapidPowerShutDownRequest_template& other_value);

public:
EnableRapidPowerShutDownRequest_template();
EnableRapidPowerShutDownRequest_template(template_sel other_value);
EnableRapidPowerShutDownRequest_template(const EnableRapidPowerShutDownRequest& other_value);
EnableRapidPowerShutDownRequest_template(const OPTIONAL<EnableRapidPowerShutDownRequest>& other_value);
EnableRapidPowerShutDownRequest_template(const EnableRapidPowerShutDownRequest_template& other_value);
~EnableRapidPowerShutDownRequest_template();
EnableRapidPowerShutDownRequest_template& operator=(template_sel other_value);
EnableRapidPowerShutDownRequest_template& operator=(const EnableRapidPowerShutDownRequest& other_value);
EnableRapidPowerShutDownRequest_template& operator=(const OPTIONAL<EnableRapidPowerShutDownRequest>& other_value);
EnableRapidPowerShutDownRequest_template& operator=(const EnableRapidPowerShutDownRequest_template& other_value);
boolean match(const EnableRapidPowerShutDownRequest& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
EnableRapidPowerShutDownRequest valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
EnableRapidPowerShutDownRequest_template& list_item(unsigned int list_index) const;
BITSTRING_template& resetType();
const BITSTRING_template& resetType() const;
int size_of() const;
void log() const;
void log_match(const EnableRapidPowerShutDownRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class DisableRapidPowerShutDownRequest : public Base_Type {
  BITSTRING field_resetType;
public:
  DisableRapidPowerShutDownRequest();
  DisableRapidPowerShutDownRequest(const BITSTRING& par_resetType);
  DisableRapidPowerShutDownRequest(const DisableRapidPowerShutDownRequest& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  DisableRapidPowerShutDownRequest& operator=(const DisableRapidPowerShutDownRequest& other_value);
  boolean operator==(const DisableRapidPowerShutDownRequest& other_value) const;
  inline boolean operator!=(const DisableRapidPowerShutDownRequest& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& resetType()
    {return field_resetType;}
  inline const BITSTRING& resetType() const
    {return field_resetType;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class DisableRapidPowerShutDownRequest_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
DisableRapidPowerShutDownRequest_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const DisableRapidPowerShutDownRequest& other_value);
void copy_template(const DisableRapidPowerShutDownRequest_template& other_value);

public:
DisableRapidPowerShutDownRequest_template();
DisableRapidPowerShutDownRequest_template(template_sel other_value);
DisableRapidPowerShutDownRequest_template(const DisableRapidPowerShutDownRequest& other_value);
DisableRapidPowerShutDownRequest_template(const OPTIONAL<DisableRapidPowerShutDownRequest>& other_value);
DisableRapidPowerShutDownRequest_template(const DisableRapidPowerShutDownRequest_template& other_value);
~DisableRapidPowerShutDownRequest_template();
DisableRapidPowerShutDownRequest_template& operator=(template_sel other_value);
DisableRapidPowerShutDownRequest_template& operator=(const DisableRapidPowerShutDownRequest& other_value);
DisableRapidPowerShutDownRequest_template& operator=(const OPTIONAL<DisableRapidPowerShutDownRequest>& other_value);
DisableRapidPowerShutDownRequest_template& operator=(const DisableRapidPowerShutDownRequest_template& other_value);
boolean match(const DisableRapidPowerShutDownRequest& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
DisableRapidPowerShutDownRequest valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
DisableRapidPowerShutDownRequest_template& list_item(unsigned int list_index) const;
BITSTRING_template& resetType();
const BITSTRING_template& resetType() const;
int size_of() const;
void log() const;
void log_match(const DisableRapidPowerShutDownRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class ECUResetRequestType : public Base_Type {
public:
enum union_selection_type { UNBOUND_VALUE = 0, ALT_hardReset = 1, ALT_keyOffOnReset = 2, ALT_softReset = 3, ALT_enableRapidPowerShutDown = 4, ALT_disableRapidPowerShutDown = 5 };
private:
union_selection_type union_selection;
union {
HardResetRequest *field_hardReset;
KeyOffOnResetRequest *field_keyOffOnReset;
SoftResetRequest *field_softReset;
EnableRapidPowerShutDownRequest *field_enableRapidPowerShutDown;
DisableRapidPowerShutDownRequest *field_disableRapidPowerShutDown;
};
void copy_value(const ECUResetRequestType& other_value);

public:
ECUResetRequestType();
ECUResetRequestType(const ECUResetRequestType& other_value);
~ECUResetRequestType();
ECUResetRequestType& operator=(const ECUResetRequestType& other_value);
boolean operator==(const ECUResetRequestType& other_value) const;
inline boolean operator!=(const ECUResetRequestType& other_value) const { return !(*this == other_value); }
HardResetRequest& hardReset();
const HardResetRequest& hardReset() const;
KeyOffOnResetRequest& keyOffOnReset();
const KeyOffOnResetRequest& keyOffOnReset() const;
SoftResetRequest& softReset();
const SoftResetRequest& softReset() const;
EnableRapidPowerShutDownRequest& enableRapidPowerShutDown();
const EnableRapidPowerShutDownRequest& enableRapidPowerShutDown() const;
DisableRapidPowerShutDownRequest& disableRapidPowerShutDown();
const DisableRapidPowerShutDownRequest& disableRapidPowerShutDown() const;
inline union_selection_type get_selection() const { return union_selection; }
boolean ischosen(union_selection_type checked_selection) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
  void set_implicit_omit();
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ECUResetRequestType_template : public Base_Template {
union {
struct {
ECUResetRequestType::union_selection_type union_selection;
union {
HardResetRequest_template *field_hardReset;
KeyOffOnResetRequest_template *field_keyOffOnReset;
SoftResetRequest_template *field_softReset;
EnableRapidPowerShutDownRequest_template *field_enableRapidPowerShutDown;
DisableRapidPowerShutDownRequest_template *field_disableRapidPowerShutDown;
};
} single_value;
struct {
unsigned int n_values;
ECUResetRequestType_template *list_value;
} value_list;
};
void copy_value(const ECUResetRequestType& other_value);

void copy_template(const ECUResetRequestType_template& other_value);

public:
ECUResetRequestType_template();
ECUResetRequestType_template(template_sel other_value);
ECUResetRequestType_template(const ECUResetRequestType& other_value);
ECUResetRequestType_template(const OPTIONAL<ECUResetRequestType>& other_value);
ECUResetRequestType_template(const ECUResetRequestType_template& other_value);
~ECUResetRequestType_template();
void clean_up();
ECUResetRequestType_template& operator=(template_sel other_value);
ECUResetRequestType_template& operator=(const ECUResetRequestType& other_value);
ECUResetRequestType_template& operator=(const OPTIONAL<ECUResetRequestType>& other_value);
ECUResetRequestType_template& operator=(const ECUResetRequestType_template& other_value);
boolean match(const ECUResetRequestType& other_value, boolean legacy = FALSE) const;
boolean is_value() const;ECUResetRequestType valueof() const;
ECUResetRequestType_template& list_item(unsigned int list_index) const;
void set_type(template_sel template_type, unsigned int list_length);
HardResetRequest_template& hardReset();
const HardResetRequest_template& hardReset() const;
KeyOffOnResetRequest_template& keyOffOnReset();
const KeyOffOnResetRequest_template& keyOffOnReset() const;
SoftResetRequest_template& softReset();
const SoftResetRequest_template& softReset() const;
EnableRapidPowerShutDownRequest_template& enableRapidPowerShutDown();
const EnableRapidPowerShutDownRequest_template& enableRapidPowerShutDown() const;
DisableRapidPowerShutDownRequest_template& disableRapidPowerShutDown();
const DisableRapidPowerShutDownRequest_template& disableRapidPowerShutDown() const;
boolean ischosen(ECUResetRequestType::union_selection_type checked_selection) const;
void log() const;
void log_match(const ECUResetRequestType& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class HardResetResponse : public Base_Type {
  BITSTRING field_resetType;
public:
  HardResetResponse();
  HardResetResponse(const BITSTRING& par_resetType);
  HardResetResponse(const HardResetResponse& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  HardResetResponse& operator=(const HardResetResponse& other_value);
  boolean operator==(const HardResetResponse& other_value) const;
  inline boolean operator!=(const HardResetResponse& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& resetType()
    {return field_resetType;}
  inline const BITSTRING& resetType() const
    {return field_resetType;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class HardResetResponse_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
HardResetResponse_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const HardResetResponse& other_value);
void copy_template(const HardResetResponse_template& other_value);

public:
HardResetResponse_template();
HardResetResponse_template(template_sel other_value);
HardResetResponse_template(const HardResetResponse& other_value);
HardResetResponse_template(const OPTIONAL<HardResetResponse>& other_value);
HardResetResponse_template(const HardResetResponse_template& other_value);
~HardResetResponse_template();
HardResetResponse_template& operator=(template_sel other_value);
HardResetResponse_template& operator=(const HardResetResponse& other_value);
HardResetResponse_template& operator=(const OPTIONAL<HardResetResponse>& other_value);
HardResetResponse_template& operator=(const HardResetResponse_template& other_value);
boolean match(const HardResetResponse& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
HardResetResponse valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
HardResetResponse_template& list_item(unsigned int list_index) const;
BITSTRING_template& resetType();
const BITSTRING_template& resetType() const;
int size_of() const;
void log() const;
void log_match(const HardResetResponse& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class KeyOffOnResetResponse : public Base_Type {
  BITSTRING field_resetType;
public:
  KeyOffOnResetResponse();
  KeyOffOnResetResponse(const BITSTRING& par_resetType);
  KeyOffOnResetResponse(const KeyOffOnResetResponse& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  KeyOffOnResetResponse& operator=(const KeyOffOnResetResponse& other_value);
  boolean operator==(const KeyOffOnResetResponse& other_value) const;
  inline boolean operator!=(const KeyOffOnResetResponse& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& resetType()
    {return field_resetType;}
  inline const BITSTRING& resetType() const
    {return field_resetType;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class KeyOffOnResetResponse_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
KeyOffOnResetResponse_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const KeyOffOnResetResponse& other_value);
void copy_template(const KeyOffOnResetResponse_template& other_value);

public:
KeyOffOnResetResponse_template();
KeyOffOnResetResponse_template(template_sel other_value);
KeyOffOnResetResponse_template(const KeyOffOnResetResponse& other_value);
KeyOffOnResetResponse_template(const OPTIONAL<KeyOffOnResetResponse>& other_value);
KeyOffOnResetResponse_template(const KeyOffOnResetResponse_template& other_value);
~KeyOffOnResetResponse_template();
KeyOffOnResetResponse_template& operator=(template_sel other_value);
KeyOffOnResetResponse_template& operator=(const KeyOffOnResetResponse& other_value);
KeyOffOnResetResponse_template& operator=(const OPTIONAL<KeyOffOnResetResponse>& other_value);
KeyOffOnResetResponse_template& operator=(const KeyOffOnResetResponse_template& other_value);
boolean match(const KeyOffOnResetResponse& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
KeyOffOnResetResponse valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
KeyOffOnResetResponse_template& list_item(unsigned int list_index) const;
BITSTRING_template& resetType();
const BITSTRING_template& resetType() const;
int size_of() const;
void log() const;
void log_match(const KeyOffOnResetResponse& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class SoftResetResponse : public Base_Type {
  BITSTRING field_resetType;
public:
  SoftResetResponse();
  SoftResetResponse(const BITSTRING& par_resetType);
  SoftResetResponse(const SoftResetResponse& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  SoftResetResponse& operator=(const SoftResetResponse& other_value);
  boolean operator==(const SoftResetResponse& other_value) const;
  inline boolean operator!=(const SoftResetResponse& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& resetType()
    {return field_resetType;}
  inline const BITSTRING& resetType() const
    {return field_resetType;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class SoftResetResponse_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
SoftResetResponse_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const SoftResetResponse& other_value);
void copy_template(const SoftResetResponse_template& other_value);

public:
SoftResetResponse_template();
SoftResetResponse_template(template_sel other_value);
SoftResetResponse_template(const SoftResetResponse& other_value);
SoftResetResponse_template(const OPTIONAL<SoftResetResponse>& other_value);
SoftResetResponse_template(const SoftResetResponse_template& other_value);
~SoftResetResponse_template();
SoftResetResponse_template& operator=(template_sel other_value);
SoftResetResponse_template& operator=(const SoftResetResponse& other_value);
SoftResetResponse_template& operator=(const OPTIONAL<SoftResetResponse>& other_value);
SoftResetResponse_template& operator=(const SoftResetResponse_template& other_value);
boolean match(const SoftResetResponse& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
SoftResetResponse valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
SoftResetResponse_template& list_item(unsigned int list_index) const;
BITSTRING_template& resetType();
const BITSTRING_template& resetType() const;
int size_of() const;
void log() const;
void log_match(const SoftResetResponse& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class EnableRapidPowerShutDownResponse : public Base_Type {
  BITSTRING field_resetType;
  OCTETSTRING field_powerDownTime;
public:
  EnableRapidPowerShutDownResponse();
  EnableRapidPowerShutDownResponse(const BITSTRING& par_resetType,
    const OCTETSTRING& par_powerDownTime);
  EnableRapidPowerShutDownResponse(const EnableRapidPowerShutDownResponse& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  EnableRapidPowerShutDownResponse& operator=(const EnableRapidPowerShutDownResponse& other_value);
  boolean operator==(const EnableRapidPowerShutDownResponse& other_value) const;
  inline boolean operator!=(const EnableRapidPowerShutDownResponse& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& resetType()
    {return field_resetType;}
  inline const BITSTRING& resetType() const
    {return field_resetType;}
  inline OCTETSTRING& powerDownTime()
    {return field_powerDownTime;}
  inline const OCTETSTRING& powerDownTime() const
    {return field_powerDownTime;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class EnableRapidPowerShutDownResponse_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
EnableRapidPowerShutDownResponse_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const EnableRapidPowerShutDownResponse& other_value);
void copy_template(const EnableRapidPowerShutDownResponse_template& other_value);

public:
EnableRapidPowerShutDownResponse_template();
EnableRapidPowerShutDownResponse_template(template_sel other_value);
EnableRapidPowerShutDownResponse_template(const EnableRapidPowerShutDownResponse& other_value);
EnableRapidPowerShutDownResponse_template(const OPTIONAL<EnableRapidPowerShutDownResponse>& other_value);
EnableRapidPowerShutDownResponse_template(const EnableRapidPowerShutDownResponse_template& other_value);
~EnableRapidPowerShutDownResponse_template();
EnableRapidPowerShutDownResponse_template& operator=(template_sel other_value);
EnableRapidPowerShutDownResponse_template& operator=(const EnableRapidPowerShutDownResponse& other_value);
EnableRapidPowerShutDownResponse_template& operator=(const OPTIONAL<EnableRapidPowerShutDownResponse>& other_value);
EnableRapidPowerShutDownResponse_template& operator=(const EnableRapidPowerShutDownResponse_template& other_value);
boolean match(const EnableRapidPowerShutDownResponse& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
EnableRapidPowerShutDownResponse valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
EnableRapidPowerShutDownResponse_template& list_item(unsigned int list_index) const;
BITSTRING_template& resetType();
const BITSTRING_template& resetType() const;
OCTETSTRING_template& powerDownTime();
const OCTETSTRING_template& powerDownTime() const;
int size_of() const;
void log() const;
void log_match(const EnableRapidPowerShutDownResponse& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class DisableRapidPowerShutDownResponse : public Base_Type {
  BITSTRING field_resetType;
public:
  DisableRapidPowerShutDownResponse();
  DisableRapidPowerShutDownResponse(const BITSTRING& par_resetType);
  DisableRapidPowerShutDownResponse(const DisableRapidPowerShutDownResponse& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  DisableRapidPowerShutDownResponse& operator=(const DisableRapidPowerShutDownResponse& other_value);
  boolean operator==(const DisableRapidPowerShutDownResponse& other_value) const;
  inline boolean operator!=(const DisableRapidPowerShutDownResponse& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& resetType()
    {return field_resetType;}
  inline const BITSTRING& resetType() const
    {return field_resetType;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class DisableRapidPowerShutDownResponse_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
DisableRapidPowerShutDownResponse_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const DisableRapidPowerShutDownResponse& other_value);
void copy_template(const DisableRapidPowerShutDownResponse_template& other_value);

public:
DisableRapidPowerShutDownResponse_template();
DisableRapidPowerShutDownResponse_template(template_sel other_value);
DisableRapidPowerShutDownResponse_template(const DisableRapidPowerShutDownResponse& other_value);
DisableRapidPowerShutDownResponse_template(const OPTIONAL<DisableRapidPowerShutDownResponse>& other_value);
DisableRapidPowerShutDownResponse_template(const DisableRapidPowerShutDownResponse_template& other_value);
~DisableRapidPowerShutDownResponse_template();
DisableRapidPowerShutDownResponse_template& operator=(template_sel other_value);
DisableRapidPowerShutDownResponse_template& operator=(const DisableRapidPowerShutDownResponse& other_value);
DisableRapidPowerShutDownResponse_template& operator=(const OPTIONAL<DisableRapidPowerShutDownResponse>& other_value);
DisableRapidPowerShutDownResponse_template& operator=(const DisableRapidPowerShutDownResponse_template& other_value);
boolean match(const DisableRapidPowerShutDownResponse& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
DisableRapidPowerShutDownResponse valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
DisableRapidPowerShutDownResponse_template& list_item(unsigned int list_index) const;
BITSTRING_template& resetType();
const BITSTRING_template& resetType() const;
int size_of() const;
void log() const;
void log_match(const DisableRapidPowerShutDownResponse& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class ECUResetResponseType : public Base_Type {
public:
enum union_selection_type { UNBOUND_VALUE = 0, ALT_hardReset = 1, ALT_keyOffOnReset = 2, ALT_softReset = 3, ALT_enableRapidPowerShutDown = 4, ALT_disableRapidPowerShutDown = 5 };
private:
union_selection_type union_selection;
union {
HardResetResponse *field_hardReset;
KeyOffOnResetResponse *field_keyOffOnReset;
SoftResetResponse *field_softReset;
EnableRapidPowerShutDownResponse *field_enableRapidPowerShutDown;
DisableRapidPowerShutDownResponse *field_disableRapidPowerShutDown;
};
void copy_value(const ECUResetResponseType& other_value);

public:
ECUResetResponseType();
ECUResetResponseType(const ECUResetResponseType& other_value);
~ECUResetResponseType();
ECUResetResponseType& operator=(const ECUResetResponseType& other_value);
boolean operator==(const ECUResetResponseType& other_value) const;
inline boolean operator!=(const ECUResetResponseType& other_value) const { return !(*this == other_value); }
HardResetResponse& hardReset();
const HardResetResponse& hardReset() const;
KeyOffOnResetResponse& keyOffOnReset();
const KeyOffOnResetResponse& keyOffOnReset() const;
SoftResetResponse& softReset();
const SoftResetResponse& softReset() const;
EnableRapidPowerShutDownResponse& enableRapidPowerShutDown();
const EnableRapidPowerShutDownResponse& enableRapidPowerShutDown() const;
DisableRapidPowerShutDownResponse& disableRapidPowerShutDown();
const DisableRapidPowerShutDownResponse& disableRapidPowerShutDown() const;
inline union_selection_type get_selection() const { return union_selection; }
boolean ischosen(union_selection_type checked_selection) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
  void set_implicit_omit();
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ECUResetResponseType_template : public Base_Template {
union {
struct {
ECUResetResponseType::union_selection_type union_selection;
union {
HardResetResponse_template *field_hardReset;
KeyOffOnResetResponse_template *field_keyOffOnReset;
SoftResetResponse_template *field_softReset;
EnableRapidPowerShutDownResponse_template *field_enableRapidPowerShutDown;
DisableRapidPowerShutDownResponse_template *field_disableRapidPowerShutDown;
};
} single_value;
struct {
unsigned int n_values;
ECUResetResponseType_template *list_value;
} value_list;
};
void copy_value(const ECUResetResponseType& other_value);

void copy_template(const ECUResetResponseType_template& other_value);

public:
ECUResetResponseType_template();
ECUResetResponseType_template(template_sel other_value);
ECUResetResponseType_template(const ECUResetResponseType& other_value);
ECUResetResponseType_template(const OPTIONAL<ECUResetResponseType>& other_value);
ECUResetResponseType_template(const ECUResetResponseType_template& other_value);
~ECUResetResponseType_template();
void clean_up();
ECUResetResponseType_template& operator=(template_sel other_value);
ECUResetResponseType_template& operator=(const ECUResetResponseType& other_value);
ECUResetResponseType_template& operator=(const OPTIONAL<ECUResetResponseType>& other_value);
ECUResetResponseType_template& operator=(const ECUResetResponseType_template& other_value);
boolean match(const ECUResetResponseType& other_value, boolean legacy = FALSE) const;
boolean is_value() const;ECUResetResponseType valueof() const;
ECUResetResponseType_template& list_item(unsigned int list_index) const;
void set_type(template_sel template_type, unsigned int list_length);
HardResetResponse_template& hardReset();
const HardResetResponse_template& hardReset() const;
KeyOffOnResetResponse_template& keyOffOnReset();
const KeyOffOnResetResponse_template& keyOffOnReset() const;
SoftResetResponse_template& softReset();
const SoftResetResponse_template& softReset() const;
EnableRapidPowerShutDownResponse_template& enableRapidPowerShutDown();
const EnableRapidPowerShutDownResponse_template& enableRapidPowerShutDown() const;
DisableRapidPowerShutDownResponse_template& disableRapidPowerShutDown();
const DisableRapidPowerShutDownResponse_template& disableRapidPowerShutDown() const;
boolean ischosen(ECUResetResponseType::union_selection_type checked_selection) const;
void log() const;
void log_match(const ECUResetResponseType& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class ECUResetRequestSID : public Base_Type {
  OCTETSTRING field_sid;
  SuppressPosRspMsgIndicationBitType field_suppressPosRspMsgIndicationBit;
  ECUResetRequestType field_resetType;
public:
  ECUResetRequestSID();
  ECUResetRequestSID(const OCTETSTRING& par_sid,
    const SuppressPosRspMsgIndicationBitType& par_suppressPosRspMsgIndicationBit,
    const ECUResetRequestType& par_resetType);
  ECUResetRequestSID(const ECUResetRequestSID& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  ECUResetRequestSID& operator=(const ECUResetRequestSID& other_value);
  boolean operator==(const ECUResetRequestSID& other_value) const;
  inline boolean operator!=(const ECUResetRequestSID& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& sid()
    {return field_sid;}
  inline const OCTETSTRING& sid() const
    {return field_sid;}
  inline SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit()
    {return field_suppressPosRspMsgIndicationBit;}
  inline const SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit() const
    {return field_suppressPosRspMsgIndicationBit;}
  inline ECUResetRequestType& resetType()
    {return field_resetType;}
  inline const ECUResetRequestType& resetType() const
    {return field_resetType;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ECUResetRequestSID_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
ECUResetRequestSID_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const ECUResetRequestSID& other_value);
void copy_template(const ECUResetRequestSID_template& other_value);

public:
ECUResetRequestSID_template();
ECUResetRequestSID_template(template_sel other_value);
ECUResetRequestSID_template(const ECUResetRequestSID& other_value);
ECUResetRequestSID_template(const OPTIONAL<ECUResetRequestSID>& other_value);
ECUResetRequestSID_template(const ECUResetRequestSID_template& other_value);
~ECUResetRequestSID_template();
ECUResetRequestSID_template& operator=(template_sel other_value);
ECUResetRequestSID_template& operator=(const ECUResetRequestSID& other_value);
ECUResetRequestSID_template& operator=(const OPTIONAL<ECUResetRequestSID>& other_value);
ECUResetRequestSID_template& operator=(const ECUResetRequestSID_template& other_value);
boolean match(const ECUResetRequestSID& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
ECUResetRequestSID valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
ECUResetRequestSID_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& sid();
const OCTETSTRING_template& sid() const;
SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit();
const SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit() const;
ECUResetRequestType_template& resetType();
const ECUResetRequestType_template& resetType() const;
int size_of() const;
void log() const;
void log_match(const ECUResetRequestSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class ECUResetResponseSID : public Base_Type {
  OCTETSTRING field_sid;
  BITSTRING field_reserved;
  ECUResetResponseType field_resetType;
public:
  ECUResetResponseSID();
  ECUResetResponseSID(const OCTETSTRING& par_sid,
    const BITSTRING& par_reserved,
    const ECUResetResponseType& par_resetType);
  ECUResetResponseSID(const ECUResetResponseSID& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  ECUResetResponseSID& operator=(const ECUResetResponseSID& other_value);
  boolean operator==(const ECUResetResponseSID& other_value) const;
  inline boolean operator!=(const ECUResetResponseSID& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& sid()
    {return field_sid;}
  inline const OCTETSTRING& sid() const
    {return field_sid;}
  inline BITSTRING& reserved()
    {return field_reserved;}
  inline const BITSTRING& reserved() const
    {return field_reserved;}
  inline ECUResetResponseType& resetType()
    {return field_resetType;}
  inline const ECUResetResponseType& resetType() const
    {return field_resetType;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ECUResetResponseSID_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
ECUResetResponseSID_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const ECUResetResponseSID& other_value);
void copy_template(const ECUResetResponseSID_template& other_value);

public:
ECUResetResponseSID_template();
ECUResetResponseSID_template(template_sel other_value);
ECUResetResponseSID_template(const ECUResetResponseSID& other_value);
ECUResetResponseSID_template(const OPTIONAL<ECUResetResponseSID>& other_value);
ECUResetResponseSID_template(const ECUResetResponseSID_template& other_value);
~ECUResetResponseSID_template();
ECUResetResponseSID_template& operator=(template_sel other_value);
ECUResetResponseSID_template& operator=(const ECUResetResponseSID& other_value);
ECUResetResponseSID_template& operator=(const OPTIONAL<ECUResetResponseSID>& other_value);
ECUResetResponseSID_template& operator=(const ECUResetResponseSID_template& other_value);
boolean match(const ECUResetResponseSID& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
ECUResetResponseSID valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
ECUResetResponseSID_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& sid();
const OCTETSTRING_template& sid() const;
BITSTRING_template& reserved();
const BITSTRING_template& reserved() const;
ECUResetResponseType_template& resetType();
const ECUResetResponseType_template& resetType() const;
int size_of() const;
void log() const;
void log_match(const ECUResetResponseSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class RequestSeedRequest0 : public Base_Type {
  BITSTRING field_securityAccessType;
  OCTETSTRING field_securityAccessDataRecord;
public:
  RequestSeedRequest0();
  RequestSeedRequest0(const BITSTRING& par_securityAccessType,
    const OCTETSTRING& par_securityAccessDataRecord);
  RequestSeedRequest0(const RequestSeedRequest0& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  RequestSeedRequest0& operator=(const RequestSeedRequest0& other_value);
  boolean operator==(const RequestSeedRequest0& other_value) const;
  inline boolean operator!=(const RequestSeedRequest0& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& securityAccessType()
    {return field_securityAccessType;}
  inline const BITSTRING& securityAccessType() const
    {return field_securityAccessType;}
  inline OCTETSTRING& securityAccessDataRecord()
    {return field_securityAccessDataRecord;}
  inline const OCTETSTRING& securityAccessDataRecord() const
    {return field_securityAccessDataRecord;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class RequestSeedRequest0_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
RequestSeedRequest0_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const RequestSeedRequest0& other_value);
void copy_template(const RequestSeedRequest0_template& other_value);

public:
RequestSeedRequest0_template();
RequestSeedRequest0_template(template_sel other_value);
RequestSeedRequest0_template(const RequestSeedRequest0& other_value);
RequestSeedRequest0_template(const OPTIONAL<RequestSeedRequest0>& other_value);
RequestSeedRequest0_template(const RequestSeedRequest0_template& other_value);
~RequestSeedRequest0_template();
RequestSeedRequest0_template& operator=(template_sel other_value);
RequestSeedRequest0_template& operator=(const RequestSeedRequest0& other_value);
RequestSeedRequest0_template& operator=(const OPTIONAL<RequestSeedRequest0>& other_value);
RequestSeedRequest0_template& operator=(const RequestSeedRequest0_template& other_value);
boolean match(const RequestSeedRequest0& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
RequestSeedRequest0 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
RequestSeedRequest0_template& list_item(unsigned int list_index) const;
BITSTRING_template& securityAccessType();
const BITSTRING_template& securityAccessType() const;
OCTETSTRING_template& securityAccessDataRecord();
const OCTETSTRING_template& securityAccessDataRecord() const;
int size_of() const;
void log() const;
void log_match(const RequestSeedRequest0& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class SendKeyRequest0 : public Base_Type {
  BITSTRING field_securityAccessType;
  OCTETSTRING field_securityKey;
public:
  SendKeyRequest0();
  SendKeyRequest0(const BITSTRING& par_securityAccessType,
    const OCTETSTRING& par_securityKey);
  SendKeyRequest0(const SendKeyRequest0& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  SendKeyRequest0& operator=(const SendKeyRequest0& other_value);
  boolean operator==(const SendKeyRequest0& other_value) const;
  inline boolean operator!=(const SendKeyRequest0& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& securityAccessType()
    {return field_securityAccessType;}
  inline const BITSTRING& securityAccessType() const
    {return field_securityAccessType;}
  inline OCTETSTRING& securityKey()
    {return field_securityKey;}
  inline const OCTETSTRING& securityKey() const
    {return field_securityKey;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class SendKeyRequest0_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
SendKeyRequest0_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const SendKeyRequest0& other_value);
void copy_template(const SendKeyRequest0_template& other_value);

public:
SendKeyRequest0_template();
SendKeyRequest0_template(template_sel other_value);
SendKeyRequest0_template(const SendKeyRequest0& other_value);
SendKeyRequest0_template(const OPTIONAL<SendKeyRequest0>& other_value);
SendKeyRequest0_template(const SendKeyRequest0_template& other_value);
~SendKeyRequest0_template();
SendKeyRequest0_template& operator=(template_sel other_value);
SendKeyRequest0_template& operator=(const SendKeyRequest0& other_value);
SendKeyRequest0_template& operator=(const OPTIONAL<SendKeyRequest0>& other_value);
SendKeyRequest0_template& operator=(const SendKeyRequest0_template& other_value);
boolean match(const SendKeyRequest0& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
SendKeyRequest0 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
SendKeyRequest0_template& list_item(unsigned int list_index) const;
BITSTRING_template& securityAccessType();
const BITSTRING_template& securityAccessType() const;
OCTETSTRING_template& securityKey();
const OCTETSTRING_template& securityKey() const;
int size_of() const;
void log() const;
void log_match(const SendKeyRequest0& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class RequestSeedRequest1 : public Base_Type {
  BITSTRING field_securityAccessType;
  OCTETSTRING field_securityAccessDataRecord;
public:
  RequestSeedRequest1();
  RequestSeedRequest1(const BITSTRING& par_securityAccessType,
    const OCTETSTRING& par_securityAccessDataRecord);
  RequestSeedRequest1(const RequestSeedRequest1& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  RequestSeedRequest1& operator=(const RequestSeedRequest1& other_value);
  boolean operator==(const RequestSeedRequest1& other_value) const;
  inline boolean operator!=(const RequestSeedRequest1& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& securityAccessType()
    {return field_securityAccessType;}
  inline const BITSTRING& securityAccessType() const
    {return field_securityAccessType;}
  inline OCTETSTRING& securityAccessDataRecord()
    {return field_securityAccessDataRecord;}
  inline const OCTETSTRING& securityAccessDataRecord() const
    {return field_securityAccessDataRecord;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class RequestSeedRequest1_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
RequestSeedRequest1_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const RequestSeedRequest1& other_value);
void copy_template(const RequestSeedRequest1_template& other_value);

public:
RequestSeedRequest1_template();
RequestSeedRequest1_template(template_sel other_value);
RequestSeedRequest1_template(const RequestSeedRequest1& other_value);
RequestSeedRequest1_template(const OPTIONAL<RequestSeedRequest1>& other_value);
RequestSeedRequest1_template(const RequestSeedRequest1_template& other_value);
~RequestSeedRequest1_template();
RequestSeedRequest1_template& operator=(template_sel other_value);
RequestSeedRequest1_template& operator=(const RequestSeedRequest1& other_value);
RequestSeedRequest1_template& operator=(const OPTIONAL<RequestSeedRequest1>& other_value);
RequestSeedRequest1_template& operator=(const RequestSeedRequest1_template& other_value);
boolean match(const RequestSeedRequest1& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
RequestSeedRequest1 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
RequestSeedRequest1_template& list_item(unsigned int list_index) const;
BITSTRING_template& securityAccessType();
const BITSTRING_template& securityAccessType() const;
OCTETSTRING_template& securityAccessDataRecord();
const OCTETSTRING_template& securityAccessDataRecord() const;
int size_of() const;
void log() const;
void log_match(const RequestSeedRequest1& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class SendKeyRequest1 : public Base_Type {
  BITSTRING field_securityAccessType;
  OCTETSTRING field_securityKey;
public:
  SendKeyRequest1();
  SendKeyRequest1(const BITSTRING& par_securityAccessType,
    const OCTETSTRING& par_securityKey);
  SendKeyRequest1(const SendKeyRequest1& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  SendKeyRequest1& operator=(const SendKeyRequest1& other_value);
  boolean operator==(const SendKeyRequest1& other_value) const;
  inline boolean operator!=(const SendKeyRequest1& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& securityAccessType()
    {return field_securityAccessType;}
  inline const BITSTRING& securityAccessType() const
    {return field_securityAccessType;}
  inline OCTETSTRING& securityKey()
    {return field_securityKey;}
  inline const OCTETSTRING& securityKey() const
    {return field_securityKey;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class SendKeyRequest1_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
SendKeyRequest1_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const SendKeyRequest1& other_value);
void copy_template(const SendKeyRequest1_template& other_value);

public:
SendKeyRequest1_template();
SendKeyRequest1_template(template_sel other_value);
SendKeyRequest1_template(const SendKeyRequest1& other_value);
SendKeyRequest1_template(const OPTIONAL<SendKeyRequest1>& other_value);
SendKeyRequest1_template(const SendKeyRequest1_template& other_value);
~SendKeyRequest1_template();
SendKeyRequest1_template& operator=(template_sel other_value);
SendKeyRequest1_template& operator=(const SendKeyRequest1& other_value);
SendKeyRequest1_template& operator=(const OPTIONAL<SendKeyRequest1>& other_value);
SendKeyRequest1_template& operator=(const SendKeyRequest1_template& other_value);
boolean match(const SendKeyRequest1& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
SendKeyRequest1 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
SendKeyRequest1_template& list_item(unsigned int list_index) const;
BITSTRING_template& securityAccessType();
const BITSTRING_template& securityAccessType() const;
OCTETSTRING_template& securityKey();
const OCTETSTRING_template& securityKey() const;
int size_of() const;
void log() const;
void log_match(const SendKeyRequest1& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class SecurityAccessRequestType : public Base_Type {
public:
enum union_selection_type { UNBOUND_VALUE = 0, ALT_requestSeed0 = 1, ALT_sendKey0 = 2, ALT_requestSeed1 = 3, ALT_sendKey1 = 4 };
private:
union_selection_type union_selection;
union {
RequestSeedRequest0 *field_requestSeed0;
SendKeyRequest0 *field_sendKey0;
RequestSeedRequest1 *field_requestSeed1;
SendKeyRequest1 *field_sendKey1;
};
void copy_value(const SecurityAccessRequestType& other_value);

public:
SecurityAccessRequestType();
SecurityAccessRequestType(const SecurityAccessRequestType& other_value);
~SecurityAccessRequestType();
SecurityAccessRequestType& operator=(const SecurityAccessRequestType& other_value);
boolean operator==(const SecurityAccessRequestType& other_value) const;
inline boolean operator!=(const SecurityAccessRequestType& other_value) const { return !(*this == other_value); }
RequestSeedRequest0& requestSeed0();
const RequestSeedRequest0& requestSeed0() const;
SendKeyRequest0& sendKey0();
const SendKeyRequest0& sendKey0() const;
RequestSeedRequest1& requestSeed1();
const RequestSeedRequest1& requestSeed1() const;
SendKeyRequest1& sendKey1();
const SendKeyRequest1& sendKey1() const;
inline union_selection_type get_selection() const { return union_selection; }
boolean ischosen(union_selection_type checked_selection) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
  void set_implicit_omit();
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class SecurityAccessRequestType_template : public Base_Template {
union {
struct {
SecurityAccessRequestType::union_selection_type union_selection;
union {
RequestSeedRequest0_template *field_requestSeed0;
SendKeyRequest0_template *field_sendKey0;
RequestSeedRequest1_template *field_requestSeed1;
SendKeyRequest1_template *field_sendKey1;
};
} single_value;
struct {
unsigned int n_values;
SecurityAccessRequestType_template *list_value;
} value_list;
};
void copy_value(const SecurityAccessRequestType& other_value);

void copy_template(const SecurityAccessRequestType_template& other_value);

public:
SecurityAccessRequestType_template();
SecurityAccessRequestType_template(template_sel other_value);
SecurityAccessRequestType_template(const SecurityAccessRequestType& other_value);
SecurityAccessRequestType_template(const OPTIONAL<SecurityAccessRequestType>& other_value);
SecurityAccessRequestType_template(const SecurityAccessRequestType_template& other_value);
~SecurityAccessRequestType_template();
void clean_up();
SecurityAccessRequestType_template& operator=(template_sel other_value);
SecurityAccessRequestType_template& operator=(const SecurityAccessRequestType& other_value);
SecurityAccessRequestType_template& operator=(const OPTIONAL<SecurityAccessRequestType>& other_value);
SecurityAccessRequestType_template& operator=(const SecurityAccessRequestType_template& other_value);
boolean match(const SecurityAccessRequestType& other_value, boolean legacy = FALSE) const;
boolean is_value() const;SecurityAccessRequestType valueof() const;
SecurityAccessRequestType_template& list_item(unsigned int list_index) const;
void set_type(template_sel template_type, unsigned int list_length);
RequestSeedRequest0_template& requestSeed0();
const RequestSeedRequest0_template& requestSeed0() const;
SendKeyRequest0_template& sendKey0();
const SendKeyRequest0_template& sendKey0() const;
RequestSeedRequest1_template& requestSeed1();
const RequestSeedRequest1_template& requestSeed1() const;
SendKeyRequest1_template& sendKey1();
const SendKeyRequest1_template& sendKey1() const;
boolean ischosen(SecurityAccessRequestType::union_selection_type checked_selection) const;
void log() const;
void log_match(const SecurityAccessRequestType& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class SecurityAccessRequestSID : public Base_Type {
  OCTETSTRING field_sid;
  SuppressPosRspMsgIndicationBitType field_suppressPosRspMsgIndicationBit;
  SecurityAccessRequestType field_securityAccessType;
public:
  SecurityAccessRequestSID();
  SecurityAccessRequestSID(const OCTETSTRING& par_sid,
    const SuppressPosRspMsgIndicationBitType& par_suppressPosRspMsgIndicationBit,
    const SecurityAccessRequestType& par_securityAccessType);
  SecurityAccessRequestSID(const SecurityAccessRequestSID& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  SecurityAccessRequestSID& operator=(const SecurityAccessRequestSID& other_value);
  boolean operator==(const SecurityAccessRequestSID& other_value) const;
  inline boolean operator!=(const SecurityAccessRequestSID& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& sid()
    {return field_sid;}
  inline const OCTETSTRING& sid() const
    {return field_sid;}
  inline SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit()
    {return field_suppressPosRspMsgIndicationBit;}
  inline const SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit() const
    {return field_suppressPosRspMsgIndicationBit;}
  inline SecurityAccessRequestType& securityAccessType()
    {return field_securityAccessType;}
  inline const SecurityAccessRequestType& securityAccessType() const
    {return field_securityAccessType;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class SecurityAccessRequestSID_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
SecurityAccessRequestSID_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const SecurityAccessRequestSID& other_value);
void copy_template(const SecurityAccessRequestSID_template& other_value);

public:
SecurityAccessRequestSID_template();
SecurityAccessRequestSID_template(template_sel other_value);
SecurityAccessRequestSID_template(const SecurityAccessRequestSID& other_value);
SecurityAccessRequestSID_template(const OPTIONAL<SecurityAccessRequestSID>& other_value);
SecurityAccessRequestSID_template(const SecurityAccessRequestSID_template& other_value);
~SecurityAccessRequestSID_template();
SecurityAccessRequestSID_template& operator=(template_sel other_value);
SecurityAccessRequestSID_template& operator=(const SecurityAccessRequestSID& other_value);
SecurityAccessRequestSID_template& operator=(const OPTIONAL<SecurityAccessRequestSID>& other_value);
SecurityAccessRequestSID_template& operator=(const SecurityAccessRequestSID_template& other_value);
boolean match(const SecurityAccessRequestSID& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
SecurityAccessRequestSID valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
SecurityAccessRequestSID_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& sid();
const OCTETSTRING_template& sid() const;
SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit();
const SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit() const;
SecurityAccessRequestType_template& securityAccessType();
const SecurityAccessRequestType_template& securityAccessType() const;
int size_of() const;
void log() const;
void log_match(const SecurityAccessRequestSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class RequestSeedResponse0 : public Base_Type {
  BITSTRING field_securityAccessType;
  OCTETSTRING field_securitySeed;
public:
  RequestSeedResponse0();
  RequestSeedResponse0(const BITSTRING& par_securityAccessType,
    const OCTETSTRING& par_securitySeed);
  RequestSeedResponse0(const RequestSeedResponse0& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  RequestSeedResponse0& operator=(const RequestSeedResponse0& other_value);
  boolean operator==(const RequestSeedResponse0& other_value) const;
  inline boolean operator!=(const RequestSeedResponse0& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& securityAccessType()
    {return field_securityAccessType;}
  inline const BITSTRING& securityAccessType() const
    {return field_securityAccessType;}
  inline OCTETSTRING& securitySeed()
    {return field_securitySeed;}
  inline const OCTETSTRING& securitySeed() const
    {return field_securitySeed;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class RequestSeedResponse0_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
RequestSeedResponse0_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const RequestSeedResponse0& other_value);
void copy_template(const RequestSeedResponse0_template& other_value);

public:
RequestSeedResponse0_template();
RequestSeedResponse0_template(template_sel other_value);
RequestSeedResponse0_template(const RequestSeedResponse0& other_value);
RequestSeedResponse0_template(const OPTIONAL<RequestSeedResponse0>& other_value);
RequestSeedResponse0_template(const RequestSeedResponse0_template& other_value);
~RequestSeedResponse0_template();
RequestSeedResponse0_template& operator=(template_sel other_value);
RequestSeedResponse0_template& operator=(const RequestSeedResponse0& other_value);
RequestSeedResponse0_template& operator=(const OPTIONAL<RequestSeedResponse0>& other_value);
RequestSeedResponse0_template& operator=(const RequestSeedResponse0_template& other_value);
boolean match(const RequestSeedResponse0& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
RequestSeedResponse0 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
RequestSeedResponse0_template& list_item(unsigned int list_index) const;
BITSTRING_template& securityAccessType();
const BITSTRING_template& securityAccessType() const;
OCTETSTRING_template& securitySeed();
const OCTETSTRING_template& securitySeed() const;
int size_of() const;
void log() const;
void log_match(const RequestSeedResponse0& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class SendKeyResponse0 : public Base_Type {
  BITSTRING field_securityAccessType;
public:
  SendKeyResponse0();
  SendKeyResponse0(const BITSTRING& par_securityAccessType);
  SendKeyResponse0(const SendKeyResponse0& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  SendKeyResponse0& operator=(const SendKeyResponse0& other_value);
  boolean operator==(const SendKeyResponse0& other_value) const;
  inline boolean operator!=(const SendKeyResponse0& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& securityAccessType()
    {return field_securityAccessType;}
  inline const BITSTRING& securityAccessType() const
    {return field_securityAccessType;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class SendKeyResponse0_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
SendKeyResponse0_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const SendKeyResponse0& other_value);
void copy_template(const SendKeyResponse0_template& other_value);

public:
SendKeyResponse0_template();
SendKeyResponse0_template(template_sel other_value);
SendKeyResponse0_template(const SendKeyResponse0& other_value);
SendKeyResponse0_template(const OPTIONAL<SendKeyResponse0>& other_value);
SendKeyResponse0_template(const SendKeyResponse0_template& other_value);
~SendKeyResponse0_template();
SendKeyResponse0_template& operator=(template_sel other_value);
SendKeyResponse0_template& operator=(const SendKeyResponse0& other_value);
SendKeyResponse0_template& operator=(const OPTIONAL<SendKeyResponse0>& other_value);
SendKeyResponse0_template& operator=(const SendKeyResponse0_template& other_value);
boolean match(const SendKeyResponse0& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
SendKeyResponse0 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
SendKeyResponse0_template& list_item(unsigned int list_index) const;
BITSTRING_template& securityAccessType();
const BITSTRING_template& securityAccessType() const;
int size_of() const;
void log() const;
void log_match(const SendKeyResponse0& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class RequestSeedResponse1 : public Base_Type {
  BITSTRING field_securityAccessType;
  OCTETSTRING field_securitySeed;
public:
  RequestSeedResponse1();
  RequestSeedResponse1(const BITSTRING& par_securityAccessType,
    const OCTETSTRING& par_securitySeed);
  RequestSeedResponse1(const RequestSeedResponse1& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  RequestSeedResponse1& operator=(const RequestSeedResponse1& other_value);
  boolean operator==(const RequestSeedResponse1& other_value) const;
  inline boolean operator!=(const RequestSeedResponse1& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& securityAccessType()
    {return field_securityAccessType;}
  inline const BITSTRING& securityAccessType() const
    {return field_securityAccessType;}
  inline OCTETSTRING& securitySeed()
    {return field_securitySeed;}
  inline const OCTETSTRING& securitySeed() const
    {return field_securitySeed;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class RequestSeedResponse1_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
RequestSeedResponse1_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const RequestSeedResponse1& other_value);
void copy_template(const RequestSeedResponse1_template& other_value);

public:
RequestSeedResponse1_template();
RequestSeedResponse1_template(template_sel other_value);
RequestSeedResponse1_template(const RequestSeedResponse1& other_value);
RequestSeedResponse1_template(const OPTIONAL<RequestSeedResponse1>& other_value);
RequestSeedResponse1_template(const RequestSeedResponse1_template& other_value);
~RequestSeedResponse1_template();
RequestSeedResponse1_template& operator=(template_sel other_value);
RequestSeedResponse1_template& operator=(const RequestSeedResponse1& other_value);
RequestSeedResponse1_template& operator=(const OPTIONAL<RequestSeedResponse1>& other_value);
RequestSeedResponse1_template& operator=(const RequestSeedResponse1_template& other_value);
boolean match(const RequestSeedResponse1& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
RequestSeedResponse1 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
RequestSeedResponse1_template& list_item(unsigned int list_index) const;
BITSTRING_template& securityAccessType();
const BITSTRING_template& securityAccessType() const;
OCTETSTRING_template& securitySeed();
const OCTETSTRING_template& securitySeed() const;
int size_of() const;
void log() const;
void log_match(const RequestSeedResponse1& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class SendKeyResponse1 : public Base_Type {
  BITSTRING field_securityAccessType;
public:
  SendKeyResponse1();
  SendKeyResponse1(const BITSTRING& par_securityAccessType);
  SendKeyResponse1(const SendKeyResponse1& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  SendKeyResponse1& operator=(const SendKeyResponse1& other_value);
  boolean operator==(const SendKeyResponse1& other_value) const;
  inline boolean operator!=(const SendKeyResponse1& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& securityAccessType()
    {return field_securityAccessType;}
  inline const BITSTRING& securityAccessType() const
    {return field_securityAccessType;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class SendKeyResponse1_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
SendKeyResponse1_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const SendKeyResponse1& other_value);
void copy_template(const SendKeyResponse1_template& other_value);

public:
SendKeyResponse1_template();
SendKeyResponse1_template(template_sel other_value);
SendKeyResponse1_template(const SendKeyResponse1& other_value);
SendKeyResponse1_template(const OPTIONAL<SendKeyResponse1>& other_value);
SendKeyResponse1_template(const SendKeyResponse1_template& other_value);
~SendKeyResponse1_template();
SendKeyResponse1_template& operator=(template_sel other_value);
SendKeyResponse1_template& operator=(const SendKeyResponse1& other_value);
SendKeyResponse1_template& operator=(const OPTIONAL<SendKeyResponse1>& other_value);
SendKeyResponse1_template& operator=(const SendKeyResponse1_template& other_value);
boolean match(const SendKeyResponse1& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
SendKeyResponse1 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
SendKeyResponse1_template& list_item(unsigned int list_index) const;
BITSTRING_template& securityAccessType();
const BITSTRING_template& securityAccessType() const;
int size_of() const;
void log() const;
void log_match(const SendKeyResponse1& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class SecurityAccessResponseType : public Base_Type {
public:
enum union_selection_type { UNBOUND_VALUE = 0, ALT_requestSeed0 = 1, ALT_sendKey0 = 2, ALT_requestSeed1 = 3, ALT_sendKey1 = 4 };
private:
union_selection_type union_selection;
union {
RequestSeedResponse0 *field_requestSeed0;
SendKeyResponse0 *field_sendKey0;
RequestSeedResponse1 *field_requestSeed1;
SendKeyResponse1 *field_sendKey1;
};
void copy_value(const SecurityAccessResponseType& other_value);

public:
SecurityAccessResponseType();
SecurityAccessResponseType(const SecurityAccessResponseType& other_value);
~SecurityAccessResponseType();
SecurityAccessResponseType& operator=(const SecurityAccessResponseType& other_value);
boolean operator==(const SecurityAccessResponseType& other_value) const;
inline boolean operator!=(const SecurityAccessResponseType& other_value) const { return !(*this == other_value); }
RequestSeedResponse0& requestSeed0();
const RequestSeedResponse0& requestSeed0() const;
SendKeyResponse0& sendKey0();
const SendKeyResponse0& sendKey0() const;
RequestSeedResponse1& requestSeed1();
const RequestSeedResponse1& requestSeed1() const;
SendKeyResponse1& sendKey1();
const SendKeyResponse1& sendKey1() const;
inline union_selection_type get_selection() const { return union_selection; }
boolean ischosen(union_selection_type checked_selection) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
  void set_implicit_omit();
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class SecurityAccessResponseType_template : public Base_Template {
union {
struct {
SecurityAccessResponseType::union_selection_type union_selection;
union {
RequestSeedResponse0_template *field_requestSeed0;
SendKeyResponse0_template *field_sendKey0;
RequestSeedResponse1_template *field_requestSeed1;
SendKeyResponse1_template *field_sendKey1;
};
} single_value;
struct {
unsigned int n_values;
SecurityAccessResponseType_template *list_value;
} value_list;
};
void copy_value(const SecurityAccessResponseType& other_value);

void copy_template(const SecurityAccessResponseType_template& other_value);

public:
SecurityAccessResponseType_template();
SecurityAccessResponseType_template(template_sel other_value);
SecurityAccessResponseType_template(const SecurityAccessResponseType& other_value);
SecurityAccessResponseType_template(const OPTIONAL<SecurityAccessResponseType>& other_value);
SecurityAccessResponseType_template(const SecurityAccessResponseType_template& other_value);
~SecurityAccessResponseType_template();
void clean_up();
SecurityAccessResponseType_template& operator=(template_sel other_value);
SecurityAccessResponseType_template& operator=(const SecurityAccessResponseType& other_value);
SecurityAccessResponseType_template& operator=(const OPTIONAL<SecurityAccessResponseType>& other_value);
SecurityAccessResponseType_template& operator=(const SecurityAccessResponseType_template& other_value);
boolean match(const SecurityAccessResponseType& other_value, boolean legacy = FALSE) const;
boolean is_value() const;SecurityAccessResponseType valueof() const;
SecurityAccessResponseType_template& list_item(unsigned int list_index) const;
void set_type(template_sel template_type, unsigned int list_length);
RequestSeedResponse0_template& requestSeed0();
const RequestSeedResponse0_template& requestSeed0() const;
SendKeyResponse0_template& sendKey0();
const SendKeyResponse0_template& sendKey0() const;
RequestSeedResponse1_template& requestSeed1();
const RequestSeedResponse1_template& requestSeed1() const;
SendKeyResponse1_template& sendKey1();
const SendKeyResponse1_template& sendKey1() const;
boolean ischosen(SecurityAccessResponseType::union_selection_type checked_selection) const;
void log() const;
void log_match(const SecurityAccessResponseType& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class SecurityAccessResponseSID : public Base_Type {
  OCTETSTRING field_sid;
  BITSTRING field_reserved;
  SecurityAccessResponseType field_securityAccessType;
public:
  SecurityAccessResponseSID();
  SecurityAccessResponseSID(const OCTETSTRING& par_sid,
    const BITSTRING& par_reserved,
    const SecurityAccessResponseType& par_securityAccessType);
  SecurityAccessResponseSID(const SecurityAccessResponseSID& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  SecurityAccessResponseSID& operator=(const SecurityAccessResponseSID& other_value);
  boolean operator==(const SecurityAccessResponseSID& other_value) const;
  inline boolean operator!=(const SecurityAccessResponseSID& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& sid()
    {return field_sid;}
  inline const OCTETSTRING& sid() const
    {return field_sid;}
  inline BITSTRING& reserved()
    {return field_reserved;}
  inline const BITSTRING& reserved() const
    {return field_reserved;}
  inline SecurityAccessResponseType& securityAccessType()
    {return field_securityAccessType;}
  inline const SecurityAccessResponseType& securityAccessType() const
    {return field_securityAccessType;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class SecurityAccessResponseSID_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
SecurityAccessResponseSID_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const SecurityAccessResponseSID& other_value);
void copy_template(const SecurityAccessResponseSID_template& other_value);

public:
SecurityAccessResponseSID_template();
SecurityAccessResponseSID_template(template_sel other_value);
SecurityAccessResponseSID_template(const SecurityAccessResponseSID& other_value);
SecurityAccessResponseSID_template(const OPTIONAL<SecurityAccessResponseSID>& other_value);
SecurityAccessResponseSID_template(const SecurityAccessResponseSID_template& other_value);
~SecurityAccessResponseSID_template();
SecurityAccessResponseSID_template& operator=(template_sel other_value);
SecurityAccessResponseSID_template& operator=(const SecurityAccessResponseSID& other_value);
SecurityAccessResponseSID_template& operator=(const OPTIONAL<SecurityAccessResponseSID>& other_value);
SecurityAccessResponseSID_template& operator=(const SecurityAccessResponseSID_template& other_value);
boolean match(const SecurityAccessResponseSID& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
SecurityAccessResponseSID valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
SecurityAccessResponseSID_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& sid();
const OCTETSTRING_template& sid() const;
BITSTRING_template& reserved();
const BITSTRING_template& reserved() const;
SecurityAccessResponseType_template& securityAccessType();
const SecurityAccessResponseType_template& securityAccessType() const;
int size_of() const;
void log() const;
void log_match(const SecurityAccessResponseSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class e__ControlType : public Base_Type { // enum
friend class e__ControlType_template;
public:
enum enum_type { EnableRxAndTx = 0, EnableRxAndDisableTx = 1, DisableRxAndEnableTx = 2, DisableRxAndTx = 3, EnableRxAndDisableTxWithEnhancedAddressInformation = 4, EnableRxAndTxWithEnhancedAddressInformation = 5, UNKNOWN_VALUE = 6, UNBOUND_VALUE = 7 };
private:
enum_type enum_value;

public:
e__ControlType();
e__ControlType(int other_value);
e__ControlType(enum_type other_value);
e__ControlType(const e__ControlType& other_value);

e__ControlType& operator=(int other_value);
e__ControlType& operator=(enum_type other_value);
e__ControlType& operator=(const e__ControlType& other_value);

boolean operator==(enum_type other_value) const;
boolean operator==(const e__ControlType& other_value) const;
inline boolean operator!=(enum_type other_value) const { return !(*this == other_value); }
inline boolean operator!=(const e__ControlType& other_value) const { return !(*this == other_value); }
boolean operator<(enum_type other_value) const;
boolean operator<(const e__ControlType& other_value) const;
boolean operator>(enum_type other_value) const;
boolean operator>(const e__ControlType& other_value) const;
inline boolean operator<=(enum_type other_value) const { return !(*this > other_value); }
inline boolean operator<=(const e__ControlType& other_value) const { return !(*this > other_value); }
inline boolean operator>=(enum_type other_value) const { return !(*this < other_value); }
inline boolean operator>=(const e__ControlType& other_value) const { return !(*this < other_value); }

static const char *enum_to_str(enum_type enum_par);
static enum_type str_to_enum(const char *str_par);
static boolean is_valid_enum(int int_par);

static int enum2int(enum_type enum_par);
static int enum2int(const e__ControlType& enum_par);
int as_int() const { return enum2int(enum_value); }
void from_int(int p_val) { *this = p_val; }
void int2enum(int int_val);
operator enum_type() const;
inline boolean is_bound() const { return enum_value != UNBOUND_VALUE; }
inline boolean is_value() const { return enum_value != UNBOUND_VALUE; }
inline void clean_up(){ enum_value = UNBOUND_VALUE; }
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class e__ControlType_template : public Base_Template {
union {
e__ControlType::enum_type single_value;
struct {
unsigned int n_values;
e__ControlType_template *list_value;
} value_list;
};

void copy_template(const e__ControlType_template& other_value);

public:
e__ControlType_template();
e__ControlType_template(template_sel other_value);
e__ControlType_template(int other_value);
e__ControlType_template(e__ControlType::enum_type other_value);
e__ControlType_template(const e__ControlType& other_value);
e__ControlType_template(const OPTIONAL<e__ControlType>& other_value);
e__ControlType_template(const e__ControlType_template& other_value);
~e__ControlType_template();

boolean is_bound() const;
boolean is_value() const;
void clean_up();
e__ControlType_template& operator=(template_sel other_value);
e__ControlType_template& operator=(int other_value);
e__ControlType_template& operator=(e__ControlType::enum_type other_value);
e__ControlType_template& operator=(const e__ControlType& other_value);
e__ControlType_template& operator=(const OPTIONAL<e__ControlType>& other_value);
e__ControlType_template& operator=(const e__ControlType_template& other_value);

boolean match(e__ControlType::enum_type other_value, boolean legacy = FALSE) const;
boolean match(const e__ControlType& other_value, boolean legacy = FALSE) const;
e__ControlType::enum_type valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
e__ControlType_template& list_item(unsigned int list_index);
void log() const;
void log_match(const e__ControlType& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class e__DisableEnable : public Base_Type { // enum
friend class e__DisableEnable_template;
public:
enum enum_type { DisableEnableSpecifiedCommunicationType = 0, DisableEnableSpecificSubnetIdentifiedBySubnetNumber1 = 1, DisableEnableSpecificSubnetIdentifiedBySubnetNumber2 = 2, DisableEnableSpecificSubnetIdentifiedBySubnetNumber3 = 3, DisableEnableSpecificSubnetIdentifiedBySubnetNumber4 = 4, DisableEnableSpecificSubnetIdentifiedBySubnetNumber5 = 5, DisableEnableSpecificSubnetIdentifiedBySubnetNumber6 = 6, DisableEnableSpecificSubnetIdentifiedBySubnetNumber7 = 7, DisableEnableSpecificSubnetIdentifiedBySubnetNumber8 = 8, DisableEnableSpecificSubnetIdentifiedBySubnetNumber9 = 9, DisableEnableSpecificSubnetIdentifiedBySubnetNumber10 = 10, DisableEnableSpecificSubnetIdentifiedBySubnetNumber11 = 11, DisableEnableSpecificSubnetIdentifiedBySubnetNumber12 = 12, DisableEnableSpecificSubnetIdentifiedBySubnetNumber13 = 13, DisableEnableSpecificSubnetIdentifiedBySubnetNumber14 = 14, DisableEnableNetworkWhichRequestIsReceivedOn = 15, UNKNOWN_VALUE = 16, UNBOUND_VALUE = 17 };
private:
enum_type enum_value;

public:
e__DisableEnable();
e__DisableEnable(int other_value);
e__DisableEnable(enum_type other_value);
e__DisableEnable(const e__DisableEnable& other_value);

e__DisableEnable& operator=(int other_value);
e__DisableEnable& operator=(enum_type other_value);
e__DisableEnable& operator=(const e__DisableEnable& other_value);

boolean operator==(enum_type other_value) const;
boolean operator==(const e__DisableEnable& other_value) const;
inline boolean operator!=(enum_type other_value) const { return !(*this == other_value); }
inline boolean operator!=(const e__DisableEnable& other_value) const { return !(*this == other_value); }
boolean operator<(enum_type other_value) const;
boolean operator<(const e__DisableEnable& other_value) const;
boolean operator>(enum_type other_value) const;
boolean operator>(const e__DisableEnable& other_value) const;
inline boolean operator<=(enum_type other_value) const { return !(*this > other_value); }
inline boolean operator<=(const e__DisableEnable& other_value) const { return !(*this > other_value); }
inline boolean operator>=(enum_type other_value) const { return !(*this < other_value); }
inline boolean operator>=(const e__DisableEnable& other_value) const { return !(*this < other_value); }

static const char *enum_to_str(enum_type enum_par);
static enum_type str_to_enum(const char *str_par);
static boolean is_valid_enum(int int_par);

static int enum2int(enum_type enum_par);
static int enum2int(const e__DisableEnable& enum_par);
int as_int() const { return enum2int(enum_value); }
void from_int(int p_val) { *this = p_val; }
void int2enum(int int_val);
operator enum_type() const;
inline boolean is_bound() const { return enum_value != UNBOUND_VALUE; }
inline boolean is_value() const { return enum_value != UNBOUND_VALUE; }
inline void clean_up(){ enum_value = UNBOUND_VALUE; }
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class e__DisableEnable_template : public Base_Template {
union {
e__DisableEnable::enum_type single_value;
struct {
unsigned int n_values;
e__DisableEnable_template *list_value;
} value_list;
};

void copy_template(const e__DisableEnable_template& other_value);

public:
e__DisableEnable_template();
e__DisableEnable_template(template_sel other_value);
e__DisableEnable_template(int other_value);
e__DisableEnable_template(e__DisableEnable::enum_type other_value);
e__DisableEnable_template(const e__DisableEnable& other_value);
e__DisableEnable_template(const OPTIONAL<e__DisableEnable>& other_value);
e__DisableEnable_template(const e__DisableEnable_template& other_value);
~e__DisableEnable_template();

boolean is_bound() const;
boolean is_value() const;
void clean_up();
e__DisableEnable_template& operator=(template_sel other_value);
e__DisableEnable_template& operator=(int other_value);
e__DisableEnable_template& operator=(e__DisableEnable::enum_type other_value);
e__DisableEnable_template& operator=(const e__DisableEnable& other_value);
e__DisableEnable_template& operator=(const OPTIONAL<e__DisableEnable>& other_value);
e__DisableEnable_template& operator=(const e__DisableEnable_template& other_value);

boolean match(e__DisableEnable::enum_type other_value, boolean legacy = FALSE) const;
boolean match(const e__DisableEnable& other_value, boolean legacy = FALSE) const;
e__DisableEnable::enum_type valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
e__DisableEnable_template& list_item(unsigned int list_index);
void log() const;
void log_match(const e__DisableEnable& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class e__CommunicationMessages : public Base_Type { // enum
friend class e__CommunicationMessages_template;
public:
enum enum_type { normalMessages = 1, networkManagement = 2, UNKNOWN_VALUE = 0, UNBOUND_VALUE = 3 };
private:
enum_type enum_value;

public:
e__CommunicationMessages();
e__CommunicationMessages(int other_value);
e__CommunicationMessages(enum_type other_value);
e__CommunicationMessages(const e__CommunicationMessages& other_value);

e__CommunicationMessages& operator=(int other_value);
e__CommunicationMessages& operator=(enum_type other_value);
e__CommunicationMessages& operator=(const e__CommunicationMessages& other_value);

boolean operator==(enum_type other_value) const;
boolean operator==(const e__CommunicationMessages& other_value) const;
inline boolean operator!=(enum_type other_value) const { return !(*this == other_value); }
inline boolean operator!=(const e__CommunicationMessages& other_value) const { return !(*this == other_value); }
boolean operator<(enum_type other_value) const;
boolean operator<(const e__CommunicationMessages& other_value) const;
boolean operator>(enum_type other_value) const;
boolean operator>(const e__CommunicationMessages& other_value) const;
inline boolean operator<=(enum_type other_value) const { return !(*this > other_value); }
inline boolean operator<=(const e__CommunicationMessages& other_value) const { return !(*this > other_value); }
inline boolean operator>=(enum_type other_value) const { return !(*this < other_value); }
inline boolean operator>=(const e__CommunicationMessages& other_value) const { return !(*this < other_value); }

static const char *enum_to_str(enum_type enum_par);
static enum_type str_to_enum(const char *str_par);
static boolean is_valid_enum(int int_par);

static int enum2int(enum_type enum_par);
static int enum2int(const e__CommunicationMessages& enum_par);
int as_int() const { return enum2int(enum_value); }
void from_int(int p_val) { *this = p_val; }
void int2enum(int int_val);
operator enum_type() const;
inline boolean is_bound() const { return enum_value != UNBOUND_VALUE; }
inline boolean is_value() const { return enum_value != UNBOUND_VALUE; }
inline void clean_up(){ enum_value = UNBOUND_VALUE; }
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class e__CommunicationMessages_template : public Base_Template {
union {
e__CommunicationMessages::enum_type single_value;
struct {
unsigned int n_values;
e__CommunicationMessages_template *list_value;
} value_list;
};

void copy_template(const e__CommunicationMessages_template& other_value);

public:
e__CommunicationMessages_template();
e__CommunicationMessages_template(template_sel other_value);
e__CommunicationMessages_template(int other_value);
e__CommunicationMessages_template(e__CommunicationMessages::enum_type other_value);
e__CommunicationMessages_template(const e__CommunicationMessages& other_value);
e__CommunicationMessages_template(const OPTIONAL<e__CommunicationMessages>& other_value);
e__CommunicationMessages_template(const e__CommunicationMessages_template& other_value);
~e__CommunicationMessages_template();

boolean is_bound() const;
boolean is_value() const;
void clean_up();
e__CommunicationMessages_template& operator=(template_sel other_value);
e__CommunicationMessages_template& operator=(int other_value);
e__CommunicationMessages_template& operator=(e__CommunicationMessages::enum_type other_value);
e__CommunicationMessages_template& operator=(const e__CommunicationMessages& other_value);
e__CommunicationMessages_template& operator=(const OPTIONAL<e__CommunicationMessages>& other_value);
e__CommunicationMessages_template& operator=(const e__CommunicationMessages_template& other_value);

boolean match(e__CommunicationMessages::enum_type other_value, boolean legacy = FALSE) const;
boolean match(const e__CommunicationMessages& other_value, boolean legacy = FALSE) const;
e__CommunicationMessages::enum_type valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
e__CommunicationMessages_template& list_item(unsigned int list_index);
void log() const;
void log_match(const e__CommunicationMessages& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class CommunicationType : public Base_Type {
  e__DisableEnable field_disableEnable;
  BITSTRING field_reserved;
  e__CommunicationMessages field_communicationMessages;
public:
  CommunicationType();
  CommunicationType(const e__DisableEnable& par_disableEnable,
    const BITSTRING& par_reserved,
    const e__CommunicationMessages& par_communicationMessages);
  CommunicationType(const CommunicationType& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  CommunicationType& operator=(const CommunicationType& other_value);
  boolean operator==(const CommunicationType& other_value) const;
  inline boolean operator!=(const CommunicationType& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline e__DisableEnable& disableEnable()
    {return field_disableEnable;}
  inline const e__DisableEnable& disableEnable() const
    {return field_disableEnable;}
  inline BITSTRING& reserved()
    {return field_reserved;}
  inline const BITSTRING& reserved() const
    {return field_reserved;}
  inline e__CommunicationMessages& communicationMessages()
    {return field_communicationMessages;}
  inline const e__CommunicationMessages& communicationMessages() const
    {return field_communicationMessages;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class CommunicationType_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
CommunicationType_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const CommunicationType& other_value);
void copy_template(const CommunicationType_template& other_value);

public:
CommunicationType_template();
CommunicationType_template(template_sel other_value);
CommunicationType_template(const CommunicationType& other_value);
CommunicationType_template(const OPTIONAL<CommunicationType>& other_value);
CommunicationType_template(const CommunicationType_template& other_value);
~CommunicationType_template();
CommunicationType_template& operator=(template_sel other_value);
CommunicationType_template& operator=(const CommunicationType& other_value);
CommunicationType_template& operator=(const OPTIONAL<CommunicationType>& other_value);
CommunicationType_template& operator=(const CommunicationType_template& other_value);
boolean match(const CommunicationType& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
CommunicationType valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
CommunicationType_template& list_item(unsigned int list_index) const;
e__DisableEnable_template& disableEnable();
const e__DisableEnable_template& disableEnable() const;
BITSTRING_template& reserved();
const BITSTRING_template& reserved() const;
e__CommunicationMessages_template& communicationMessages();
const e__CommunicationMessages_template& communicationMessages() const;
int size_of() const;
void log() const;
void log_match(const CommunicationType& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class EnableRxAndTxRequest : public Base_Type {
  SuppressPosRspMsgIndicationBitType field_suppressPosRspMsgIndicationBit;
  BITSTRING field_controlType;
  CommunicationType field_communicationType;
public:
  EnableRxAndTxRequest();
  EnableRxAndTxRequest(const SuppressPosRspMsgIndicationBitType& par_suppressPosRspMsgIndicationBit,
    const BITSTRING& par_controlType,
    const CommunicationType& par_communicationType);
  EnableRxAndTxRequest(const EnableRxAndTxRequest& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  EnableRxAndTxRequest& operator=(const EnableRxAndTxRequest& other_value);
  boolean operator==(const EnableRxAndTxRequest& other_value) const;
  inline boolean operator!=(const EnableRxAndTxRequest& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit()
    {return field_suppressPosRspMsgIndicationBit;}
  inline const SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit() const
    {return field_suppressPosRspMsgIndicationBit;}
  inline BITSTRING& controlType()
    {return field_controlType;}
  inline const BITSTRING& controlType() const
    {return field_controlType;}
  inline CommunicationType& communicationType()
    {return field_communicationType;}
  inline const CommunicationType& communicationType() const
    {return field_communicationType;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class EnableRxAndTxRequest_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
EnableRxAndTxRequest_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const EnableRxAndTxRequest& other_value);
void copy_template(const EnableRxAndTxRequest_template& other_value);

public:
EnableRxAndTxRequest_template();
EnableRxAndTxRequest_template(template_sel other_value);
EnableRxAndTxRequest_template(const EnableRxAndTxRequest& other_value);
EnableRxAndTxRequest_template(const OPTIONAL<EnableRxAndTxRequest>& other_value);
EnableRxAndTxRequest_template(const EnableRxAndTxRequest_template& other_value);
~EnableRxAndTxRequest_template();
EnableRxAndTxRequest_template& operator=(template_sel other_value);
EnableRxAndTxRequest_template& operator=(const EnableRxAndTxRequest& other_value);
EnableRxAndTxRequest_template& operator=(const OPTIONAL<EnableRxAndTxRequest>& other_value);
EnableRxAndTxRequest_template& operator=(const EnableRxAndTxRequest_template& other_value);
boolean match(const EnableRxAndTxRequest& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
EnableRxAndTxRequest valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
EnableRxAndTxRequest_template& list_item(unsigned int list_index) const;
SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit();
const SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit() const;
BITSTRING_template& controlType();
const BITSTRING_template& controlType() const;
CommunicationType_template& communicationType();
const CommunicationType_template& communicationType() const;
int size_of() const;
void log() const;
void log_match(const EnableRxAndTxRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class EnableRxAndDisableTxRequest : public Base_Type {
  SuppressPosRspMsgIndicationBitType field_suppressPosRspMsgIndicationBit;
  BITSTRING field_controlType;
  CommunicationType field_communicationType;
public:
  EnableRxAndDisableTxRequest();
  EnableRxAndDisableTxRequest(const SuppressPosRspMsgIndicationBitType& par_suppressPosRspMsgIndicationBit,
    const BITSTRING& par_controlType,
    const CommunicationType& par_communicationType);
  EnableRxAndDisableTxRequest(const EnableRxAndDisableTxRequest& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  EnableRxAndDisableTxRequest& operator=(const EnableRxAndDisableTxRequest& other_value);
  boolean operator==(const EnableRxAndDisableTxRequest& other_value) const;
  inline boolean operator!=(const EnableRxAndDisableTxRequest& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit()
    {return field_suppressPosRspMsgIndicationBit;}
  inline const SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit() const
    {return field_suppressPosRspMsgIndicationBit;}
  inline BITSTRING& controlType()
    {return field_controlType;}
  inline const BITSTRING& controlType() const
    {return field_controlType;}
  inline CommunicationType& communicationType()
    {return field_communicationType;}
  inline const CommunicationType& communicationType() const
    {return field_communicationType;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class EnableRxAndDisableTxRequest_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
EnableRxAndDisableTxRequest_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const EnableRxAndDisableTxRequest& other_value);
void copy_template(const EnableRxAndDisableTxRequest_template& other_value);

public:
EnableRxAndDisableTxRequest_template();
EnableRxAndDisableTxRequest_template(template_sel other_value);
EnableRxAndDisableTxRequest_template(const EnableRxAndDisableTxRequest& other_value);
EnableRxAndDisableTxRequest_template(const OPTIONAL<EnableRxAndDisableTxRequest>& other_value);
EnableRxAndDisableTxRequest_template(const EnableRxAndDisableTxRequest_template& other_value);
~EnableRxAndDisableTxRequest_template();
EnableRxAndDisableTxRequest_template& operator=(template_sel other_value);
EnableRxAndDisableTxRequest_template& operator=(const EnableRxAndDisableTxRequest& other_value);
EnableRxAndDisableTxRequest_template& operator=(const OPTIONAL<EnableRxAndDisableTxRequest>& other_value);
EnableRxAndDisableTxRequest_template& operator=(const EnableRxAndDisableTxRequest_template& other_value);
boolean match(const EnableRxAndDisableTxRequest& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
EnableRxAndDisableTxRequest valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
EnableRxAndDisableTxRequest_template& list_item(unsigned int list_index) const;
SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit();
const SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit() const;
BITSTRING_template& controlType();
const BITSTRING_template& controlType() const;
CommunicationType_template& communicationType();
const CommunicationType_template& communicationType() const;
int size_of() const;
void log() const;
void log_match(const EnableRxAndDisableTxRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class DisableRxAndEnableTxRequest : public Base_Type {
  SuppressPosRspMsgIndicationBitType field_suppressPosRspMsgIndicationBit;
  BITSTRING field_controlType;
  CommunicationType field_communicationType;
public:
  DisableRxAndEnableTxRequest();
  DisableRxAndEnableTxRequest(const SuppressPosRspMsgIndicationBitType& par_suppressPosRspMsgIndicationBit,
    const BITSTRING& par_controlType,
    const CommunicationType& par_communicationType);
  DisableRxAndEnableTxRequest(const DisableRxAndEnableTxRequest& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  DisableRxAndEnableTxRequest& operator=(const DisableRxAndEnableTxRequest& other_value);
  boolean operator==(const DisableRxAndEnableTxRequest& other_value) const;
  inline boolean operator!=(const DisableRxAndEnableTxRequest& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit()
    {return field_suppressPosRspMsgIndicationBit;}
  inline const SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit() const
    {return field_suppressPosRspMsgIndicationBit;}
  inline BITSTRING& controlType()
    {return field_controlType;}
  inline const BITSTRING& controlType() const
    {return field_controlType;}
  inline CommunicationType& communicationType()
    {return field_communicationType;}
  inline const CommunicationType& communicationType() const
    {return field_communicationType;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class DisableRxAndEnableTxRequest_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
DisableRxAndEnableTxRequest_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const DisableRxAndEnableTxRequest& other_value);
void copy_template(const DisableRxAndEnableTxRequest_template& other_value);

public:
DisableRxAndEnableTxRequest_template();
DisableRxAndEnableTxRequest_template(template_sel other_value);
DisableRxAndEnableTxRequest_template(const DisableRxAndEnableTxRequest& other_value);
DisableRxAndEnableTxRequest_template(const OPTIONAL<DisableRxAndEnableTxRequest>& other_value);
DisableRxAndEnableTxRequest_template(const DisableRxAndEnableTxRequest_template& other_value);
~DisableRxAndEnableTxRequest_template();
DisableRxAndEnableTxRequest_template& operator=(template_sel other_value);
DisableRxAndEnableTxRequest_template& operator=(const DisableRxAndEnableTxRequest& other_value);
DisableRxAndEnableTxRequest_template& operator=(const OPTIONAL<DisableRxAndEnableTxRequest>& other_value);
DisableRxAndEnableTxRequest_template& operator=(const DisableRxAndEnableTxRequest_template& other_value);
boolean match(const DisableRxAndEnableTxRequest& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
DisableRxAndEnableTxRequest valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
DisableRxAndEnableTxRequest_template& list_item(unsigned int list_index) const;
SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit();
const SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit() const;
BITSTRING_template& controlType();
const BITSTRING_template& controlType() const;
CommunicationType_template& communicationType();
const CommunicationType_template& communicationType() const;
int size_of() const;
void log() const;
void log_match(const DisableRxAndEnableTxRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class DisableRxAndTxRequest : public Base_Type {
  SuppressPosRspMsgIndicationBitType field_suppressPosRspMsgIndicationBit;
  BITSTRING field_controlType;
  CommunicationType field_communicationType;
public:
  DisableRxAndTxRequest();
  DisableRxAndTxRequest(const SuppressPosRspMsgIndicationBitType& par_suppressPosRspMsgIndicationBit,
    const BITSTRING& par_controlType,
    const CommunicationType& par_communicationType);
  DisableRxAndTxRequest(const DisableRxAndTxRequest& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  DisableRxAndTxRequest& operator=(const DisableRxAndTxRequest& other_value);
  boolean operator==(const DisableRxAndTxRequest& other_value) const;
  inline boolean operator!=(const DisableRxAndTxRequest& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit()
    {return field_suppressPosRspMsgIndicationBit;}
  inline const SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit() const
    {return field_suppressPosRspMsgIndicationBit;}
  inline BITSTRING& controlType()
    {return field_controlType;}
  inline const BITSTRING& controlType() const
    {return field_controlType;}
  inline CommunicationType& communicationType()
    {return field_communicationType;}
  inline const CommunicationType& communicationType() const
    {return field_communicationType;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class DisableRxAndTxRequest_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
DisableRxAndTxRequest_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const DisableRxAndTxRequest& other_value);
void copy_template(const DisableRxAndTxRequest_template& other_value);

public:
DisableRxAndTxRequest_template();
DisableRxAndTxRequest_template(template_sel other_value);
DisableRxAndTxRequest_template(const DisableRxAndTxRequest& other_value);
DisableRxAndTxRequest_template(const OPTIONAL<DisableRxAndTxRequest>& other_value);
DisableRxAndTxRequest_template(const DisableRxAndTxRequest_template& other_value);
~DisableRxAndTxRequest_template();
DisableRxAndTxRequest_template& operator=(template_sel other_value);
DisableRxAndTxRequest_template& operator=(const DisableRxAndTxRequest& other_value);
DisableRxAndTxRequest_template& operator=(const OPTIONAL<DisableRxAndTxRequest>& other_value);
DisableRxAndTxRequest_template& operator=(const DisableRxAndTxRequest_template& other_value);
boolean match(const DisableRxAndTxRequest& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
DisableRxAndTxRequest valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
DisableRxAndTxRequest_template& list_item(unsigned int list_index) const;
SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit();
const SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit() const;
BITSTRING_template& controlType();
const BITSTRING_template& controlType() const;
CommunicationType_template& communicationType();
const CommunicationType_template& communicationType() const;
int size_of() const;
void log() const;
void log_match(const DisableRxAndTxRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class EnableRxAndDisableTxWithEnhancedAddressInformationRequest : public Base_Type {
  SuppressPosRspMsgIndicationBitType field_suppressPosRspMsgIndicationBit;
  BITSTRING field_controlType;
  CommunicationType field_communicationType;
  OCTETSTRING field_nodeIdentificationNumber;
public:
  EnableRxAndDisableTxWithEnhancedAddressInformationRequest();
  EnableRxAndDisableTxWithEnhancedAddressInformationRequest(const SuppressPosRspMsgIndicationBitType& par_suppressPosRspMsgIndicationBit,
    const BITSTRING& par_controlType,
    const CommunicationType& par_communicationType,
    const OCTETSTRING& par_nodeIdentificationNumber);
  EnableRxAndDisableTxWithEnhancedAddressInformationRequest(const EnableRxAndDisableTxWithEnhancedAddressInformationRequest& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  EnableRxAndDisableTxWithEnhancedAddressInformationRequest& operator=(const EnableRxAndDisableTxWithEnhancedAddressInformationRequest& other_value);
  boolean operator==(const EnableRxAndDisableTxWithEnhancedAddressInformationRequest& other_value) const;
  inline boolean operator!=(const EnableRxAndDisableTxWithEnhancedAddressInformationRequest& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit()
    {return field_suppressPosRspMsgIndicationBit;}
  inline const SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit() const
    {return field_suppressPosRspMsgIndicationBit;}
  inline BITSTRING& controlType()
    {return field_controlType;}
  inline const BITSTRING& controlType() const
    {return field_controlType;}
  inline CommunicationType& communicationType()
    {return field_communicationType;}
  inline const CommunicationType& communicationType() const
    {return field_communicationType;}
  inline OCTETSTRING& nodeIdentificationNumber()
    {return field_nodeIdentificationNumber;}
  inline const OCTETSTRING& nodeIdentificationNumber() const
    {return field_nodeIdentificationNumber;}
  inline int size_of() const
    {return 4;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const EnableRxAndDisableTxWithEnhancedAddressInformationRequest& other_value);
void copy_template(const EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template& other_value);

public:
EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template();
EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template(template_sel other_value);
EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template(const EnableRxAndDisableTxWithEnhancedAddressInformationRequest& other_value);
EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template(const OPTIONAL<EnableRxAndDisableTxWithEnhancedAddressInformationRequest>& other_value);
EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template(const EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template& other_value);
~EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template();
EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template& operator=(template_sel other_value);
EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template& operator=(const EnableRxAndDisableTxWithEnhancedAddressInformationRequest& other_value);
EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template& operator=(const OPTIONAL<EnableRxAndDisableTxWithEnhancedAddressInformationRequest>& other_value);
EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template& operator=(const EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template& other_value);
boolean match(const EnableRxAndDisableTxWithEnhancedAddressInformationRequest& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
EnableRxAndDisableTxWithEnhancedAddressInformationRequest valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template& list_item(unsigned int list_index) const;
SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit();
const SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit() const;
BITSTRING_template& controlType();
const BITSTRING_template& controlType() const;
CommunicationType_template& communicationType();
const CommunicationType_template& communicationType() const;
OCTETSTRING_template& nodeIdentificationNumber();
const OCTETSTRING_template& nodeIdentificationNumber() const;
int size_of() const;
void log() const;
void log_match(const EnableRxAndDisableTxWithEnhancedAddressInformationRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class EnableRxAndTxWithEnhancedAddressInformationRequest : public Base_Type {
  SuppressPosRspMsgIndicationBitType field_suppressPosRspMsgIndicationBit;
  BITSTRING field_controlType;
  CommunicationType field_communicationType;
  OCTETSTRING field_nodeIdentificationNumber;
public:
  EnableRxAndTxWithEnhancedAddressInformationRequest();
  EnableRxAndTxWithEnhancedAddressInformationRequest(const SuppressPosRspMsgIndicationBitType& par_suppressPosRspMsgIndicationBit,
    const BITSTRING& par_controlType,
    const CommunicationType& par_communicationType,
    const OCTETSTRING& par_nodeIdentificationNumber);
  EnableRxAndTxWithEnhancedAddressInformationRequest(const EnableRxAndTxWithEnhancedAddressInformationRequest& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  EnableRxAndTxWithEnhancedAddressInformationRequest& operator=(const EnableRxAndTxWithEnhancedAddressInformationRequest& other_value);
  boolean operator==(const EnableRxAndTxWithEnhancedAddressInformationRequest& other_value) const;
  inline boolean operator!=(const EnableRxAndTxWithEnhancedAddressInformationRequest& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit()
    {return field_suppressPosRspMsgIndicationBit;}
  inline const SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit() const
    {return field_suppressPosRspMsgIndicationBit;}
  inline BITSTRING& controlType()
    {return field_controlType;}
  inline const BITSTRING& controlType() const
    {return field_controlType;}
  inline CommunicationType& communicationType()
    {return field_communicationType;}
  inline const CommunicationType& communicationType() const
    {return field_communicationType;}
  inline OCTETSTRING& nodeIdentificationNumber()
    {return field_nodeIdentificationNumber;}
  inline const OCTETSTRING& nodeIdentificationNumber() const
    {return field_nodeIdentificationNumber;}
  inline int size_of() const
    {return 4;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class EnableRxAndTxWithEnhancedAddressInformationRequest_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
EnableRxAndTxWithEnhancedAddressInformationRequest_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const EnableRxAndTxWithEnhancedAddressInformationRequest& other_value);
void copy_template(const EnableRxAndTxWithEnhancedAddressInformationRequest_template& other_value);

public:
EnableRxAndTxWithEnhancedAddressInformationRequest_template();
EnableRxAndTxWithEnhancedAddressInformationRequest_template(template_sel other_value);
EnableRxAndTxWithEnhancedAddressInformationRequest_template(const EnableRxAndTxWithEnhancedAddressInformationRequest& other_value);
EnableRxAndTxWithEnhancedAddressInformationRequest_template(const OPTIONAL<EnableRxAndTxWithEnhancedAddressInformationRequest>& other_value);
EnableRxAndTxWithEnhancedAddressInformationRequest_template(const EnableRxAndTxWithEnhancedAddressInformationRequest_template& other_value);
~EnableRxAndTxWithEnhancedAddressInformationRequest_template();
EnableRxAndTxWithEnhancedAddressInformationRequest_template& operator=(template_sel other_value);
EnableRxAndTxWithEnhancedAddressInformationRequest_template& operator=(const EnableRxAndTxWithEnhancedAddressInformationRequest& other_value);
EnableRxAndTxWithEnhancedAddressInformationRequest_template& operator=(const OPTIONAL<EnableRxAndTxWithEnhancedAddressInformationRequest>& other_value);
EnableRxAndTxWithEnhancedAddressInformationRequest_template& operator=(const EnableRxAndTxWithEnhancedAddressInformationRequest_template& other_value);
boolean match(const EnableRxAndTxWithEnhancedAddressInformationRequest& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
EnableRxAndTxWithEnhancedAddressInformationRequest valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
EnableRxAndTxWithEnhancedAddressInformationRequest_template& list_item(unsigned int list_index) const;
SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit();
const SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit() const;
BITSTRING_template& controlType();
const BITSTRING_template& controlType() const;
CommunicationType_template& communicationType();
const CommunicationType_template& communicationType() const;
OCTETSTRING_template& nodeIdentificationNumber();
const OCTETSTRING_template& nodeIdentificationNumber() const;
int size_of() const;
void log() const;
void log_match(const EnableRxAndTxWithEnhancedAddressInformationRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class CommunicationControlRequestType : public Base_Type {
public:
enum union_selection_type { UNBOUND_VALUE = 0, ALT_enableRxAndTxRequest = 1, ALT_enableRxAndDisableTxRequest = 2, ALT_disableRxAndEnableTxRequest = 3, ALT_disableRxAndTxRequest = 4, ALT_enableRxAndDisableTxWithEnhancedAddressInformationRequest = 5, ALT_enableRxAndTxWithEnhancedAddressInformationRequest = 6 };
private:
union_selection_type union_selection;
union {
EnableRxAndTxRequest *field_enableRxAndTxRequest;
EnableRxAndDisableTxRequest *field_enableRxAndDisableTxRequest;
DisableRxAndEnableTxRequest *field_disableRxAndEnableTxRequest;
DisableRxAndTxRequest *field_disableRxAndTxRequest;
EnableRxAndDisableTxWithEnhancedAddressInformationRequest *field_enableRxAndDisableTxWithEnhancedAddressInformationRequest;
EnableRxAndTxWithEnhancedAddressInformationRequest *field_enableRxAndTxWithEnhancedAddressInformationRequest;
};
void copy_value(const CommunicationControlRequestType& other_value);

public:
CommunicationControlRequestType();
CommunicationControlRequestType(const CommunicationControlRequestType& other_value);
~CommunicationControlRequestType();
CommunicationControlRequestType& operator=(const CommunicationControlRequestType& other_value);
boolean operator==(const CommunicationControlRequestType& other_value) const;
inline boolean operator!=(const CommunicationControlRequestType& other_value) const { return !(*this == other_value); }
EnableRxAndTxRequest& enableRxAndTxRequest();
const EnableRxAndTxRequest& enableRxAndTxRequest() const;
EnableRxAndDisableTxRequest& enableRxAndDisableTxRequest();
const EnableRxAndDisableTxRequest& enableRxAndDisableTxRequest() const;
DisableRxAndEnableTxRequest& disableRxAndEnableTxRequest();
const DisableRxAndEnableTxRequest& disableRxAndEnableTxRequest() const;
DisableRxAndTxRequest& disableRxAndTxRequest();
const DisableRxAndTxRequest& disableRxAndTxRequest() const;
EnableRxAndDisableTxWithEnhancedAddressInformationRequest& enableRxAndDisableTxWithEnhancedAddressInformationRequest();
const EnableRxAndDisableTxWithEnhancedAddressInformationRequest& enableRxAndDisableTxWithEnhancedAddressInformationRequest() const;
EnableRxAndTxWithEnhancedAddressInformationRequest& enableRxAndTxWithEnhancedAddressInformationRequest();
const EnableRxAndTxWithEnhancedAddressInformationRequest& enableRxAndTxWithEnhancedAddressInformationRequest() const;
inline union_selection_type get_selection() const { return union_selection; }
boolean ischosen(union_selection_type checked_selection) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
  void set_implicit_omit();
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class CommunicationControlRequestType_template : public Base_Template {
union {
struct {
CommunicationControlRequestType::union_selection_type union_selection;
union {
EnableRxAndTxRequest_template *field_enableRxAndTxRequest;
EnableRxAndDisableTxRequest_template *field_enableRxAndDisableTxRequest;
DisableRxAndEnableTxRequest_template *field_disableRxAndEnableTxRequest;
DisableRxAndTxRequest_template *field_disableRxAndTxRequest;
EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template *field_enableRxAndDisableTxWithEnhancedAddressInformationRequest;
EnableRxAndTxWithEnhancedAddressInformationRequest_template *field_enableRxAndTxWithEnhancedAddressInformationRequest;
};
} single_value;
struct {
unsigned int n_values;
CommunicationControlRequestType_template *list_value;
} value_list;
};
void copy_value(const CommunicationControlRequestType& other_value);

void copy_template(const CommunicationControlRequestType_template& other_value);

public:
CommunicationControlRequestType_template();
CommunicationControlRequestType_template(template_sel other_value);
CommunicationControlRequestType_template(const CommunicationControlRequestType& other_value);
CommunicationControlRequestType_template(const OPTIONAL<CommunicationControlRequestType>& other_value);
CommunicationControlRequestType_template(const CommunicationControlRequestType_template& other_value);
~CommunicationControlRequestType_template();
void clean_up();
CommunicationControlRequestType_template& operator=(template_sel other_value);
CommunicationControlRequestType_template& operator=(const CommunicationControlRequestType& other_value);
CommunicationControlRequestType_template& operator=(const OPTIONAL<CommunicationControlRequestType>& other_value);
CommunicationControlRequestType_template& operator=(const CommunicationControlRequestType_template& other_value);
boolean match(const CommunicationControlRequestType& other_value, boolean legacy = FALSE) const;
boolean is_value() const;CommunicationControlRequestType valueof() const;
CommunicationControlRequestType_template& list_item(unsigned int list_index) const;
void set_type(template_sel template_type, unsigned int list_length);
EnableRxAndTxRequest_template& enableRxAndTxRequest();
const EnableRxAndTxRequest_template& enableRxAndTxRequest() const;
EnableRxAndDisableTxRequest_template& enableRxAndDisableTxRequest();
const EnableRxAndDisableTxRequest_template& enableRxAndDisableTxRequest() const;
DisableRxAndEnableTxRequest_template& disableRxAndEnableTxRequest();
const DisableRxAndEnableTxRequest_template& disableRxAndEnableTxRequest() const;
DisableRxAndTxRequest_template& disableRxAndTxRequest();
const DisableRxAndTxRequest_template& disableRxAndTxRequest() const;
EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template& enableRxAndDisableTxWithEnhancedAddressInformationRequest();
const EnableRxAndDisableTxWithEnhancedAddressInformationRequest_template& enableRxAndDisableTxWithEnhancedAddressInformationRequest() const;
EnableRxAndTxWithEnhancedAddressInformationRequest_template& enableRxAndTxWithEnhancedAddressInformationRequest();
const EnableRxAndTxWithEnhancedAddressInformationRequest_template& enableRxAndTxWithEnhancedAddressInformationRequest() const;
boolean ischosen(CommunicationControlRequestType::union_selection_type checked_selection) const;
void log() const;
void log_match(const CommunicationControlRequestType& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class CommunicationControlRequestSID : public Base_Type {
  OCTETSTRING field_sid;
  CommunicationControlRequestType field_communicationControlRequestType;
public:
  CommunicationControlRequestSID();
  CommunicationControlRequestSID(const OCTETSTRING& par_sid,
    const CommunicationControlRequestType& par_communicationControlRequestType);
  CommunicationControlRequestSID(const CommunicationControlRequestSID& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  CommunicationControlRequestSID& operator=(const CommunicationControlRequestSID& other_value);
  boolean operator==(const CommunicationControlRequestSID& other_value) const;
  inline boolean operator!=(const CommunicationControlRequestSID& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& sid()
    {return field_sid;}
  inline const OCTETSTRING& sid() const
    {return field_sid;}
  inline CommunicationControlRequestType& communicationControlRequestType()
    {return field_communicationControlRequestType;}
  inline const CommunicationControlRequestType& communicationControlRequestType() const
    {return field_communicationControlRequestType;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class CommunicationControlRequestSID_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
CommunicationControlRequestSID_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const CommunicationControlRequestSID& other_value);
void copy_template(const CommunicationControlRequestSID_template& other_value);

public:
CommunicationControlRequestSID_template();
CommunicationControlRequestSID_template(template_sel other_value);
CommunicationControlRequestSID_template(const CommunicationControlRequestSID& other_value);
CommunicationControlRequestSID_template(const OPTIONAL<CommunicationControlRequestSID>& other_value);
CommunicationControlRequestSID_template(const CommunicationControlRequestSID_template& other_value);
~CommunicationControlRequestSID_template();
CommunicationControlRequestSID_template& operator=(template_sel other_value);
CommunicationControlRequestSID_template& operator=(const CommunicationControlRequestSID& other_value);
CommunicationControlRequestSID_template& operator=(const OPTIONAL<CommunicationControlRequestSID>& other_value);
CommunicationControlRequestSID_template& operator=(const CommunicationControlRequestSID_template& other_value);
boolean match(const CommunicationControlRequestSID& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
CommunicationControlRequestSID valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
CommunicationControlRequestSID_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& sid();
const OCTETSTRING_template& sid() const;
CommunicationControlRequestType_template& communicationControlRequestType();
const CommunicationControlRequestType_template& communicationControlRequestType() const;
int size_of() const;
void log() const;
void log_match(const CommunicationControlRequestSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class CommunicationControlResponseSID : public Base_Type {
  OCTETSTRING field_sid;
  BITSTRING field_reserved;
  e__ControlType field_controlType;
public:
  CommunicationControlResponseSID();
  CommunicationControlResponseSID(const OCTETSTRING& par_sid,
    const BITSTRING& par_reserved,
    const e__ControlType& par_controlType);
  CommunicationControlResponseSID(const CommunicationControlResponseSID& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  CommunicationControlResponseSID& operator=(const CommunicationControlResponseSID& other_value);
  boolean operator==(const CommunicationControlResponseSID& other_value) const;
  inline boolean operator!=(const CommunicationControlResponseSID& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& sid()
    {return field_sid;}
  inline const OCTETSTRING& sid() const
    {return field_sid;}
  inline BITSTRING& reserved()
    {return field_reserved;}
  inline const BITSTRING& reserved() const
    {return field_reserved;}
  inline e__ControlType& controlType()
    {return field_controlType;}
  inline const e__ControlType& controlType() const
    {return field_controlType;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class CommunicationControlResponseSID_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
CommunicationControlResponseSID_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const CommunicationControlResponseSID& other_value);
void copy_template(const CommunicationControlResponseSID_template& other_value);

public:
CommunicationControlResponseSID_template();
CommunicationControlResponseSID_template(template_sel other_value);
CommunicationControlResponseSID_template(const CommunicationControlResponseSID& other_value);
CommunicationControlResponseSID_template(const OPTIONAL<CommunicationControlResponseSID>& other_value);
CommunicationControlResponseSID_template(const CommunicationControlResponseSID_template& other_value);
~CommunicationControlResponseSID_template();
CommunicationControlResponseSID_template& operator=(template_sel other_value);
CommunicationControlResponseSID_template& operator=(const CommunicationControlResponseSID& other_value);
CommunicationControlResponseSID_template& operator=(const OPTIONAL<CommunicationControlResponseSID>& other_value);
CommunicationControlResponseSID_template& operator=(const CommunicationControlResponseSID_template& other_value);
boolean match(const CommunicationControlResponseSID& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
CommunicationControlResponseSID valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
CommunicationControlResponseSID_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& sid();
const OCTETSTRING_template& sid() const;
BITSTRING_template& reserved();
const BITSTRING_template& reserved() const;
e__ControlType_template& controlType();
const e__ControlType_template& controlType() const;
int size_of() const;
void log() const;
void log_match(const CommunicationControlResponseSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class TesterPresentRequestSID : public Base_Type {
  OCTETSTRING field_sid;
  SuppressPosRspMsgIndicationBitType field_suppressPosRspMsgIndicationBit;
  BITSTRING field_zero;
public:
  TesterPresentRequestSID();
  TesterPresentRequestSID(const OCTETSTRING& par_sid,
    const SuppressPosRspMsgIndicationBitType& par_suppressPosRspMsgIndicationBit,
    const BITSTRING& par_zero);
  TesterPresentRequestSID(const TesterPresentRequestSID& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  TesterPresentRequestSID& operator=(const TesterPresentRequestSID& other_value);
  boolean operator==(const TesterPresentRequestSID& other_value) const;
  inline boolean operator!=(const TesterPresentRequestSID& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& sid()
    {return field_sid;}
  inline const OCTETSTRING& sid() const
    {return field_sid;}
  inline SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit()
    {return field_suppressPosRspMsgIndicationBit;}
  inline const SuppressPosRspMsgIndicationBitType& suppressPosRspMsgIndicationBit() const
    {return field_suppressPosRspMsgIndicationBit;}
  inline BITSTRING& zero()
    {return field_zero;}
  inline const BITSTRING& zero() const
    {return field_zero;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class TesterPresentRequestSID_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
TesterPresentRequestSID_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const TesterPresentRequestSID& other_value);
void copy_template(const TesterPresentRequestSID_template& other_value);

public:
TesterPresentRequestSID_template();
TesterPresentRequestSID_template(template_sel other_value);
TesterPresentRequestSID_template(const TesterPresentRequestSID& other_value);
TesterPresentRequestSID_template(const OPTIONAL<TesterPresentRequestSID>& other_value);
TesterPresentRequestSID_template(const TesterPresentRequestSID_template& other_value);
~TesterPresentRequestSID_template();
TesterPresentRequestSID_template& operator=(template_sel other_value);
TesterPresentRequestSID_template& operator=(const TesterPresentRequestSID& other_value);
TesterPresentRequestSID_template& operator=(const OPTIONAL<TesterPresentRequestSID>& other_value);
TesterPresentRequestSID_template& operator=(const TesterPresentRequestSID_template& other_value);
boolean match(const TesterPresentRequestSID& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
TesterPresentRequestSID valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
TesterPresentRequestSID_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& sid();
const OCTETSTRING_template& sid() const;
SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit();
const SuppressPosRspMsgIndicationBitType_template& suppressPosRspMsgIndicationBit() const;
BITSTRING_template& zero();
const BITSTRING_template& zero() const;
int size_of() const;
void log() const;
void log_match(const TesterPresentRequestSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class TesterPresentResponseSID : public Base_Type {
  OCTETSTRING field_sid;
  BITSTRING field_reserved;
  BITSTRING field_zero;
public:
  TesterPresentResponseSID();
  TesterPresentResponseSID(const OCTETSTRING& par_sid,
    const BITSTRING& par_reserved,
    const BITSTRING& par_zero);
  TesterPresentResponseSID(const TesterPresentResponseSID& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  TesterPresentResponseSID& operator=(const TesterPresentResponseSID& other_value);
  boolean operator==(const TesterPresentResponseSID& other_value) const;
  inline boolean operator!=(const TesterPresentResponseSID& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& sid()
    {return field_sid;}
  inline const OCTETSTRING& sid() const
    {return field_sid;}
  inline BITSTRING& reserved()
    {return field_reserved;}
  inline const BITSTRING& reserved() const
    {return field_reserved;}
  inline BITSTRING& zero()
    {return field_zero;}
  inline const BITSTRING& zero() const
    {return field_zero;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class TesterPresentResponseSID_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
TesterPresentResponseSID_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const TesterPresentResponseSID& other_value);
void copy_template(const TesterPresentResponseSID_template& other_value);

public:
TesterPresentResponseSID_template();
TesterPresentResponseSID_template(template_sel other_value);
TesterPresentResponseSID_template(const TesterPresentResponseSID& other_value);
TesterPresentResponseSID_template(const OPTIONAL<TesterPresentResponseSID>& other_value);
TesterPresentResponseSID_template(const TesterPresentResponseSID_template& other_value);
~TesterPresentResponseSID_template();
TesterPresentResponseSID_template& operator=(template_sel other_value);
TesterPresentResponseSID_template& operator=(const TesterPresentResponseSID& other_value);
TesterPresentResponseSID_template& operator=(const OPTIONAL<TesterPresentResponseSID>& other_value);
TesterPresentResponseSID_template& operator=(const TesterPresentResponseSID_template& other_value);
boolean match(const TesterPresentResponseSID& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
TesterPresentResponseSID valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
TesterPresentResponseSID_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& sid();
const OCTETSTRING_template& sid() const;
BITSTRING_template& reserved();
const BITSTRING_template& reserved() const;
BITSTRING_template& zero();
const BITSTRING_template& zero() const;
int size_of() const;
void log() const;
void log_match(const TesterPresentResponseSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class ReadDataByIdentifierRequest1 : public Base_Type {
  OCTETSTRING field_identifier;
public:
  ReadDataByIdentifierRequest1();
  ReadDataByIdentifierRequest1(const OCTETSTRING& par_identifier);
  ReadDataByIdentifierRequest1(const ReadDataByIdentifierRequest1& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  ReadDataByIdentifierRequest1& operator=(const ReadDataByIdentifierRequest1& other_value);
  boolean operator==(const ReadDataByIdentifierRequest1& other_value) const;
  inline boolean operator!=(const ReadDataByIdentifierRequest1& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& identifier()
    {return field_identifier;}
  inline const OCTETSTRING& identifier() const
    {return field_identifier;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ReadDataByIdentifierRequest1_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
ReadDataByIdentifierRequest1_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const ReadDataByIdentifierRequest1& other_value);
void copy_template(const ReadDataByIdentifierRequest1_template& other_value);

public:
ReadDataByIdentifierRequest1_template();
ReadDataByIdentifierRequest1_template(template_sel other_value);
ReadDataByIdentifierRequest1_template(const ReadDataByIdentifierRequest1& other_value);
ReadDataByIdentifierRequest1_template(const OPTIONAL<ReadDataByIdentifierRequest1>& other_value);
ReadDataByIdentifierRequest1_template(const ReadDataByIdentifierRequest1_template& other_value);
~ReadDataByIdentifierRequest1_template();
ReadDataByIdentifierRequest1_template& operator=(template_sel other_value);
ReadDataByIdentifierRequest1_template& operator=(const ReadDataByIdentifierRequest1& other_value);
ReadDataByIdentifierRequest1_template& operator=(const OPTIONAL<ReadDataByIdentifierRequest1>& other_value);
ReadDataByIdentifierRequest1_template& operator=(const ReadDataByIdentifierRequest1_template& other_value);
boolean match(const ReadDataByIdentifierRequest1& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
ReadDataByIdentifierRequest1 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
ReadDataByIdentifierRequest1_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& identifier();
const OCTETSTRING_template& identifier() const;
int size_of() const;
void log() const;
void log_match(const ReadDataByIdentifierRequest1& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class ReadDataByIdentifierRequest2 : public Base_Type {
  OCTETSTRING field_identifier;
public:
  ReadDataByIdentifierRequest2();
  ReadDataByIdentifierRequest2(const OCTETSTRING& par_identifier);
  ReadDataByIdentifierRequest2(const ReadDataByIdentifierRequest2& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  ReadDataByIdentifierRequest2& operator=(const ReadDataByIdentifierRequest2& other_value);
  boolean operator==(const ReadDataByIdentifierRequest2& other_value) const;
  inline boolean operator!=(const ReadDataByIdentifierRequest2& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& identifier()
    {return field_identifier;}
  inline const OCTETSTRING& identifier() const
    {return field_identifier;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ReadDataByIdentifierRequest2_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
ReadDataByIdentifierRequest2_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const ReadDataByIdentifierRequest2& other_value);
void copy_template(const ReadDataByIdentifierRequest2_template& other_value);

public:
ReadDataByIdentifierRequest2_template();
ReadDataByIdentifierRequest2_template(template_sel other_value);
ReadDataByIdentifierRequest2_template(const ReadDataByIdentifierRequest2& other_value);
ReadDataByIdentifierRequest2_template(const OPTIONAL<ReadDataByIdentifierRequest2>& other_value);
ReadDataByIdentifierRequest2_template(const ReadDataByIdentifierRequest2_template& other_value);
~ReadDataByIdentifierRequest2_template();
ReadDataByIdentifierRequest2_template& operator=(template_sel other_value);
ReadDataByIdentifierRequest2_template& operator=(const ReadDataByIdentifierRequest2& other_value);
ReadDataByIdentifierRequest2_template& operator=(const OPTIONAL<ReadDataByIdentifierRequest2>& other_value);
ReadDataByIdentifierRequest2_template& operator=(const ReadDataByIdentifierRequest2_template& other_value);
boolean match(const ReadDataByIdentifierRequest2& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
ReadDataByIdentifierRequest2 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
ReadDataByIdentifierRequest2_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& identifier();
const OCTETSTRING_template& identifier() const;
int size_of() const;
void log() const;
void log_match(const ReadDataByIdentifierRequest2& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class ReadDataByIdentifierRequest3 : public Base_Type {
  OCTETSTRING field_identifier;
public:
  ReadDataByIdentifierRequest3();
  ReadDataByIdentifierRequest3(const OCTETSTRING& par_identifier);
  ReadDataByIdentifierRequest3(const ReadDataByIdentifierRequest3& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  ReadDataByIdentifierRequest3& operator=(const ReadDataByIdentifierRequest3& other_value);
  boolean operator==(const ReadDataByIdentifierRequest3& other_value) const;
  inline boolean operator!=(const ReadDataByIdentifierRequest3& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& identifier()
    {return field_identifier;}
  inline const OCTETSTRING& identifier() const
    {return field_identifier;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ReadDataByIdentifierRequest3_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
ReadDataByIdentifierRequest3_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const ReadDataByIdentifierRequest3& other_value);
void copy_template(const ReadDataByIdentifierRequest3_template& other_value);

public:
ReadDataByIdentifierRequest3_template();
ReadDataByIdentifierRequest3_template(template_sel other_value);
ReadDataByIdentifierRequest3_template(const ReadDataByIdentifierRequest3& other_value);
ReadDataByIdentifierRequest3_template(const OPTIONAL<ReadDataByIdentifierRequest3>& other_value);
ReadDataByIdentifierRequest3_template(const ReadDataByIdentifierRequest3_template& other_value);
~ReadDataByIdentifierRequest3_template();
ReadDataByIdentifierRequest3_template& operator=(template_sel other_value);
ReadDataByIdentifierRequest3_template& operator=(const ReadDataByIdentifierRequest3& other_value);
ReadDataByIdentifierRequest3_template& operator=(const OPTIONAL<ReadDataByIdentifierRequest3>& other_value);
ReadDataByIdentifierRequest3_template& operator=(const ReadDataByIdentifierRequest3_template& other_value);
boolean match(const ReadDataByIdentifierRequest3& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
ReadDataByIdentifierRequest3 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
ReadDataByIdentifierRequest3_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& identifier();
const OCTETSTRING_template& identifier() const;
int size_of() const;
void log() const;
void log_match(const ReadDataByIdentifierRequest3& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class ReadDataByIdentifierRequest : public Base_Type {
public:
enum union_selection_type { UNBOUND_VALUE = 0, ALT_readDataByIdentifier1 = 1, ALT_readDataByIdentifier2 = 2, ALT_readDataByIdentifier3 = 3 };
private:
union_selection_type union_selection;
union {
ReadDataByIdentifierRequest1 *field_readDataByIdentifier1;
ReadDataByIdentifierRequest2 *field_readDataByIdentifier2;
ReadDataByIdentifierRequest3 *field_readDataByIdentifier3;
};
void copy_value(const ReadDataByIdentifierRequest& other_value);

public:
ReadDataByIdentifierRequest();
ReadDataByIdentifierRequest(const ReadDataByIdentifierRequest& other_value);
~ReadDataByIdentifierRequest();
ReadDataByIdentifierRequest& operator=(const ReadDataByIdentifierRequest& other_value);
boolean operator==(const ReadDataByIdentifierRequest& other_value) const;
inline boolean operator!=(const ReadDataByIdentifierRequest& other_value) const { return !(*this == other_value); }
ReadDataByIdentifierRequest1& readDataByIdentifier1();
const ReadDataByIdentifierRequest1& readDataByIdentifier1() const;
ReadDataByIdentifierRequest2& readDataByIdentifier2();
const ReadDataByIdentifierRequest2& readDataByIdentifier2() const;
ReadDataByIdentifierRequest3& readDataByIdentifier3();
const ReadDataByIdentifierRequest3& readDataByIdentifier3() const;
inline union_selection_type get_selection() const { return union_selection; }
boolean ischosen(union_selection_type checked_selection) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
  void set_implicit_omit();
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ReadDataByIdentifierRequest_template : public Base_Template {
union {
struct {
ReadDataByIdentifierRequest::union_selection_type union_selection;
union {
ReadDataByIdentifierRequest1_template *field_readDataByIdentifier1;
ReadDataByIdentifierRequest2_template *field_readDataByIdentifier2;
ReadDataByIdentifierRequest3_template *field_readDataByIdentifier3;
};
} single_value;
struct {
unsigned int n_values;
ReadDataByIdentifierRequest_template *list_value;
} value_list;
};
void copy_value(const ReadDataByIdentifierRequest& other_value);

void copy_template(const ReadDataByIdentifierRequest_template& other_value);

public:
ReadDataByIdentifierRequest_template();
ReadDataByIdentifierRequest_template(template_sel other_value);
ReadDataByIdentifierRequest_template(const ReadDataByIdentifierRequest& other_value);
ReadDataByIdentifierRequest_template(const OPTIONAL<ReadDataByIdentifierRequest>& other_value);
ReadDataByIdentifierRequest_template(const ReadDataByIdentifierRequest_template& other_value);
~ReadDataByIdentifierRequest_template();
void clean_up();
ReadDataByIdentifierRequest_template& operator=(template_sel other_value);
ReadDataByIdentifierRequest_template& operator=(const ReadDataByIdentifierRequest& other_value);
ReadDataByIdentifierRequest_template& operator=(const OPTIONAL<ReadDataByIdentifierRequest>& other_value);
ReadDataByIdentifierRequest_template& operator=(const ReadDataByIdentifierRequest_template& other_value);
boolean match(const ReadDataByIdentifierRequest& other_value, boolean legacy = FALSE) const;
boolean is_value() const;ReadDataByIdentifierRequest valueof() const;
ReadDataByIdentifierRequest_template& list_item(unsigned int list_index) const;
void set_type(template_sel template_type, unsigned int list_length);
ReadDataByIdentifierRequest1_template& readDataByIdentifier1();
const ReadDataByIdentifierRequest1_template& readDataByIdentifier1() const;
ReadDataByIdentifierRequest2_template& readDataByIdentifier2();
const ReadDataByIdentifierRequest2_template& readDataByIdentifier2() const;
ReadDataByIdentifierRequest3_template& readDataByIdentifier3();
const ReadDataByIdentifierRequest3_template& readDataByIdentifier3() const;
boolean ischosen(ReadDataByIdentifierRequest::union_selection_type checked_selection) const;
void log() const;
void log_match(const ReadDataByIdentifierRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class ReadDataByIdentifierRequestSID : public Base_Type {
  OCTETSTRING field_sid;
  ReadDataByIdentifierRequest field_readDataByIdentifierRequest;
public:
  ReadDataByIdentifierRequestSID();
  ReadDataByIdentifierRequestSID(const OCTETSTRING& par_sid,
    const ReadDataByIdentifierRequest& par_readDataByIdentifierRequest);
  ReadDataByIdentifierRequestSID(const ReadDataByIdentifierRequestSID& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  ReadDataByIdentifierRequestSID& operator=(const ReadDataByIdentifierRequestSID& other_value);
  boolean operator==(const ReadDataByIdentifierRequestSID& other_value) const;
  inline boolean operator!=(const ReadDataByIdentifierRequestSID& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& sid()
    {return field_sid;}
  inline const OCTETSTRING& sid() const
    {return field_sid;}
  inline ReadDataByIdentifierRequest& readDataByIdentifierRequest()
    {return field_readDataByIdentifierRequest;}
  inline const ReadDataByIdentifierRequest& readDataByIdentifierRequest() const
    {return field_readDataByIdentifierRequest;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ReadDataByIdentifierRequestSID_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
ReadDataByIdentifierRequestSID_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const ReadDataByIdentifierRequestSID& other_value);
void copy_template(const ReadDataByIdentifierRequestSID_template& other_value);

public:
ReadDataByIdentifierRequestSID_template();
ReadDataByIdentifierRequestSID_template(template_sel other_value);
ReadDataByIdentifierRequestSID_template(const ReadDataByIdentifierRequestSID& other_value);
ReadDataByIdentifierRequestSID_template(const OPTIONAL<ReadDataByIdentifierRequestSID>& other_value);
ReadDataByIdentifierRequestSID_template(const ReadDataByIdentifierRequestSID_template& other_value);
~ReadDataByIdentifierRequestSID_template();
ReadDataByIdentifierRequestSID_template& operator=(template_sel other_value);
ReadDataByIdentifierRequestSID_template& operator=(const ReadDataByIdentifierRequestSID& other_value);
ReadDataByIdentifierRequestSID_template& operator=(const OPTIONAL<ReadDataByIdentifierRequestSID>& other_value);
ReadDataByIdentifierRequestSID_template& operator=(const ReadDataByIdentifierRequestSID_template& other_value);
boolean match(const ReadDataByIdentifierRequestSID& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
ReadDataByIdentifierRequestSID valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
ReadDataByIdentifierRequestSID_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& sid();
const OCTETSTRING_template& sid() const;
ReadDataByIdentifierRequest_template& readDataByIdentifierRequest();
const ReadDataByIdentifierRequest_template& readDataByIdentifierRequest() const;
int size_of() const;
void log() const;
void log_match(const ReadDataByIdentifierRequestSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class ReadDataByIdentifierResponse1 : public Base_Type {
  OCTETSTRING field_identifier;
  OCTETSTRING field_readDataByIdentifierResponse;
public:
  ReadDataByIdentifierResponse1();
  ReadDataByIdentifierResponse1(const OCTETSTRING& par_identifier,
    const OCTETSTRING& par_readDataByIdentifierResponse);
  ReadDataByIdentifierResponse1(const ReadDataByIdentifierResponse1& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  ReadDataByIdentifierResponse1& operator=(const ReadDataByIdentifierResponse1& other_value);
  boolean operator==(const ReadDataByIdentifierResponse1& other_value) const;
  inline boolean operator!=(const ReadDataByIdentifierResponse1& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& identifier()
    {return field_identifier;}
  inline const OCTETSTRING& identifier() const
    {return field_identifier;}
  inline OCTETSTRING& readDataByIdentifierResponse()
    {return field_readDataByIdentifierResponse;}
  inline const OCTETSTRING& readDataByIdentifierResponse() const
    {return field_readDataByIdentifierResponse;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ReadDataByIdentifierResponse1_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
ReadDataByIdentifierResponse1_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const ReadDataByIdentifierResponse1& other_value);
void copy_template(const ReadDataByIdentifierResponse1_template& other_value);

public:
ReadDataByIdentifierResponse1_template();
ReadDataByIdentifierResponse1_template(template_sel other_value);
ReadDataByIdentifierResponse1_template(const ReadDataByIdentifierResponse1& other_value);
ReadDataByIdentifierResponse1_template(const OPTIONAL<ReadDataByIdentifierResponse1>& other_value);
ReadDataByIdentifierResponse1_template(const ReadDataByIdentifierResponse1_template& other_value);
~ReadDataByIdentifierResponse1_template();
ReadDataByIdentifierResponse1_template& operator=(template_sel other_value);
ReadDataByIdentifierResponse1_template& operator=(const ReadDataByIdentifierResponse1& other_value);
ReadDataByIdentifierResponse1_template& operator=(const OPTIONAL<ReadDataByIdentifierResponse1>& other_value);
ReadDataByIdentifierResponse1_template& operator=(const ReadDataByIdentifierResponse1_template& other_value);
boolean match(const ReadDataByIdentifierResponse1& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
ReadDataByIdentifierResponse1 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
ReadDataByIdentifierResponse1_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& identifier();
const OCTETSTRING_template& identifier() const;
OCTETSTRING_template& readDataByIdentifierResponse();
const OCTETSTRING_template& readDataByIdentifierResponse() const;
int size_of() const;
void log() const;
void log_match(const ReadDataByIdentifierResponse1& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class ReadDataByIdentifierResponse2 : public Base_Type {
  OCTETSTRING field_identifier;
  OCTETSTRING field_readDataByIdentifierResponse;
public:
  ReadDataByIdentifierResponse2();
  ReadDataByIdentifierResponse2(const OCTETSTRING& par_identifier,
    const OCTETSTRING& par_readDataByIdentifierResponse);
  ReadDataByIdentifierResponse2(const ReadDataByIdentifierResponse2& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  ReadDataByIdentifierResponse2& operator=(const ReadDataByIdentifierResponse2& other_value);
  boolean operator==(const ReadDataByIdentifierResponse2& other_value) const;
  inline boolean operator!=(const ReadDataByIdentifierResponse2& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& identifier()
    {return field_identifier;}
  inline const OCTETSTRING& identifier() const
    {return field_identifier;}
  inline OCTETSTRING& readDataByIdentifierResponse()
    {return field_readDataByIdentifierResponse;}
  inline const OCTETSTRING& readDataByIdentifierResponse() const
    {return field_readDataByIdentifierResponse;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ReadDataByIdentifierResponse2_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
ReadDataByIdentifierResponse2_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const ReadDataByIdentifierResponse2& other_value);
void copy_template(const ReadDataByIdentifierResponse2_template& other_value);

public:
ReadDataByIdentifierResponse2_template();
ReadDataByIdentifierResponse2_template(template_sel other_value);
ReadDataByIdentifierResponse2_template(const ReadDataByIdentifierResponse2& other_value);
ReadDataByIdentifierResponse2_template(const OPTIONAL<ReadDataByIdentifierResponse2>& other_value);
ReadDataByIdentifierResponse2_template(const ReadDataByIdentifierResponse2_template& other_value);
~ReadDataByIdentifierResponse2_template();
ReadDataByIdentifierResponse2_template& operator=(template_sel other_value);
ReadDataByIdentifierResponse2_template& operator=(const ReadDataByIdentifierResponse2& other_value);
ReadDataByIdentifierResponse2_template& operator=(const OPTIONAL<ReadDataByIdentifierResponse2>& other_value);
ReadDataByIdentifierResponse2_template& operator=(const ReadDataByIdentifierResponse2_template& other_value);
boolean match(const ReadDataByIdentifierResponse2& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
ReadDataByIdentifierResponse2 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
ReadDataByIdentifierResponse2_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& identifier();
const OCTETSTRING_template& identifier() const;
OCTETSTRING_template& readDataByIdentifierResponse();
const OCTETSTRING_template& readDataByIdentifierResponse() const;
int size_of() const;
void log() const;
void log_match(const ReadDataByIdentifierResponse2& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class ReadDataByIdentifierResponse3 : public Base_Type {
  OCTETSTRING field_identifier;
  OCTETSTRING field_readDataByIdentifierResponse;
public:
  ReadDataByIdentifierResponse3();
  ReadDataByIdentifierResponse3(const OCTETSTRING& par_identifier,
    const OCTETSTRING& par_readDataByIdentifierResponse);
  ReadDataByIdentifierResponse3(const ReadDataByIdentifierResponse3& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  ReadDataByIdentifierResponse3& operator=(const ReadDataByIdentifierResponse3& other_value);
  boolean operator==(const ReadDataByIdentifierResponse3& other_value) const;
  inline boolean operator!=(const ReadDataByIdentifierResponse3& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& identifier()
    {return field_identifier;}
  inline const OCTETSTRING& identifier() const
    {return field_identifier;}
  inline OCTETSTRING& readDataByIdentifierResponse()
    {return field_readDataByIdentifierResponse;}
  inline const OCTETSTRING& readDataByIdentifierResponse() const
    {return field_readDataByIdentifierResponse;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ReadDataByIdentifierResponse3_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
ReadDataByIdentifierResponse3_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const ReadDataByIdentifierResponse3& other_value);
void copy_template(const ReadDataByIdentifierResponse3_template& other_value);

public:
ReadDataByIdentifierResponse3_template();
ReadDataByIdentifierResponse3_template(template_sel other_value);
ReadDataByIdentifierResponse3_template(const ReadDataByIdentifierResponse3& other_value);
ReadDataByIdentifierResponse3_template(const OPTIONAL<ReadDataByIdentifierResponse3>& other_value);
ReadDataByIdentifierResponse3_template(const ReadDataByIdentifierResponse3_template& other_value);
~ReadDataByIdentifierResponse3_template();
ReadDataByIdentifierResponse3_template& operator=(template_sel other_value);
ReadDataByIdentifierResponse3_template& operator=(const ReadDataByIdentifierResponse3& other_value);
ReadDataByIdentifierResponse3_template& operator=(const OPTIONAL<ReadDataByIdentifierResponse3>& other_value);
ReadDataByIdentifierResponse3_template& operator=(const ReadDataByIdentifierResponse3_template& other_value);
boolean match(const ReadDataByIdentifierResponse3& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
ReadDataByIdentifierResponse3 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
ReadDataByIdentifierResponse3_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& identifier();
const OCTETSTRING_template& identifier() const;
OCTETSTRING_template& readDataByIdentifierResponse();
const OCTETSTRING_template& readDataByIdentifierResponse() const;
int size_of() const;
void log() const;
void log_match(const ReadDataByIdentifierResponse3& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class ReadDataByIdentifierResponse : public Base_Type {
public:
enum union_selection_type { UNBOUND_VALUE = 0, ALT_readDataByIdentifier1 = 1, ALT_readDataByIdentifier2 = 2, ALT_readDataByIdentifier3 = 3 };
private:
union_selection_type union_selection;
union {
ReadDataByIdentifierResponse1 *field_readDataByIdentifier1;
ReadDataByIdentifierResponse2 *field_readDataByIdentifier2;
ReadDataByIdentifierResponse3 *field_readDataByIdentifier3;
};
void copy_value(const ReadDataByIdentifierResponse& other_value);

public:
ReadDataByIdentifierResponse();
ReadDataByIdentifierResponse(const ReadDataByIdentifierResponse& other_value);
~ReadDataByIdentifierResponse();
ReadDataByIdentifierResponse& operator=(const ReadDataByIdentifierResponse& other_value);
boolean operator==(const ReadDataByIdentifierResponse& other_value) const;
inline boolean operator!=(const ReadDataByIdentifierResponse& other_value) const { return !(*this == other_value); }
ReadDataByIdentifierResponse1& readDataByIdentifier1();
const ReadDataByIdentifierResponse1& readDataByIdentifier1() const;
ReadDataByIdentifierResponse2& readDataByIdentifier2();
const ReadDataByIdentifierResponse2& readDataByIdentifier2() const;
ReadDataByIdentifierResponse3& readDataByIdentifier3();
const ReadDataByIdentifierResponse3& readDataByIdentifier3() const;
inline union_selection_type get_selection() const { return union_selection; }
boolean ischosen(union_selection_type checked_selection) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
  void set_implicit_omit();
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ReadDataByIdentifierResponse_template : public Base_Template {
union {
struct {
ReadDataByIdentifierResponse::union_selection_type union_selection;
union {
ReadDataByIdentifierResponse1_template *field_readDataByIdentifier1;
ReadDataByIdentifierResponse2_template *field_readDataByIdentifier2;
ReadDataByIdentifierResponse3_template *field_readDataByIdentifier3;
};
} single_value;
struct {
unsigned int n_values;
ReadDataByIdentifierResponse_template *list_value;
} value_list;
};
void copy_value(const ReadDataByIdentifierResponse& other_value);

void copy_template(const ReadDataByIdentifierResponse_template& other_value);

public:
ReadDataByIdentifierResponse_template();
ReadDataByIdentifierResponse_template(template_sel other_value);
ReadDataByIdentifierResponse_template(const ReadDataByIdentifierResponse& other_value);
ReadDataByIdentifierResponse_template(const OPTIONAL<ReadDataByIdentifierResponse>& other_value);
ReadDataByIdentifierResponse_template(const ReadDataByIdentifierResponse_template& other_value);
~ReadDataByIdentifierResponse_template();
void clean_up();
ReadDataByIdentifierResponse_template& operator=(template_sel other_value);
ReadDataByIdentifierResponse_template& operator=(const ReadDataByIdentifierResponse& other_value);
ReadDataByIdentifierResponse_template& operator=(const OPTIONAL<ReadDataByIdentifierResponse>& other_value);
ReadDataByIdentifierResponse_template& operator=(const ReadDataByIdentifierResponse_template& other_value);
boolean match(const ReadDataByIdentifierResponse& other_value, boolean legacy = FALSE) const;
boolean is_value() const;ReadDataByIdentifierResponse valueof() const;
ReadDataByIdentifierResponse_template& list_item(unsigned int list_index) const;
void set_type(template_sel template_type, unsigned int list_length);
ReadDataByIdentifierResponse1_template& readDataByIdentifier1();
const ReadDataByIdentifierResponse1_template& readDataByIdentifier1() const;
ReadDataByIdentifierResponse2_template& readDataByIdentifier2();
const ReadDataByIdentifierResponse2_template& readDataByIdentifier2() const;
ReadDataByIdentifierResponse3_template& readDataByIdentifier3();
const ReadDataByIdentifierResponse3_template& readDataByIdentifier3() const;
boolean ischosen(ReadDataByIdentifierResponse::union_selection_type checked_selection) const;
void log() const;
void log_match(const ReadDataByIdentifierResponse& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class ReadDataByIdentifierResponseSID : public Base_Type {
  OCTETSTRING field_sid;
  ReadDataByIdentifierResponse field_readDataByIdentifierResponse;
public:
  ReadDataByIdentifierResponseSID();
  ReadDataByIdentifierResponseSID(const OCTETSTRING& par_sid,
    const ReadDataByIdentifierResponse& par_readDataByIdentifierResponse);
  ReadDataByIdentifierResponseSID(const ReadDataByIdentifierResponseSID& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  ReadDataByIdentifierResponseSID& operator=(const ReadDataByIdentifierResponseSID& other_value);
  boolean operator==(const ReadDataByIdentifierResponseSID& other_value) const;
  inline boolean operator!=(const ReadDataByIdentifierResponseSID& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& sid()
    {return field_sid;}
  inline const OCTETSTRING& sid() const
    {return field_sid;}
  inline ReadDataByIdentifierResponse& readDataByIdentifierResponse()
    {return field_readDataByIdentifierResponse;}
  inline const ReadDataByIdentifierResponse& readDataByIdentifierResponse() const
    {return field_readDataByIdentifierResponse;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class ReadDataByIdentifierResponseSID_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
ReadDataByIdentifierResponseSID_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const ReadDataByIdentifierResponseSID& other_value);
void copy_template(const ReadDataByIdentifierResponseSID_template& other_value);

public:
ReadDataByIdentifierResponseSID_template();
ReadDataByIdentifierResponseSID_template(template_sel other_value);
ReadDataByIdentifierResponseSID_template(const ReadDataByIdentifierResponseSID& other_value);
ReadDataByIdentifierResponseSID_template(const OPTIONAL<ReadDataByIdentifierResponseSID>& other_value);
ReadDataByIdentifierResponseSID_template(const ReadDataByIdentifierResponseSID_template& other_value);
~ReadDataByIdentifierResponseSID_template();
ReadDataByIdentifierResponseSID_template& operator=(template_sel other_value);
ReadDataByIdentifierResponseSID_template& operator=(const ReadDataByIdentifierResponseSID& other_value);
ReadDataByIdentifierResponseSID_template& operator=(const OPTIONAL<ReadDataByIdentifierResponseSID>& other_value);
ReadDataByIdentifierResponseSID_template& operator=(const ReadDataByIdentifierResponseSID_template& other_value);
boolean match(const ReadDataByIdentifierResponseSID& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
ReadDataByIdentifierResponseSID valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
ReadDataByIdentifierResponseSID_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& sid();
const OCTETSTRING_template& sid() const;
ReadDataByIdentifierResponse_template& readDataByIdentifierResponse();
const ReadDataByIdentifierResponse_template& readDataByIdentifierResponse() const;
int size_of() const;
void log() const;
void log_match(const ReadDataByIdentifierResponseSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class WriteDataByIdentifierRequest1 : public Base_Type {
  OCTETSTRING field_identifier;
  OCTETSTRING field_dataRecord;
public:
  WriteDataByIdentifierRequest1();
  WriteDataByIdentifierRequest1(const OCTETSTRING& par_identifier,
    const OCTETSTRING& par_dataRecord);
  WriteDataByIdentifierRequest1(const WriteDataByIdentifierRequest1& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  WriteDataByIdentifierRequest1& operator=(const WriteDataByIdentifierRequest1& other_value);
  boolean operator==(const WriteDataByIdentifierRequest1& other_value) const;
  inline boolean operator!=(const WriteDataByIdentifierRequest1& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& identifier()
    {return field_identifier;}
  inline const OCTETSTRING& identifier() const
    {return field_identifier;}
  inline OCTETSTRING& dataRecord()
    {return field_dataRecord;}
  inline const OCTETSTRING& dataRecord() const
    {return field_dataRecord;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class WriteDataByIdentifierRequest1_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
WriteDataByIdentifierRequest1_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const WriteDataByIdentifierRequest1& other_value);
void copy_template(const WriteDataByIdentifierRequest1_template& other_value);

public:
WriteDataByIdentifierRequest1_template();
WriteDataByIdentifierRequest1_template(template_sel other_value);
WriteDataByIdentifierRequest1_template(const WriteDataByIdentifierRequest1& other_value);
WriteDataByIdentifierRequest1_template(const OPTIONAL<WriteDataByIdentifierRequest1>& other_value);
WriteDataByIdentifierRequest1_template(const WriteDataByIdentifierRequest1_template& other_value);
~WriteDataByIdentifierRequest1_template();
WriteDataByIdentifierRequest1_template& operator=(template_sel other_value);
WriteDataByIdentifierRequest1_template& operator=(const WriteDataByIdentifierRequest1& other_value);
WriteDataByIdentifierRequest1_template& operator=(const OPTIONAL<WriteDataByIdentifierRequest1>& other_value);
WriteDataByIdentifierRequest1_template& operator=(const WriteDataByIdentifierRequest1_template& other_value);
boolean match(const WriteDataByIdentifierRequest1& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
WriteDataByIdentifierRequest1 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
WriteDataByIdentifierRequest1_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& identifier();
const OCTETSTRING_template& identifier() const;
OCTETSTRING_template& dataRecord();
const OCTETSTRING_template& dataRecord() const;
int size_of() const;
void log() const;
void log_match(const WriteDataByIdentifierRequest1& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class WriteDataByIdentifierRequest2 : public Base_Type {
  OCTETSTRING field_identifier;
  OCTETSTRING field_dataRecord;
public:
  WriteDataByIdentifierRequest2();
  WriteDataByIdentifierRequest2(const OCTETSTRING& par_identifier,
    const OCTETSTRING& par_dataRecord);
  WriteDataByIdentifierRequest2(const WriteDataByIdentifierRequest2& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  WriteDataByIdentifierRequest2& operator=(const WriteDataByIdentifierRequest2& other_value);
  boolean operator==(const WriteDataByIdentifierRequest2& other_value) const;
  inline boolean operator!=(const WriteDataByIdentifierRequest2& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& identifier()
    {return field_identifier;}
  inline const OCTETSTRING& identifier() const
    {return field_identifier;}
  inline OCTETSTRING& dataRecord()
    {return field_dataRecord;}
  inline const OCTETSTRING& dataRecord() const
    {return field_dataRecord;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class WriteDataByIdentifierRequest2_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
WriteDataByIdentifierRequest2_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const WriteDataByIdentifierRequest2& other_value);
void copy_template(const WriteDataByIdentifierRequest2_template& other_value);

public:
WriteDataByIdentifierRequest2_template();
WriteDataByIdentifierRequest2_template(template_sel other_value);
WriteDataByIdentifierRequest2_template(const WriteDataByIdentifierRequest2& other_value);
WriteDataByIdentifierRequest2_template(const OPTIONAL<WriteDataByIdentifierRequest2>& other_value);
WriteDataByIdentifierRequest2_template(const WriteDataByIdentifierRequest2_template& other_value);
~WriteDataByIdentifierRequest2_template();
WriteDataByIdentifierRequest2_template& operator=(template_sel other_value);
WriteDataByIdentifierRequest2_template& operator=(const WriteDataByIdentifierRequest2& other_value);
WriteDataByIdentifierRequest2_template& operator=(const OPTIONAL<WriteDataByIdentifierRequest2>& other_value);
WriteDataByIdentifierRequest2_template& operator=(const WriteDataByIdentifierRequest2_template& other_value);
boolean match(const WriteDataByIdentifierRequest2& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
WriteDataByIdentifierRequest2 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
WriteDataByIdentifierRequest2_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& identifier();
const OCTETSTRING_template& identifier() const;
OCTETSTRING_template& dataRecord();
const OCTETSTRING_template& dataRecord() const;
int size_of() const;
void log() const;
void log_match(const WriteDataByIdentifierRequest2& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class WriteDataByIdentifierRequest3 : public Base_Type {
  OCTETSTRING field_identifier;
  OCTETSTRING field_dataRecord;
public:
  WriteDataByIdentifierRequest3();
  WriteDataByIdentifierRequest3(const OCTETSTRING& par_identifier,
    const OCTETSTRING& par_dataRecord);
  WriteDataByIdentifierRequest3(const WriteDataByIdentifierRequest3& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  WriteDataByIdentifierRequest3& operator=(const WriteDataByIdentifierRequest3& other_value);
  boolean operator==(const WriteDataByIdentifierRequest3& other_value) const;
  inline boolean operator!=(const WriteDataByIdentifierRequest3& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& identifier()
    {return field_identifier;}
  inline const OCTETSTRING& identifier() const
    {return field_identifier;}
  inline OCTETSTRING& dataRecord()
    {return field_dataRecord;}
  inline const OCTETSTRING& dataRecord() const
    {return field_dataRecord;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class WriteDataByIdentifierRequest3_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
WriteDataByIdentifierRequest3_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const WriteDataByIdentifierRequest3& other_value);
void copy_template(const WriteDataByIdentifierRequest3_template& other_value);

public:
WriteDataByIdentifierRequest3_template();
WriteDataByIdentifierRequest3_template(template_sel other_value);
WriteDataByIdentifierRequest3_template(const WriteDataByIdentifierRequest3& other_value);
WriteDataByIdentifierRequest3_template(const OPTIONAL<WriteDataByIdentifierRequest3>& other_value);
WriteDataByIdentifierRequest3_template(const WriteDataByIdentifierRequest3_template& other_value);
~WriteDataByIdentifierRequest3_template();
WriteDataByIdentifierRequest3_template& operator=(template_sel other_value);
WriteDataByIdentifierRequest3_template& operator=(const WriteDataByIdentifierRequest3& other_value);
WriteDataByIdentifierRequest3_template& operator=(const OPTIONAL<WriteDataByIdentifierRequest3>& other_value);
WriteDataByIdentifierRequest3_template& operator=(const WriteDataByIdentifierRequest3_template& other_value);
boolean match(const WriteDataByIdentifierRequest3& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
WriteDataByIdentifierRequest3 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
WriteDataByIdentifierRequest3_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& identifier();
const OCTETSTRING_template& identifier() const;
OCTETSTRING_template& dataRecord();
const OCTETSTRING_template& dataRecord() const;
int size_of() const;
void log() const;
void log_match(const WriteDataByIdentifierRequest3& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class WriteDataByIdentifierRequest : public Base_Type {
public:
enum union_selection_type { UNBOUND_VALUE = 0, ALT_writeDataByIdentifier1 = 1, ALT_writeDataByIdentifier2 = 2, ALT_writeDataByIdentifier3 = 3 };
private:
union_selection_type union_selection;
union {
WriteDataByIdentifierRequest1 *field_writeDataByIdentifier1;
WriteDataByIdentifierRequest2 *field_writeDataByIdentifier2;
WriteDataByIdentifierRequest3 *field_writeDataByIdentifier3;
};
void copy_value(const WriteDataByIdentifierRequest& other_value);

public:
WriteDataByIdentifierRequest();
WriteDataByIdentifierRequest(const WriteDataByIdentifierRequest& other_value);
~WriteDataByIdentifierRequest();
WriteDataByIdentifierRequest& operator=(const WriteDataByIdentifierRequest& other_value);
boolean operator==(const WriteDataByIdentifierRequest& other_value) const;
inline boolean operator!=(const WriteDataByIdentifierRequest& other_value) const { return !(*this == other_value); }
WriteDataByIdentifierRequest1& writeDataByIdentifier1();
const WriteDataByIdentifierRequest1& writeDataByIdentifier1() const;
WriteDataByIdentifierRequest2& writeDataByIdentifier2();
const WriteDataByIdentifierRequest2& writeDataByIdentifier2() const;
WriteDataByIdentifierRequest3& writeDataByIdentifier3();
const WriteDataByIdentifierRequest3& writeDataByIdentifier3() const;
inline union_selection_type get_selection() const { return union_selection; }
boolean ischosen(union_selection_type checked_selection) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
  void set_implicit_omit();
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class WriteDataByIdentifierRequest_template : public Base_Template {
union {
struct {
WriteDataByIdentifierRequest::union_selection_type union_selection;
union {
WriteDataByIdentifierRequest1_template *field_writeDataByIdentifier1;
WriteDataByIdentifierRequest2_template *field_writeDataByIdentifier2;
WriteDataByIdentifierRequest3_template *field_writeDataByIdentifier3;
};
} single_value;
struct {
unsigned int n_values;
WriteDataByIdentifierRequest_template *list_value;
} value_list;
};
void copy_value(const WriteDataByIdentifierRequest& other_value);

void copy_template(const WriteDataByIdentifierRequest_template& other_value);

public:
WriteDataByIdentifierRequest_template();
WriteDataByIdentifierRequest_template(template_sel other_value);
WriteDataByIdentifierRequest_template(const WriteDataByIdentifierRequest& other_value);
WriteDataByIdentifierRequest_template(const OPTIONAL<WriteDataByIdentifierRequest>& other_value);
WriteDataByIdentifierRequest_template(const WriteDataByIdentifierRequest_template& other_value);
~WriteDataByIdentifierRequest_template();
void clean_up();
WriteDataByIdentifierRequest_template& operator=(template_sel other_value);
WriteDataByIdentifierRequest_template& operator=(const WriteDataByIdentifierRequest& other_value);
WriteDataByIdentifierRequest_template& operator=(const OPTIONAL<WriteDataByIdentifierRequest>& other_value);
WriteDataByIdentifierRequest_template& operator=(const WriteDataByIdentifierRequest_template& other_value);
boolean match(const WriteDataByIdentifierRequest& other_value, boolean legacy = FALSE) const;
boolean is_value() const;WriteDataByIdentifierRequest valueof() const;
WriteDataByIdentifierRequest_template& list_item(unsigned int list_index) const;
void set_type(template_sel template_type, unsigned int list_length);
WriteDataByIdentifierRequest1_template& writeDataByIdentifier1();
const WriteDataByIdentifierRequest1_template& writeDataByIdentifier1() const;
WriteDataByIdentifierRequest2_template& writeDataByIdentifier2();
const WriteDataByIdentifierRequest2_template& writeDataByIdentifier2() const;
WriteDataByIdentifierRequest3_template& writeDataByIdentifier3();
const WriteDataByIdentifierRequest3_template& writeDataByIdentifier3() const;
boolean ischosen(WriteDataByIdentifierRequest::union_selection_type checked_selection) const;
void log() const;
void log_match(const WriteDataByIdentifierRequest& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class WriteDataByIdentifierRequestSID : public Base_Type {
  OCTETSTRING field_sid;
  WriteDataByIdentifierRequest field_writeDataByIdentifierRequest;
public:
  WriteDataByIdentifierRequestSID();
  WriteDataByIdentifierRequestSID(const OCTETSTRING& par_sid,
    const WriteDataByIdentifierRequest& par_writeDataByIdentifierRequest);
  WriteDataByIdentifierRequestSID(const WriteDataByIdentifierRequestSID& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  WriteDataByIdentifierRequestSID& operator=(const WriteDataByIdentifierRequestSID& other_value);
  boolean operator==(const WriteDataByIdentifierRequestSID& other_value) const;
  inline boolean operator!=(const WriteDataByIdentifierRequestSID& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& sid()
    {return field_sid;}
  inline const OCTETSTRING& sid() const
    {return field_sid;}
  inline WriteDataByIdentifierRequest& writeDataByIdentifierRequest()
    {return field_writeDataByIdentifierRequest;}
  inline const WriteDataByIdentifierRequest& writeDataByIdentifierRequest() const
    {return field_writeDataByIdentifierRequest;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class WriteDataByIdentifierRequestSID_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
WriteDataByIdentifierRequestSID_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const WriteDataByIdentifierRequestSID& other_value);
void copy_template(const WriteDataByIdentifierRequestSID_template& other_value);

public:
WriteDataByIdentifierRequestSID_template();
WriteDataByIdentifierRequestSID_template(template_sel other_value);
WriteDataByIdentifierRequestSID_template(const WriteDataByIdentifierRequestSID& other_value);
WriteDataByIdentifierRequestSID_template(const OPTIONAL<WriteDataByIdentifierRequestSID>& other_value);
WriteDataByIdentifierRequestSID_template(const WriteDataByIdentifierRequestSID_template& other_value);
~WriteDataByIdentifierRequestSID_template();
WriteDataByIdentifierRequestSID_template& operator=(template_sel other_value);
WriteDataByIdentifierRequestSID_template& operator=(const WriteDataByIdentifierRequestSID& other_value);
WriteDataByIdentifierRequestSID_template& operator=(const OPTIONAL<WriteDataByIdentifierRequestSID>& other_value);
WriteDataByIdentifierRequestSID_template& operator=(const WriteDataByIdentifierRequestSID_template& other_value);
boolean match(const WriteDataByIdentifierRequestSID& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
WriteDataByIdentifierRequestSID valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
WriteDataByIdentifierRequestSID_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& sid();
const OCTETSTRING_template& sid() const;
WriteDataByIdentifierRequest_template& writeDataByIdentifierRequest();
const WriteDataByIdentifierRequest_template& writeDataByIdentifierRequest() const;
int size_of() const;
void log() const;
void log_match(const WriteDataByIdentifierRequestSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class WriteDataByIdentifierResponse1 : public Base_Type {
  OCTETSTRING field_identifier;
public:
  WriteDataByIdentifierResponse1();
  WriteDataByIdentifierResponse1(const OCTETSTRING& par_identifier);
  WriteDataByIdentifierResponse1(const WriteDataByIdentifierResponse1& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  WriteDataByIdentifierResponse1& operator=(const WriteDataByIdentifierResponse1& other_value);
  boolean operator==(const WriteDataByIdentifierResponse1& other_value) const;
  inline boolean operator!=(const WriteDataByIdentifierResponse1& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& identifier()
    {return field_identifier;}
  inline const OCTETSTRING& identifier() const
    {return field_identifier;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class WriteDataByIdentifierResponse1_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
WriteDataByIdentifierResponse1_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const WriteDataByIdentifierResponse1& other_value);
void copy_template(const WriteDataByIdentifierResponse1_template& other_value);

public:
WriteDataByIdentifierResponse1_template();
WriteDataByIdentifierResponse1_template(template_sel other_value);
WriteDataByIdentifierResponse1_template(const WriteDataByIdentifierResponse1& other_value);
WriteDataByIdentifierResponse1_template(const OPTIONAL<WriteDataByIdentifierResponse1>& other_value);
WriteDataByIdentifierResponse1_template(const WriteDataByIdentifierResponse1_template& other_value);
~WriteDataByIdentifierResponse1_template();
WriteDataByIdentifierResponse1_template& operator=(template_sel other_value);
WriteDataByIdentifierResponse1_template& operator=(const WriteDataByIdentifierResponse1& other_value);
WriteDataByIdentifierResponse1_template& operator=(const OPTIONAL<WriteDataByIdentifierResponse1>& other_value);
WriteDataByIdentifierResponse1_template& operator=(const WriteDataByIdentifierResponse1_template& other_value);
boolean match(const WriteDataByIdentifierResponse1& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
WriteDataByIdentifierResponse1 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
WriteDataByIdentifierResponse1_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& identifier();
const OCTETSTRING_template& identifier() const;
int size_of() const;
void log() const;
void log_match(const WriteDataByIdentifierResponse1& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class WriteDataByIdentifierResponse2 : public Base_Type {
  OCTETSTRING field_identifier;
public:
  WriteDataByIdentifierResponse2();
  WriteDataByIdentifierResponse2(const OCTETSTRING& par_identifier);
  WriteDataByIdentifierResponse2(const WriteDataByIdentifierResponse2& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  WriteDataByIdentifierResponse2& operator=(const WriteDataByIdentifierResponse2& other_value);
  boolean operator==(const WriteDataByIdentifierResponse2& other_value) const;
  inline boolean operator!=(const WriteDataByIdentifierResponse2& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& identifier()
    {return field_identifier;}
  inline const OCTETSTRING& identifier() const
    {return field_identifier;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class WriteDataByIdentifierResponse2_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
WriteDataByIdentifierResponse2_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const WriteDataByIdentifierResponse2& other_value);
void copy_template(const WriteDataByIdentifierResponse2_template& other_value);

public:
WriteDataByIdentifierResponse2_template();
WriteDataByIdentifierResponse2_template(template_sel other_value);
WriteDataByIdentifierResponse2_template(const WriteDataByIdentifierResponse2& other_value);
WriteDataByIdentifierResponse2_template(const OPTIONAL<WriteDataByIdentifierResponse2>& other_value);
WriteDataByIdentifierResponse2_template(const WriteDataByIdentifierResponse2_template& other_value);
~WriteDataByIdentifierResponse2_template();
WriteDataByIdentifierResponse2_template& operator=(template_sel other_value);
WriteDataByIdentifierResponse2_template& operator=(const WriteDataByIdentifierResponse2& other_value);
WriteDataByIdentifierResponse2_template& operator=(const OPTIONAL<WriteDataByIdentifierResponse2>& other_value);
WriteDataByIdentifierResponse2_template& operator=(const WriteDataByIdentifierResponse2_template& other_value);
boolean match(const WriteDataByIdentifierResponse2& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
WriteDataByIdentifierResponse2 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
WriteDataByIdentifierResponse2_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& identifier();
const OCTETSTRING_template& identifier() const;
int size_of() const;
void log() const;
void log_match(const WriteDataByIdentifierResponse2& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class WriteDataByIdentifierResponse3 : public Base_Type {
  OCTETSTRING field_identifier;
public:
  WriteDataByIdentifierResponse3();
  WriteDataByIdentifierResponse3(const OCTETSTRING& par_identifier);
  WriteDataByIdentifierResponse3(const WriteDataByIdentifierResponse3& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  WriteDataByIdentifierResponse3& operator=(const WriteDataByIdentifierResponse3& other_value);
  boolean operator==(const WriteDataByIdentifierResponse3& other_value) const;
  inline boolean operator!=(const WriteDataByIdentifierResponse3& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& identifier()
    {return field_identifier;}
  inline const OCTETSTRING& identifier() const
    {return field_identifier;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class WriteDataByIdentifierResponse3_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
WriteDataByIdentifierResponse3_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const WriteDataByIdentifierResponse3& other_value);
void copy_template(const WriteDataByIdentifierResponse3_template& other_value);

public:
WriteDataByIdentifierResponse3_template();
WriteDataByIdentifierResponse3_template(template_sel other_value);
WriteDataByIdentifierResponse3_template(const WriteDataByIdentifierResponse3& other_value);
WriteDataByIdentifierResponse3_template(const OPTIONAL<WriteDataByIdentifierResponse3>& other_value);
WriteDataByIdentifierResponse3_template(const WriteDataByIdentifierResponse3_template& other_value);
~WriteDataByIdentifierResponse3_template();
WriteDataByIdentifierResponse3_template& operator=(template_sel other_value);
WriteDataByIdentifierResponse3_template& operator=(const WriteDataByIdentifierResponse3& other_value);
WriteDataByIdentifierResponse3_template& operator=(const OPTIONAL<WriteDataByIdentifierResponse3>& other_value);
WriteDataByIdentifierResponse3_template& operator=(const WriteDataByIdentifierResponse3_template& other_value);
boolean match(const WriteDataByIdentifierResponse3& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
WriteDataByIdentifierResponse3 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
WriteDataByIdentifierResponse3_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& identifier();
const OCTETSTRING_template& identifier() const;
int size_of() const;
void log() const;
void log_match(const WriteDataByIdentifierResponse3& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class WriteDataByIdentifierResponse : public Base_Type {
public:
enum union_selection_type { UNBOUND_VALUE = 0, ALT_writeDataByIdentifier1 = 1, ALT_writeDataByIdentifier2 = 2, ALT_writeDataByIdentifier3 = 3 };
private:
union_selection_type union_selection;
union {
WriteDataByIdentifierResponse1 *field_writeDataByIdentifier1;
WriteDataByIdentifierResponse2 *field_writeDataByIdentifier2;
WriteDataByIdentifierResponse3 *field_writeDataByIdentifier3;
};
void copy_value(const WriteDataByIdentifierResponse& other_value);

public:
WriteDataByIdentifierResponse();
WriteDataByIdentifierResponse(const WriteDataByIdentifierResponse& other_value);
~WriteDataByIdentifierResponse();
WriteDataByIdentifierResponse& operator=(const WriteDataByIdentifierResponse& other_value);
boolean operator==(const WriteDataByIdentifierResponse& other_value) const;
inline boolean operator!=(const WriteDataByIdentifierResponse& other_value) const { return !(*this == other_value); }
WriteDataByIdentifierResponse1& writeDataByIdentifier1();
const WriteDataByIdentifierResponse1& writeDataByIdentifier1() const;
WriteDataByIdentifierResponse2& writeDataByIdentifier2();
const WriteDataByIdentifierResponse2& writeDataByIdentifier2() const;
WriteDataByIdentifierResponse3& writeDataByIdentifier3();
const WriteDataByIdentifierResponse3& writeDataByIdentifier3() const;
inline union_selection_type get_selection() const { return union_selection; }
boolean ischosen(union_selection_type checked_selection) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
  void set_implicit_omit();
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class WriteDataByIdentifierResponse_template : public Base_Template {
union {
struct {
WriteDataByIdentifierResponse::union_selection_type union_selection;
union {
WriteDataByIdentifierResponse1_template *field_writeDataByIdentifier1;
WriteDataByIdentifierResponse2_template *field_writeDataByIdentifier2;
WriteDataByIdentifierResponse3_template *field_writeDataByIdentifier3;
};
} single_value;
struct {
unsigned int n_values;
WriteDataByIdentifierResponse_template *list_value;
} value_list;
};
void copy_value(const WriteDataByIdentifierResponse& other_value);

void copy_template(const WriteDataByIdentifierResponse_template& other_value);

public:
WriteDataByIdentifierResponse_template();
WriteDataByIdentifierResponse_template(template_sel other_value);
WriteDataByIdentifierResponse_template(const WriteDataByIdentifierResponse& other_value);
WriteDataByIdentifierResponse_template(const OPTIONAL<WriteDataByIdentifierResponse>& other_value);
WriteDataByIdentifierResponse_template(const WriteDataByIdentifierResponse_template& other_value);
~WriteDataByIdentifierResponse_template();
void clean_up();
WriteDataByIdentifierResponse_template& operator=(template_sel other_value);
WriteDataByIdentifierResponse_template& operator=(const WriteDataByIdentifierResponse& other_value);
WriteDataByIdentifierResponse_template& operator=(const OPTIONAL<WriteDataByIdentifierResponse>& other_value);
WriteDataByIdentifierResponse_template& operator=(const WriteDataByIdentifierResponse_template& other_value);
boolean match(const WriteDataByIdentifierResponse& other_value, boolean legacy = FALSE) const;
boolean is_value() const;WriteDataByIdentifierResponse valueof() const;
WriteDataByIdentifierResponse_template& list_item(unsigned int list_index) const;
void set_type(template_sel template_type, unsigned int list_length);
WriteDataByIdentifierResponse1_template& writeDataByIdentifier1();
const WriteDataByIdentifierResponse1_template& writeDataByIdentifier1() const;
WriteDataByIdentifierResponse2_template& writeDataByIdentifier2();
const WriteDataByIdentifierResponse2_template& writeDataByIdentifier2() const;
WriteDataByIdentifierResponse3_template& writeDataByIdentifier3();
const WriteDataByIdentifierResponse3_template& writeDataByIdentifier3() const;
boolean ischosen(WriteDataByIdentifierResponse::union_selection_type checked_selection) const;
void log() const;
void log_match(const WriteDataByIdentifierResponse& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class WriteDataByIdentifierResponseSID : public Base_Type {
  OCTETSTRING field_sid;
  WriteDataByIdentifierResponse field_writeDataByIdentifierResponse;
public:
  WriteDataByIdentifierResponseSID();
  WriteDataByIdentifierResponseSID(const OCTETSTRING& par_sid,
    const WriteDataByIdentifierResponse& par_writeDataByIdentifierResponse);
  WriteDataByIdentifierResponseSID(const WriteDataByIdentifierResponseSID& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  WriteDataByIdentifierResponseSID& operator=(const WriteDataByIdentifierResponseSID& other_value);
  boolean operator==(const WriteDataByIdentifierResponseSID& other_value) const;
  inline boolean operator!=(const WriteDataByIdentifierResponseSID& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& sid()
    {return field_sid;}
  inline const OCTETSTRING& sid() const
    {return field_sid;}
  inline WriteDataByIdentifierResponse& writeDataByIdentifierResponse()
    {return field_writeDataByIdentifierResponse;}
  inline const WriteDataByIdentifierResponse& writeDataByIdentifierResponse() const
    {return field_writeDataByIdentifierResponse;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class WriteDataByIdentifierResponseSID_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
WriteDataByIdentifierResponseSID_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const WriteDataByIdentifierResponseSID& other_value);
void copy_template(const WriteDataByIdentifierResponseSID_template& other_value);

public:
WriteDataByIdentifierResponseSID_template();
WriteDataByIdentifierResponseSID_template(template_sel other_value);
WriteDataByIdentifierResponseSID_template(const WriteDataByIdentifierResponseSID& other_value);
WriteDataByIdentifierResponseSID_template(const OPTIONAL<WriteDataByIdentifierResponseSID>& other_value);
WriteDataByIdentifierResponseSID_template(const WriteDataByIdentifierResponseSID_template& other_value);
~WriteDataByIdentifierResponseSID_template();
WriteDataByIdentifierResponseSID_template& operator=(template_sel other_value);
WriteDataByIdentifierResponseSID_template& operator=(const WriteDataByIdentifierResponseSID& other_value);
WriteDataByIdentifierResponseSID_template& operator=(const OPTIONAL<WriteDataByIdentifierResponseSID>& other_value);
WriteDataByIdentifierResponseSID_template& operator=(const WriteDataByIdentifierResponseSID_template& other_value);
boolean match(const WriteDataByIdentifierResponseSID& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
WriteDataByIdentifierResponseSID valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
WriteDataByIdentifierResponseSID_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& sid();
const OCTETSTRING_template& sid() const;
WriteDataByIdentifierResponse_template& writeDataByIdentifierResponse();
const WriteDataByIdentifierResponse_template& writeDataByIdentifierResponse() const;
int size_of() const;
void log() const;
void log_match(const WriteDataByIdentifierResponseSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class e__RequestSID : public Base_Type { // enum
friend class e__RequestSID_template;
public:
enum enum_type { diagnosticSessionControl = 16, ecuReset = 17, clearDiagnosticInformation = 20, readDTCInformation = 25, readDataByIdentifier = 34, readMemoryByAddress = 35, readScalingDataByIdentifier = 36, securityAccess = 39, communicationControl = 40, readDataByPeriodicIdentifier = 42, dynamicallyDefineDataIdentifier = 44, writeDataByIdentifier = 46, inputOutputControlByIdentifier = 47, routineControl = 49, requestDownload = 52, requestUpload = 53, transferData = 54, requestTransferExit = 55, requestFileTransfer = 56, writeMemoryByAddress = 61, testerPresent = 62, accessTimingParameter = 131, securedDataTransmission = 132, controlDTCSetting = 133, responseOnEvent = 134, linkControl = 135, UNKNOWN_VALUE = 0, UNBOUND_VALUE = 1 };
private:
enum_type enum_value;

public:
e__RequestSID();
e__RequestSID(int other_value);
e__RequestSID(enum_type other_value);
e__RequestSID(const e__RequestSID& other_value);

e__RequestSID& operator=(int other_value);
e__RequestSID& operator=(enum_type other_value);
e__RequestSID& operator=(const e__RequestSID& other_value);

boolean operator==(enum_type other_value) const;
boolean operator==(const e__RequestSID& other_value) const;
inline boolean operator!=(enum_type other_value) const { return !(*this == other_value); }
inline boolean operator!=(const e__RequestSID& other_value) const { return !(*this == other_value); }
boolean operator<(enum_type other_value) const;
boolean operator<(const e__RequestSID& other_value) const;
boolean operator>(enum_type other_value) const;
boolean operator>(const e__RequestSID& other_value) const;
inline boolean operator<=(enum_type other_value) const { return !(*this > other_value); }
inline boolean operator<=(const e__RequestSID& other_value) const { return !(*this > other_value); }
inline boolean operator>=(enum_type other_value) const { return !(*this < other_value); }
inline boolean operator>=(const e__RequestSID& other_value) const { return !(*this < other_value); }

static const char *enum_to_str(enum_type enum_par);
static enum_type str_to_enum(const char *str_par);
static boolean is_valid_enum(int int_par);

static int enum2int(enum_type enum_par);
static int enum2int(const e__RequestSID& enum_par);
int as_int() const { return enum2int(enum_value); }
void from_int(int p_val) { *this = p_val; }
void int2enum(int int_val);
operator enum_type() const;
inline boolean is_bound() const { return enum_value != UNBOUND_VALUE; }
inline boolean is_value() const { return enum_value != UNBOUND_VALUE; }
inline void clean_up(){ enum_value = UNBOUND_VALUE; }
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class e__RequestSID_template : public Base_Template {
union {
e__RequestSID::enum_type single_value;
struct {
unsigned int n_values;
e__RequestSID_template *list_value;
} value_list;
};

void copy_template(const e__RequestSID_template& other_value);

public:
e__RequestSID_template();
e__RequestSID_template(template_sel other_value);
e__RequestSID_template(int other_value);
e__RequestSID_template(e__RequestSID::enum_type other_value);
e__RequestSID_template(const e__RequestSID& other_value);
e__RequestSID_template(const OPTIONAL<e__RequestSID>& other_value);
e__RequestSID_template(const e__RequestSID_template& other_value);
~e__RequestSID_template();

boolean is_bound() const;
boolean is_value() const;
void clean_up();
e__RequestSID_template& operator=(template_sel other_value);
e__RequestSID_template& operator=(int other_value);
e__RequestSID_template& operator=(e__RequestSID::enum_type other_value);
e__RequestSID_template& operator=(const e__RequestSID& other_value);
e__RequestSID_template& operator=(const OPTIONAL<e__RequestSID>& other_value);
e__RequestSID_template& operator=(const e__RequestSID_template& other_value);

boolean match(e__RequestSID::enum_type other_value, boolean legacy = FALSE) const;
boolean match(const e__RequestSID& other_value, boolean legacy = FALSE) const;
e__RequestSID::enum_type valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
e__RequestSID_template& list_item(unsigned int list_index);
void log() const;
void log_match(const e__RequestSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class e__ResponseCode : public Base_Type { // enum
friend class e__ResponseCode_template;
public:
enum enum_type { generalReject = 16, serviceNotSupported = 17, subfunctionNotSupported = 18, incorrectMessageLengthOrInvalidFormat = 19, responseTooLong = 20, busyRepeatRequest = 33, conditionsNotCorrect = 34, isosarReserved35 = 35, requestSequenceError = 36, noResponseFromSubnetComponent = 37, failurePreventsExecutionOfRequestedAction = 38, requestOutOfRange = 49, isosarReserved50 = 50, securityAccessDenied = 51, isosarReserved52 = 52, invalidKey = 53, exceededNumberOfAttempts = 54, requiredTimeDelayNotExpired = 55, uploadDownloadNotAccepted = 112, transferDataSuspended = 113, generalProgrammingFailure = 114, wrongBlockSequenceCounter = 115, requestCorrectlyReceivedResponsePending = 120, subfunctionNotSupportedInActiveSession = 126, serviceNotSupportedInActiveSession = 127, rpmTooHigh = 129, rpmTooLow = 130, engineIsRunning = 131, engineIsNotRunning = 132, engineRunTimeTooLow = 133, temperatureTooHigh = 134, temperatureTooLow = 135, vehicleSpeedTooHigh = 136, vehicleSpeedTooLow = 137, throttle__PedalTooHigh = 138, throttle__PedalTooLow = 139, transmissionRangeNotInNeutral = 140, transmissionRangeNotInGear = 141, brakeSwitchesNotClosed = 143, shifterLeverNotInPark = 144, torqueConverterClutchLocked = 145, voltageTooHigh = 146, voltageTooLow = 147, vehicleManufacturerSpecificConditionsNotCorrectF0 = 240, vehicleManufacturerSpecificConditionsNotCorrectF1 = 241, vehicleManufacturerSpecificConditionsNotCorrectF2 = 242, vehicleManufacturerSpecificConditionsNotCorrectF3 = 243, vehicleManufacturerSpecificConditionsNotCorrectF4 = 244, vehicleManufacturerSpecificConditionsNotCorrectF5 = 245, vehicleManufacturerSpecificConditionsNotCorrectF6 = 246, vehicleManufacturerSpecificConditionsNotCorrectF7 = 247, vehicleManufacturerSpecificConditionsNotCorrectF8 = 248, vehicleManufacturerSpecificConditionsNotCorrectF9 = 249, vehicleManufacturerSpecificConditionsNotCorrectFA = 250, vehicleManufacturerSpecificConditionsNotCorrectFB = 251, vehicleManufacturerSpecificConditionsNotCorrectFC = 252, vehicleManufacturerSpecificConditionsNotCorrectFD = 253, vehicleManufacturerSpecificConditionsNotCorrectFE = 254, UNKNOWN_VALUE = 0, UNBOUND_VALUE = 1 };
private:
enum_type enum_value;

public:
e__ResponseCode();
e__ResponseCode(int other_value);
e__ResponseCode(enum_type other_value);
e__ResponseCode(const e__ResponseCode& other_value);

e__ResponseCode& operator=(int other_value);
e__ResponseCode& operator=(enum_type other_value);
e__ResponseCode& operator=(const e__ResponseCode& other_value);

boolean operator==(enum_type other_value) const;
boolean operator==(const e__ResponseCode& other_value) const;
inline boolean operator!=(enum_type other_value) const { return !(*this == other_value); }
inline boolean operator!=(const e__ResponseCode& other_value) const { return !(*this == other_value); }
boolean operator<(enum_type other_value) const;
boolean operator<(const e__ResponseCode& other_value) const;
boolean operator>(enum_type other_value) const;
boolean operator>(const e__ResponseCode& other_value) const;
inline boolean operator<=(enum_type other_value) const { return !(*this > other_value); }
inline boolean operator<=(const e__ResponseCode& other_value) const { return !(*this > other_value); }
inline boolean operator>=(enum_type other_value) const { return !(*this < other_value); }
inline boolean operator>=(const e__ResponseCode& other_value) const { return !(*this < other_value); }

static const char *enum_to_str(enum_type enum_par);
static enum_type str_to_enum(const char *str_par);
static boolean is_valid_enum(int int_par);

static int enum2int(enum_type enum_par);
static int enum2int(const e__ResponseCode& enum_par);
int as_int() const { return enum2int(enum_value); }
void from_int(int p_val) { *this = p_val; }
void int2enum(int int_val);
operator enum_type() const;
inline boolean is_bound() const { return enum_value != UNBOUND_VALUE; }
inline boolean is_value() const { return enum_value != UNBOUND_VALUE; }
inline void clean_up(){ enum_value = UNBOUND_VALUE; }
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class e__ResponseCode_template : public Base_Template {
union {
e__ResponseCode::enum_type single_value;
struct {
unsigned int n_values;
e__ResponseCode_template *list_value;
} value_list;
};

void copy_template(const e__ResponseCode_template& other_value);

public:
e__ResponseCode_template();
e__ResponseCode_template(template_sel other_value);
e__ResponseCode_template(int other_value);
e__ResponseCode_template(e__ResponseCode::enum_type other_value);
e__ResponseCode_template(const e__ResponseCode& other_value);
e__ResponseCode_template(const OPTIONAL<e__ResponseCode>& other_value);
e__ResponseCode_template(const e__ResponseCode_template& other_value);
~e__ResponseCode_template();

boolean is_bound() const;
boolean is_value() const;
void clean_up();
e__ResponseCode_template& operator=(template_sel other_value);
e__ResponseCode_template& operator=(int other_value);
e__ResponseCode_template& operator=(e__ResponseCode::enum_type other_value);
e__ResponseCode_template& operator=(const e__ResponseCode& other_value);
e__ResponseCode_template& operator=(const OPTIONAL<e__ResponseCode>& other_value);
e__ResponseCode_template& operator=(const e__ResponseCode_template& other_value);

boolean match(e__ResponseCode::enum_type other_value, boolean legacy = FALSE) const;
boolean match(const e__ResponseCode& other_value, boolean legacy = FALSE) const;
e__ResponseCode::enum_type valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
e__ResponseCode_template& list_item(unsigned int list_index);
void log() const;
void log_match(const e__ResponseCode& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class NegativeResponseCodeSID : public Base_Type {
  OCTETSTRING field_sid;
  e__RequestSID field_requestSID;
  e__ResponseCode field_responseCode;
public:
  NegativeResponseCodeSID();
  NegativeResponseCodeSID(const OCTETSTRING& par_sid,
    const e__RequestSID& par_requestSID,
    const e__ResponseCode& par_responseCode);
  NegativeResponseCodeSID(const NegativeResponseCodeSID& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  NegativeResponseCodeSID& operator=(const NegativeResponseCodeSID& other_value);
  boolean operator==(const NegativeResponseCodeSID& other_value) const;
  inline boolean operator!=(const NegativeResponseCodeSID& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& sid()
    {return field_sid;}
  inline const OCTETSTRING& sid() const
    {return field_sid;}
  inline e__RequestSID& requestSID()
    {return field_requestSID;}
  inline const e__RequestSID& requestSID() const
    {return field_requestSID;}
  inline e__ResponseCode& responseCode()
    {return field_responseCode;}
  inline const e__ResponseCode& responseCode() const
    {return field_responseCode;}
  inline int size_of() const
    {return 3;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class NegativeResponseCodeSID_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
NegativeResponseCodeSID_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const NegativeResponseCodeSID& other_value);
void copy_template(const NegativeResponseCodeSID_template& other_value);

public:
NegativeResponseCodeSID_template();
NegativeResponseCodeSID_template(template_sel other_value);
NegativeResponseCodeSID_template(const NegativeResponseCodeSID& other_value);
NegativeResponseCodeSID_template(const OPTIONAL<NegativeResponseCodeSID>& other_value);
NegativeResponseCodeSID_template(const NegativeResponseCodeSID_template& other_value);
~NegativeResponseCodeSID_template();
NegativeResponseCodeSID_template& operator=(template_sel other_value);
NegativeResponseCodeSID_template& operator=(const NegativeResponseCodeSID& other_value);
NegativeResponseCodeSID_template& operator=(const OPTIONAL<NegativeResponseCodeSID>& other_value);
NegativeResponseCodeSID_template& operator=(const NegativeResponseCodeSID_template& other_value);
boolean match(const NegativeResponseCodeSID& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
NegativeResponseCodeSID valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
NegativeResponseCodeSID_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& sid();
const OCTETSTRING_template& sid() const;
e__RequestSID_template& requestSID();
const e__RequestSID_template& requestSID() const;
e__ResponseCode_template& responseCode();
const e__ResponseCode_template& responseCode() const;
int size_of() const;
void log() const;
void log_match(const NegativeResponseCodeSID& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class TopLevelMessage__UDS__requests : public Base_Type {
public:
enum union_selection_type { UNBOUND_VALUE = 0, ALT_diagnosticSessionControlRequestSID = 1, ALT_ecuResetRequestSID = 2, ALT_securityAccessRequestSID = 3, ALT_communicationControlRequestSID = 4, ALT_testerPresentRequestSID = 5, ALT_readDataByIdentifierRequestSID = 6, ALT_writeDataByIdentifierRequestSID = 7 };
private:
union_selection_type union_selection;
union {
DiagnosticSessionControlRequestSID *field_diagnosticSessionControlRequestSID;
ECUResetRequestSID *field_ecuResetRequestSID;
SecurityAccessRequestSID *field_securityAccessRequestSID;
CommunicationControlRequestSID *field_communicationControlRequestSID;
TesterPresentRequestSID *field_testerPresentRequestSID;
ReadDataByIdentifierRequestSID *field_readDataByIdentifierRequestSID;
WriteDataByIdentifierRequestSID *field_writeDataByIdentifierRequestSID;
};
void copy_value(const TopLevelMessage__UDS__requests& other_value);

public:
TopLevelMessage__UDS__requests();
TopLevelMessage__UDS__requests(const TopLevelMessage__UDS__requests& other_value);
~TopLevelMessage__UDS__requests();
TopLevelMessage__UDS__requests& operator=(const TopLevelMessage__UDS__requests& other_value);
boolean operator==(const TopLevelMessage__UDS__requests& other_value) const;
inline boolean operator!=(const TopLevelMessage__UDS__requests& other_value) const { return !(*this == other_value); }
DiagnosticSessionControlRequestSID& diagnosticSessionControlRequestSID();
const DiagnosticSessionControlRequestSID& diagnosticSessionControlRequestSID() const;
ECUResetRequestSID& ecuResetRequestSID();
const ECUResetRequestSID& ecuResetRequestSID() const;
SecurityAccessRequestSID& securityAccessRequestSID();
const SecurityAccessRequestSID& securityAccessRequestSID() const;
CommunicationControlRequestSID& communicationControlRequestSID();
const CommunicationControlRequestSID& communicationControlRequestSID() const;
TesterPresentRequestSID& testerPresentRequestSID();
const TesterPresentRequestSID& testerPresentRequestSID() const;
ReadDataByIdentifierRequestSID& readDataByIdentifierRequestSID();
const ReadDataByIdentifierRequestSID& readDataByIdentifierRequestSID() const;
WriteDataByIdentifierRequestSID& writeDataByIdentifierRequestSID();
const WriteDataByIdentifierRequestSID& writeDataByIdentifierRequestSID() const;
inline union_selection_type get_selection() const { return union_selection; }
boolean ischosen(union_selection_type checked_selection) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
  void set_implicit_omit();
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class TopLevelMessage__UDS__requests_template : public Base_Template {
union {
struct {
TopLevelMessage__UDS__requests::union_selection_type union_selection;
union {
DiagnosticSessionControlRequestSID_template *field_diagnosticSessionControlRequestSID;
ECUResetRequestSID_template *field_ecuResetRequestSID;
SecurityAccessRequestSID_template *field_securityAccessRequestSID;
CommunicationControlRequestSID_template *field_communicationControlRequestSID;
TesterPresentRequestSID_template *field_testerPresentRequestSID;
ReadDataByIdentifierRequestSID_template *field_readDataByIdentifierRequestSID;
WriteDataByIdentifierRequestSID_template *field_writeDataByIdentifierRequestSID;
};
} single_value;
struct {
unsigned int n_values;
TopLevelMessage__UDS__requests_template *list_value;
} value_list;
};
void copy_value(const TopLevelMessage__UDS__requests& other_value);

void copy_template(const TopLevelMessage__UDS__requests_template& other_value);

public:
TopLevelMessage__UDS__requests_template();
TopLevelMessage__UDS__requests_template(template_sel other_value);
TopLevelMessage__UDS__requests_template(const TopLevelMessage__UDS__requests& other_value);
TopLevelMessage__UDS__requests_template(const OPTIONAL<TopLevelMessage__UDS__requests>& other_value);
TopLevelMessage__UDS__requests_template(const TopLevelMessage__UDS__requests_template& other_value);
~TopLevelMessage__UDS__requests_template();
void clean_up();
TopLevelMessage__UDS__requests_template& operator=(template_sel other_value);
TopLevelMessage__UDS__requests_template& operator=(const TopLevelMessage__UDS__requests& other_value);
TopLevelMessage__UDS__requests_template& operator=(const OPTIONAL<TopLevelMessage__UDS__requests>& other_value);
TopLevelMessage__UDS__requests_template& operator=(const TopLevelMessage__UDS__requests_template& other_value);
boolean match(const TopLevelMessage__UDS__requests& other_value, boolean legacy = FALSE) const;
boolean is_value() const;TopLevelMessage__UDS__requests valueof() const;
TopLevelMessage__UDS__requests_template& list_item(unsigned int list_index) const;
void set_type(template_sel template_type, unsigned int list_length);
DiagnosticSessionControlRequestSID_template& diagnosticSessionControlRequestSID();
const DiagnosticSessionControlRequestSID_template& diagnosticSessionControlRequestSID() const;
ECUResetRequestSID_template& ecuResetRequestSID();
const ECUResetRequestSID_template& ecuResetRequestSID() const;
SecurityAccessRequestSID_template& securityAccessRequestSID();
const SecurityAccessRequestSID_template& securityAccessRequestSID() const;
CommunicationControlRequestSID_template& communicationControlRequestSID();
const CommunicationControlRequestSID_template& communicationControlRequestSID() const;
TesterPresentRequestSID_template& testerPresentRequestSID();
const TesterPresentRequestSID_template& testerPresentRequestSID() const;
ReadDataByIdentifierRequestSID_template& readDataByIdentifierRequestSID();
const ReadDataByIdentifierRequestSID_template& readDataByIdentifierRequestSID() const;
WriteDataByIdentifierRequestSID_template& writeDataByIdentifierRequestSID();
const WriteDataByIdentifierRequestSID_template& writeDataByIdentifierRequestSID() const;
boolean ischosen(TopLevelMessage__UDS__requests::union_selection_type checked_selection) const;
void log() const;
void log_match(const TopLevelMessage__UDS__requests& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class TopLevelMessage__UDS__responses : public Base_Type {
public:
enum union_selection_type { UNBOUND_VALUE = 0, ALT_diagnosticSessionControlResponseSID = 1, ALT_ecuResetResponseSID = 2, ALT_securityAccessResponseSID = 3, ALT_communicationControlResponseSID = 4, ALT_testerPresentResponseSID = 5, ALT_readDataByIdentifierResponseSID = 6, ALT_writeDataByIdentifierResponseSID = 7, ALT_negativeResponseCodeSID = 8 };
private:
union_selection_type union_selection;
union {
DiagnosticSessionControlResponseSID *field_diagnosticSessionControlResponseSID;
ECUResetResponseSID *field_ecuResetResponseSID;
SecurityAccessResponseSID *field_securityAccessResponseSID;
CommunicationControlResponseSID *field_communicationControlResponseSID;
TesterPresentResponseSID *field_testerPresentResponseSID;
ReadDataByIdentifierResponseSID *field_readDataByIdentifierResponseSID;
WriteDataByIdentifierResponseSID *field_writeDataByIdentifierResponseSID;
NegativeResponseCodeSID *field_negativeResponseCodeSID;
};
void copy_value(const TopLevelMessage__UDS__responses& other_value);

public:
TopLevelMessage__UDS__responses();
TopLevelMessage__UDS__responses(const TopLevelMessage__UDS__responses& other_value);
~TopLevelMessage__UDS__responses();
TopLevelMessage__UDS__responses& operator=(const TopLevelMessage__UDS__responses& other_value);
boolean operator==(const TopLevelMessage__UDS__responses& other_value) const;
inline boolean operator!=(const TopLevelMessage__UDS__responses& other_value) const { return !(*this == other_value); }
DiagnosticSessionControlResponseSID& diagnosticSessionControlResponseSID();
const DiagnosticSessionControlResponseSID& diagnosticSessionControlResponseSID() const;
ECUResetResponseSID& ecuResetResponseSID();
const ECUResetResponseSID& ecuResetResponseSID() const;
SecurityAccessResponseSID& securityAccessResponseSID();
const SecurityAccessResponseSID& securityAccessResponseSID() const;
CommunicationControlResponseSID& communicationControlResponseSID();
const CommunicationControlResponseSID& communicationControlResponseSID() const;
TesterPresentResponseSID& testerPresentResponseSID();
const TesterPresentResponseSID& testerPresentResponseSID() const;
ReadDataByIdentifierResponseSID& readDataByIdentifierResponseSID();
const ReadDataByIdentifierResponseSID& readDataByIdentifierResponseSID() const;
WriteDataByIdentifierResponseSID& writeDataByIdentifierResponseSID();
const WriteDataByIdentifierResponseSID& writeDataByIdentifierResponseSID() const;
NegativeResponseCodeSID& negativeResponseCodeSID();
const NegativeResponseCodeSID& negativeResponseCodeSID() const;
inline union_selection_type get_selection() const { return union_selection; }
boolean ischosen(union_selection_type checked_selection) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
  void set_implicit_omit();
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class TopLevelMessage__UDS__responses_template : public Base_Template {
union {
struct {
TopLevelMessage__UDS__responses::union_selection_type union_selection;
union {
DiagnosticSessionControlResponseSID_template *field_diagnosticSessionControlResponseSID;
ECUResetResponseSID_template *field_ecuResetResponseSID;
SecurityAccessResponseSID_template *field_securityAccessResponseSID;
CommunicationControlResponseSID_template *field_communicationControlResponseSID;
TesterPresentResponseSID_template *field_testerPresentResponseSID;
ReadDataByIdentifierResponseSID_template *field_readDataByIdentifierResponseSID;
WriteDataByIdentifierResponseSID_template *field_writeDataByIdentifierResponseSID;
NegativeResponseCodeSID_template *field_negativeResponseCodeSID;
};
} single_value;
struct {
unsigned int n_values;
TopLevelMessage__UDS__responses_template *list_value;
} value_list;
};
void copy_value(const TopLevelMessage__UDS__responses& other_value);

void copy_template(const TopLevelMessage__UDS__responses_template& other_value);

public:
TopLevelMessage__UDS__responses_template();
TopLevelMessage__UDS__responses_template(template_sel other_value);
TopLevelMessage__UDS__responses_template(const TopLevelMessage__UDS__responses& other_value);
TopLevelMessage__UDS__responses_template(const OPTIONAL<TopLevelMessage__UDS__responses>& other_value);
TopLevelMessage__UDS__responses_template(const TopLevelMessage__UDS__responses_template& other_value);
~TopLevelMessage__UDS__responses_template();
void clean_up();
TopLevelMessage__UDS__responses_template& operator=(template_sel other_value);
TopLevelMessage__UDS__responses_template& operator=(const TopLevelMessage__UDS__responses& other_value);
TopLevelMessage__UDS__responses_template& operator=(const OPTIONAL<TopLevelMessage__UDS__responses>& other_value);
TopLevelMessage__UDS__responses_template& operator=(const TopLevelMessage__UDS__responses_template& other_value);
boolean match(const TopLevelMessage__UDS__responses& other_value, boolean legacy = FALSE) const;
boolean is_value() const;TopLevelMessage__UDS__responses valueof() const;
TopLevelMessage__UDS__responses_template& list_item(unsigned int list_index) const;
void set_type(template_sel template_type, unsigned int list_length);
DiagnosticSessionControlResponseSID_template& diagnosticSessionControlResponseSID();
const DiagnosticSessionControlResponseSID_template& diagnosticSessionControlResponseSID() const;
ECUResetResponseSID_template& ecuResetResponseSID();
const ECUResetResponseSID_template& ecuResetResponseSID() const;
SecurityAccessResponseSID_template& securityAccessResponseSID();
const SecurityAccessResponseSID_template& securityAccessResponseSID() const;
CommunicationControlResponseSID_template& communicationControlResponseSID();
const CommunicationControlResponseSID_template& communicationControlResponseSID() const;
TesterPresentResponseSID_template& testerPresentResponseSID();
const TesterPresentResponseSID_template& testerPresentResponseSID() const;
ReadDataByIdentifierResponseSID_template& readDataByIdentifierResponseSID();
const ReadDataByIdentifierResponseSID_template& readDataByIdentifierResponseSID() const;
WriteDataByIdentifierResponseSID_template& writeDataByIdentifierResponseSID();
const WriteDataByIdentifierResponseSID_template& writeDataByIdentifierResponseSID() const;
NegativeResponseCodeSID_template& negativeResponseCodeSID();
const NegativeResponseCodeSID_template& negativeResponseCodeSID() const;
boolean ischosen(TopLevelMessage__UDS__responses::union_selection_type checked_selection) const;
void log() const;
void log_match(const TopLevelMessage__UDS__responses& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};


/* Function prototypes */

extern OCTETSTRING encode__TopLevelMessage__UDS__requests(const TopLevelMessage__UDS__requests& pdu);
extern TopLevelMessage__UDS__requests decode__TopLevelMessage__UDS__requests(const OCTETSTRING& data);
extern OCTETSTRING encode__TopLevelMessage__UDS__responses(const TopLevelMessage__UDS__responses& pdu);
extern TopLevelMessage__UDS__responses decode__TopLevelMessage__UDS__responses(const OCTETSTRING& data);

/* Global variable declarations */

extern const XERdescriptor_t SID_xer_;
extern const TTCN_OERdescriptor_t SID_oer_;
extern const TTCN_Typedescriptor_t SID_descr_;
extern const TTCN_RAWdescriptor_t SuppressPosRspMsgIndicationBitType_raw_;
extern const TTCN_Typedescriptor_t SuppressPosRspMsgIndicationBitType_descr_;
extern const XERdescriptor_t DiagnosticSessionType_xer_;
extern const TTCN_OERdescriptor_t DiagnosticSessionType_oer_;
extern const TTCN_Typedescriptor_t DiagnosticSessionType_descr_;
extern const TTCN_RAWdescriptor_t DefaultSessionRequest_diagnosticSessionType_raw_;
extern const XERdescriptor_t DefaultSessionRequest_diagnosticSessionType_xer_;
extern const TTCN_OERdescriptor_t DefaultSessionRequest_diagnosticSessionType_oer_;
extern const TTCN_Typedescriptor_t DefaultSessionRequest_diagnosticSessionType_descr_;
extern const TTCN_RAWdescriptor_t DefaultSessionRequest_raw_;
extern const TTCN_Typedescriptor_t DefaultSessionRequest_descr_;
extern const TTCN_RAWdescriptor_t ProgrammingSessionRequest_diagnosticSessionType_raw_;
extern const XERdescriptor_t ProgrammingSessionRequest_diagnosticSessionType_xer_;
extern const TTCN_OERdescriptor_t ProgrammingSessionRequest_diagnosticSessionType_oer_;
extern const TTCN_Typedescriptor_t ProgrammingSessionRequest_diagnosticSessionType_descr_;
extern const TTCN_RAWdescriptor_t ProgrammingSessionRequest_raw_;
extern const TTCN_Typedescriptor_t ProgrammingSessionRequest_descr_;
extern const TTCN_RAWdescriptor_t ExtendedDiagnosticSessionRequest_diagnosticSessionType_raw_;
extern const XERdescriptor_t ExtendedDiagnosticSessionRequest_diagnosticSessionType_xer_;
extern const TTCN_OERdescriptor_t ExtendedDiagnosticSessionRequest_diagnosticSessionType_oer_;
extern const TTCN_Typedescriptor_t ExtendedDiagnosticSessionRequest_diagnosticSessionType_descr_;
extern const TTCN_RAWdescriptor_t ExtendedDiagnosticSessionRequest_raw_;
extern const TTCN_Typedescriptor_t ExtendedDiagnosticSessionRequest_descr_;
extern const TTCN_RAWdescriptor_t SafetySystemDiagnosticSessionRequest_diagnosticSessionType_raw_;
extern const XERdescriptor_t SafetySystemDiagnosticSessionRequest_diagnosticSessionType_xer_;
extern const TTCN_OERdescriptor_t SafetySystemDiagnosticSessionRequest_diagnosticSessionType_oer_;
extern const TTCN_Typedescriptor_t SafetySystemDiagnosticSessionRequest_diagnosticSessionType_descr_;
extern const TTCN_RAWdescriptor_t SafetySystemDiagnosticSessionRequest_raw_;
extern const TTCN_Typedescriptor_t SafetySystemDiagnosticSessionRequest_descr_;
extern const TTCN_RAWdescriptor_t DiagnosticSessionRequestType_raw_;
extern const TTCN_Typedescriptor_t DiagnosticSessionRequestType_descr_;
extern const TTCN_RAWdescriptor_t DiagnosticSessionControlRequestSID_sid_raw_;
extern const XERdescriptor_t DiagnosticSessionControlRequestSID_sid_xer_;
extern const TTCN_OERdescriptor_t DiagnosticSessionControlRequestSID_sid_oer_;
extern const TTCN_Typedescriptor_t DiagnosticSessionControlRequestSID_sid_descr_;
extern const TTCN_RAWdescriptor_t DiagnosticSessionControlRequestSID_suppressPosRspMsgIndicationBit_raw_;
extern const TTCN_Typedescriptor_t DiagnosticSessionControlRequestSID_suppressPosRspMsgIndicationBit_descr_;
extern const TTCN_RAWdescriptor_t DiagnosticSessionControlRequestSID_diagnosticSessionType_raw_;
extern const TTCN_Typedescriptor_t DiagnosticSessionControlRequestSID_diagnosticSessionType_descr_;
extern const TTCN_RAWdescriptor_t DiagnosticSessionControlRequestSID_raw_;
extern const TTCN_Typedescriptor_t DiagnosticSessionControlRequestSID_descr_;
extern const TTCN_RAWdescriptor_t DiagnosticSessionControlResponseSID_sid_raw_;
extern const XERdescriptor_t DiagnosticSessionControlResponseSID_sid_xer_;
extern const TTCN_OERdescriptor_t DiagnosticSessionControlResponseSID_sid_oer_;
extern const TTCN_Typedescriptor_t DiagnosticSessionControlResponseSID_sid_descr_;
extern const TTCN_RAWdescriptor_t DiagnosticSessionControlResponseSID_reserved_raw_;
extern const XERdescriptor_t DiagnosticSessionControlResponseSID_reserved_xer_;
extern const TTCN_OERdescriptor_t DiagnosticSessionControlResponseSID_reserved_oer_;
extern const TTCN_Typedescriptor_t DiagnosticSessionControlResponseSID_reserved_descr_;
extern const TTCN_RAWdescriptor_t DiagnosticSessionResponseType_raw_;
extern const TTCN_Typedescriptor_t DiagnosticSessionResponseType_descr_;
extern const TTCN_RAWdescriptor_t DefaultSessionResponse_diagnosticSessionType_raw_;
extern const XERdescriptor_t DefaultSessionResponse_diagnosticSessionType_xer_;
extern const TTCN_OERdescriptor_t DefaultSessionResponse_diagnosticSessionType_oer_;
extern const TTCN_Typedescriptor_t DefaultSessionResponse_diagnosticSessionType_descr_;
extern const TTCN_RAWdescriptor_t DefaultSessionResponse_p2ServerMax_raw_;
extern const XERdescriptor_t DefaultSessionResponse_p2ServerMax_xer_;
extern const TTCN_OERdescriptor_t DefaultSessionResponse_p2ServerMax_oer_;
extern const TTCN_Typedescriptor_t DefaultSessionResponse_p2ServerMax_descr_;
extern const TTCN_RAWdescriptor_t DefaultSessionResponse_p2StarServerMax_raw_;
extern const XERdescriptor_t DefaultSessionResponse_p2StarServerMax_xer_;
extern const TTCN_OERdescriptor_t DefaultSessionResponse_p2StarServerMax_oer_;
extern const TTCN_Typedescriptor_t DefaultSessionResponse_p2StarServerMax_descr_;
extern const TTCN_RAWdescriptor_t DefaultSessionResponse_raw_;
extern const TTCN_Typedescriptor_t DefaultSessionResponse_descr_;
extern const TTCN_RAWdescriptor_t ProgrammingSessionResponse_diagnosticSessionType_raw_;
extern const XERdescriptor_t ProgrammingSessionResponse_diagnosticSessionType_xer_;
extern const TTCN_OERdescriptor_t ProgrammingSessionResponse_diagnosticSessionType_oer_;
extern const TTCN_Typedescriptor_t ProgrammingSessionResponse_diagnosticSessionType_descr_;
extern const TTCN_RAWdescriptor_t ProgrammingSessionResponse_p2ServerMax_raw_;
extern const XERdescriptor_t ProgrammingSessionResponse_p2ServerMax_xer_;
extern const TTCN_OERdescriptor_t ProgrammingSessionResponse_p2ServerMax_oer_;
extern const TTCN_Typedescriptor_t ProgrammingSessionResponse_p2ServerMax_descr_;
extern const TTCN_RAWdescriptor_t ProgrammingSessionResponse_p2StarServerMax_raw_;
extern const XERdescriptor_t ProgrammingSessionResponse_p2StarServerMax_xer_;
extern const TTCN_OERdescriptor_t ProgrammingSessionResponse_p2StarServerMax_oer_;
extern const TTCN_Typedescriptor_t ProgrammingSessionResponse_p2StarServerMax_descr_;
extern const TTCN_RAWdescriptor_t ProgrammingSessionResponse_raw_;
extern const TTCN_Typedescriptor_t ProgrammingSessionResponse_descr_;
extern const TTCN_RAWdescriptor_t ExtendedDiagnosticSessionResponse_diagnosticSessionType_raw_;
extern const XERdescriptor_t ExtendedDiagnosticSessionResponse_diagnosticSessionType_xer_;
extern const TTCN_OERdescriptor_t ExtendedDiagnosticSessionResponse_diagnosticSessionType_oer_;
extern const TTCN_Typedescriptor_t ExtendedDiagnosticSessionResponse_diagnosticSessionType_descr_;
extern const TTCN_RAWdescriptor_t ExtendedDiagnosticSessionResponse_p2ServerMax_raw_;
extern const XERdescriptor_t ExtendedDiagnosticSessionResponse_p2ServerMax_xer_;
extern const TTCN_OERdescriptor_t ExtendedDiagnosticSessionResponse_p2ServerMax_oer_;
extern const TTCN_Typedescriptor_t ExtendedDiagnosticSessionResponse_p2ServerMax_descr_;
extern const TTCN_RAWdescriptor_t ExtendedDiagnosticSessionResponse_p2StarServerMax_raw_;
extern const XERdescriptor_t ExtendedDiagnosticSessionResponse_p2StarServerMax_xer_;
extern const TTCN_OERdescriptor_t ExtendedDiagnosticSessionResponse_p2StarServerMax_oer_;
extern const TTCN_Typedescriptor_t ExtendedDiagnosticSessionResponse_p2StarServerMax_descr_;
extern const TTCN_RAWdescriptor_t ExtendedDiagnosticSessionResponse_raw_;
extern const TTCN_Typedescriptor_t ExtendedDiagnosticSessionResponse_descr_;
extern const TTCN_RAWdescriptor_t SafetySystemDiagnosticSessionResponse_diagnosticSessionType_raw_;
extern const XERdescriptor_t SafetySystemDiagnosticSessionResponse_diagnosticSessionType_xer_;
extern const TTCN_OERdescriptor_t SafetySystemDiagnosticSessionResponse_diagnosticSessionType_oer_;
extern const TTCN_Typedescriptor_t SafetySystemDiagnosticSessionResponse_diagnosticSessionType_descr_;
extern const TTCN_RAWdescriptor_t SafetySystemDiagnosticSessionResponse_p2ServerMax_raw_;
extern const XERdescriptor_t SafetySystemDiagnosticSessionResponse_p2ServerMax_xer_;
extern const TTCN_OERdescriptor_t SafetySystemDiagnosticSessionResponse_p2ServerMax_oer_;
extern const TTCN_Typedescriptor_t SafetySystemDiagnosticSessionResponse_p2ServerMax_descr_;
extern const TTCN_RAWdescriptor_t SafetySystemDiagnosticSessionResponse_p2StarServerMax_raw_;
extern const XERdescriptor_t SafetySystemDiagnosticSessionResponse_p2StarServerMax_xer_;
extern const TTCN_OERdescriptor_t SafetySystemDiagnosticSessionResponse_p2StarServerMax_oer_;
extern const TTCN_Typedescriptor_t SafetySystemDiagnosticSessionResponse_p2StarServerMax_descr_;
extern const TTCN_RAWdescriptor_t SafetySystemDiagnosticSessionResponse_raw_;
extern const TTCN_Typedescriptor_t SafetySystemDiagnosticSessionResponse_descr_;
extern const TTCN_RAWdescriptor_t DiagnosticSessionControlResponseSID_diagnosticSessionType_raw_;
extern const TTCN_Typedescriptor_t DiagnosticSessionControlResponseSID_diagnosticSessionType_descr_;
extern const TTCN_RAWdescriptor_t DiagnosticSessionControlResponseSID_raw_;
extern const TTCN_Typedescriptor_t DiagnosticSessionControlResponseSID_descr_;
extern const XERdescriptor_t ResetType_xer_;
extern const TTCN_OERdescriptor_t ResetType_oer_;
extern const TTCN_Typedescriptor_t ResetType_descr_;
extern const TTCN_RAWdescriptor_t HardResetRequest_resetType_raw_;
extern const XERdescriptor_t HardResetRequest_resetType_xer_;
extern const TTCN_OERdescriptor_t HardResetRequest_resetType_oer_;
extern const TTCN_Typedescriptor_t HardResetRequest_resetType_descr_;
extern const TTCN_RAWdescriptor_t HardResetRequest_raw_;
extern const TTCN_Typedescriptor_t HardResetRequest_descr_;
extern const TTCN_RAWdescriptor_t KeyOffOnResetRequest_resetType_raw_;
extern const XERdescriptor_t KeyOffOnResetRequest_resetType_xer_;
extern const TTCN_OERdescriptor_t KeyOffOnResetRequest_resetType_oer_;
extern const TTCN_Typedescriptor_t KeyOffOnResetRequest_resetType_descr_;
extern const TTCN_RAWdescriptor_t KeyOffOnResetRequest_raw_;
extern const TTCN_Typedescriptor_t KeyOffOnResetRequest_descr_;
extern const TTCN_RAWdescriptor_t SoftResetRequest_resetType_raw_;
extern const XERdescriptor_t SoftResetRequest_resetType_xer_;
extern const TTCN_OERdescriptor_t SoftResetRequest_resetType_oer_;
extern const TTCN_Typedescriptor_t SoftResetRequest_resetType_descr_;
extern const TTCN_RAWdescriptor_t SoftResetRequest_raw_;
extern const TTCN_Typedescriptor_t SoftResetRequest_descr_;
extern const TTCN_RAWdescriptor_t EnableRapidPowerShutDownRequest_resetType_raw_;
extern const XERdescriptor_t EnableRapidPowerShutDownRequest_resetType_xer_;
extern const TTCN_OERdescriptor_t EnableRapidPowerShutDownRequest_resetType_oer_;
extern const TTCN_Typedescriptor_t EnableRapidPowerShutDownRequest_resetType_descr_;
extern const TTCN_RAWdescriptor_t EnableRapidPowerShutDownRequest_raw_;
extern const TTCN_Typedescriptor_t EnableRapidPowerShutDownRequest_descr_;
extern const TTCN_RAWdescriptor_t DisableRapidPowerShutDownRequest_resetType_raw_;
extern const XERdescriptor_t DisableRapidPowerShutDownRequest_resetType_xer_;
extern const TTCN_OERdescriptor_t DisableRapidPowerShutDownRequest_resetType_oer_;
extern const TTCN_Typedescriptor_t DisableRapidPowerShutDownRequest_resetType_descr_;
extern const TTCN_RAWdescriptor_t DisableRapidPowerShutDownRequest_raw_;
extern const TTCN_Typedescriptor_t DisableRapidPowerShutDownRequest_descr_;
extern const TTCN_RAWdescriptor_t ECUResetRequestType_raw_;
extern const TTCN_Typedescriptor_t ECUResetRequestType_descr_;
extern const TTCN_RAWdescriptor_t HardResetResponse_resetType_raw_;
extern const XERdescriptor_t HardResetResponse_resetType_xer_;
extern const TTCN_OERdescriptor_t HardResetResponse_resetType_oer_;
extern const TTCN_Typedescriptor_t HardResetResponse_resetType_descr_;
extern const TTCN_RAWdescriptor_t HardResetResponse_raw_;
extern const TTCN_Typedescriptor_t HardResetResponse_descr_;
extern const TTCN_RAWdescriptor_t KeyOffOnResetResponse_resetType_raw_;
extern const XERdescriptor_t KeyOffOnResetResponse_resetType_xer_;
extern const TTCN_OERdescriptor_t KeyOffOnResetResponse_resetType_oer_;
extern const TTCN_Typedescriptor_t KeyOffOnResetResponse_resetType_descr_;
extern const TTCN_RAWdescriptor_t KeyOffOnResetResponse_raw_;
extern const TTCN_Typedescriptor_t KeyOffOnResetResponse_descr_;
extern const TTCN_RAWdescriptor_t SoftResetResponse_resetType_raw_;
extern const XERdescriptor_t SoftResetResponse_resetType_xer_;
extern const TTCN_OERdescriptor_t SoftResetResponse_resetType_oer_;
extern const TTCN_Typedescriptor_t SoftResetResponse_resetType_descr_;
extern const TTCN_RAWdescriptor_t SoftResetResponse_raw_;
extern const TTCN_Typedescriptor_t SoftResetResponse_descr_;
extern const XERdescriptor_t PowerDownTime_xer_;
extern const TTCN_OERdescriptor_t PowerDownTime_oer_;
extern const TTCN_Typedescriptor_t PowerDownTime_descr_;
extern const TTCN_RAWdescriptor_t EnableRapidPowerShutDownResponse_resetType_raw_;
extern const XERdescriptor_t EnableRapidPowerShutDownResponse_resetType_xer_;
extern const TTCN_OERdescriptor_t EnableRapidPowerShutDownResponse_resetType_oer_;
extern const TTCN_Typedescriptor_t EnableRapidPowerShutDownResponse_resetType_descr_;
extern const TTCN_RAWdescriptor_t EnableRapidPowerShutDownResponse_powerDownTime_raw_;
extern const XERdescriptor_t EnableRapidPowerShutDownResponse_powerDownTime_xer_;
extern const TTCN_OERdescriptor_t EnableRapidPowerShutDownResponse_powerDownTime_oer_;
extern const TTCN_Typedescriptor_t EnableRapidPowerShutDownResponse_powerDownTime_descr_;
extern const TTCN_RAWdescriptor_t EnableRapidPowerShutDownResponse_raw_;
extern const TTCN_Typedescriptor_t EnableRapidPowerShutDownResponse_descr_;
extern const TTCN_RAWdescriptor_t DisableRapidPowerShutDownResponse_resetType_raw_;
extern const XERdescriptor_t DisableRapidPowerShutDownResponse_resetType_xer_;
extern const TTCN_OERdescriptor_t DisableRapidPowerShutDownResponse_resetType_oer_;
extern const TTCN_Typedescriptor_t DisableRapidPowerShutDownResponse_resetType_descr_;
extern const TTCN_RAWdescriptor_t DisableRapidPowerShutDownResponse_raw_;
extern const TTCN_Typedescriptor_t DisableRapidPowerShutDownResponse_descr_;
extern const TTCN_RAWdescriptor_t ECUResetResponseType_raw_;
extern const TTCN_Typedescriptor_t ECUResetResponseType_descr_;
extern const TTCN_RAWdescriptor_t ECUResetRequestSID_sid_raw_;
extern const XERdescriptor_t ECUResetRequestSID_sid_xer_;
extern const TTCN_OERdescriptor_t ECUResetRequestSID_sid_oer_;
extern const TTCN_Typedescriptor_t ECUResetRequestSID_sid_descr_;
extern const TTCN_RAWdescriptor_t ECUResetRequestSID_suppressPosRspMsgIndicationBit_raw_;
extern const TTCN_Typedescriptor_t ECUResetRequestSID_suppressPosRspMsgIndicationBit_descr_;
extern const TTCN_RAWdescriptor_t ECUResetRequestSID_resetType_raw_;
extern const TTCN_Typedescriptor_t ECUResetRequestSID_resetType_descr_;
extern const TTCN_RAWdescriptor_t ECUResetRequestSID_raw_;
extern const TTCN_Typedescriptor_t ECUResetRequestSID_descr_;
extern const TTCN_RAWdescriptor_t ECUResetResponseSID_sid_raw_;
extern const XERdescriptor_t ECUResetResponseSID_sid_xer_;
extern const TTCN_OERdescriptor_t ECUResetResponseSID_sid_oer_;
extern const TTCN_Typedescriptor_t ECUResetResponseSID_sid_descr_;
extern const TTCN_RAWdescriptor_t ECUResetResponseSID_reserved_raw_;
extern const XERdescriptor_t ECUResetResponseSID_reserved_xer_;
extern const TTCN_OERdescriptor_t ECUResetResponseSID_reserved_oer_;
extern const TTCN_Typedescriptor_t ECUResetResponseSID_reserved_descr_;
extern const TTCN_RAWdescriptor_t ECUResetResponseSID_resetType_raw_;
extern const TTCN_Typedescriptor_t ECUResetResponseSID_resetType_descr_;
extern const TTCN_RAWdescriptor_t ECUResetResponseSID_raw_;
extern const TTCN_Typedescriptor_t ECUResetResponseSID_descr_;
extern const XERdescriptor_t SecurityAccessType_xer_;
extern const TTCN_OERdescriptor_t SecurityAccessType_oer_;
extern const TTCN_Typedescriptor_t SecurityAccessType_descr_;
extern const TTCN_RAWdescriptor_t RequestSeedRequest0_securityAccessType_raw_;
extern const XERdescriptor_t RequestSeedRequest0_securityAccessType_xer_;
extern const TTCN_OERdescriptor_t RequestSeedRequest0_securityAccessType_oer_;
extern const TTCN_Typedescriptor_t RequestSeedRequest0_securityAccessType_descr_;
extern const TTCN_RAWdescriptor_t RequestSeedRequest0_securityAccessDataRecord_raw_;
extern const XERdescriptor_t RequestSeedRequest0_securityAccessDataRecord_xer_;
extern const TTCN_OERdescriptor_t RequestSeedRequest0_securityAccessDataRecord_oer_;
extern const TTCN_Typedescriptor_t RequestSeedRequest0_securityAccessDataRecord_descr_;
extern const TTCN_RAWdescriptor_t RequestSeedRequest0_raw_;
extern const TTCN_Typedescriptor_t RequestSeedRequest0_descr_;
extern const TTCN_RAWdescriptor_t SendKeyRequest0_securityAccessType_raw_;
extern const XERdescriptor_t SendKeyRequest0_securityAccessType_xer_;
extern const TTCN_OERdescriptor_t SendKeyRequest0_securityAccessType_oer_;
extern const TTCN_Typedescriptor_t SendKeyRequest0_securityAccessType_descr_;
extern const TTCN_RAWdescriptor_t SendKeyRequest0_securityKey_raw_;
extern const XERdescriptor_t SendKeyRequest0_securityKey_xer_;
extern const TTCN_OERdescriptor_t SendKeyRequest0_securityKey_oer_;
extern const TTCN_Typedescriptor_t SendKeyRequest0_securityKey_descr_;
extern const TTCN_RAWdescriptor_t SendKeyRequest0_raw_;
extern const TTCN_Typedescriptor_t SendKeyRequest0_descr_;
extern const TTCN_RAWdescriptor_t RequestSeedRequest1_securityAccessType_raw_;
extern const XERdescriptor_t RequestSeedRequest1_securityAccessType_xer_;
extern const TTCN_OERdescriptor_t RequestSeedRequest1_securityAccessType_oer_;
extern const TTCN_Typedescriptor_t RequestSeedRequest1_securityAccessType_descr_;
extern const TTCN_RAWdescriptor_t RequestSeedRequest1_securityAccessDataRecord_raw_;
extern const XERdescriptor_t RequestSeedRequest1_securityAccessDataRecord_xer_;
extern const TTCN_OERdescriptor_t RequestSeedRequest1_securityAccessDataRecord_oer_;
extern const TTCN_Typedescriptor_t RequestSeedRequest1_securityAccessDataRecord_descr_;
extern const TTCN_RAWdescriptor_t RequestSeedRequest1_raw_;
extern const TTCN_Typedescriptor_t RequestSeedRequest1_descr_;
extern const TTCN_RAWdescriptor_t SendKeyRequest1_securityAccessType_raw_;
extern const XERdescriptor_t SendKeyRequest1_securityAccessType_xer_;
extern const TTCN_OERdescriptor_t SendKeyRequest1_securityAccessType_oer_;
extern const TTCN_Typedescriptor_t SendKeyRequest1_securityAccessType_descr_;
extern const TTCN_RAWdescriptor_t SendKeyRequest1_securityKey_raw_;
extern const XERdescriptor_t SendKeyRequest1_securityKey_xer_;
extern const TTCN_OERdescriptor_t SendKeyRequest1_securityKey_oer_;
extern const TTCN_Typedescriptor_t SendKeyRequest1_securityKey_descr_;
extern const TTCN_RAWdescriptor_t SendKeyRequest1_raw_;
extern const TTCN_Typedescriptor_t SendKeyRequest1_descr_;
extern const TTCN_RAWdescriptor_t SecurityAccessRequestType_raw_;
extern const TTCN_Typedescriptor_t SecurityAccessRequestType_descr_;
extern const TTCN_RAWdescriptor_t SecurityAccessRequestSID_sid_raw_;
extern const XERdescriptor_t SecurityAccessRequestSID_sid_xer_;
extern const TTCN_OERdescriptor_t SecurityAccessRequestSID_sid_oer_;
extern const TTCN_Typedescriptor_t SecurityAccessRequestSID_sid_descr_;
extern const TTCN_RAWdescriptor_t SecurityAccessRequestSID_suppressPosRspMsgIndicationBit_raw_;
extern const TTCN_Typedescriptor_t SecurityAccessRequestSID_suppressPosRspMsgIndicationBit_descr_;
extern const TTCN_RAWdescriptor_t SecurityAccessRequestSID_securityAccessType_raw_;
extern const TTCN_Typedescriptor_t SecurityAccessRequestSID_securityAccessType_descr_;
extern const TTCN_RAWdescriptor_t SecurityAccessRequestSID_raw_;
extern const TTCN_Typedescriptor_t SecurityAccessRequestSID_descr_;
extern const TTCN_RAWdescriptor_t RequestSeedResponse0_securityAccessType_raw_;
extern const XERdescriptor_t RequestSeedResponse0_securityAccessType_xer_;
extern const TTCN_OERdescriptor_t RequestSeedResponse0_securityAccessType_oer_;
extern const TTCN_Typedescriptor_t RequestSeedResponse0_securityAccessType_descr_;
extern const TTCN_RAWdescriptor_t RequestSeedResponse0_securitySeed_raw_;
extern const XERdescriptor_t RequestSeedResponse0_securitySeed_xer_;
extern const TTCN_OERdescriptor_t RequestSeedResponse0_securitySeed_oer_;
extern const TTCN_Typedescriptor_t RequestSeedResponse0_securitySeed_descr_;
extern const TTCN_RAWdescriptor_t RequestSeedResponse0_raw_;
extern const TTCN_Typedescriptor_t RequestSeedResponse0_descr_;
extern const TTCN_RAWdescriptor_t SendKeyResponse0_securityAccessType_raw_;
extern const XERdescriptor_t SendKeyResponse0_securityAccessType_xer_;
extern const TTCN_OERdescriptor_t SendKeyResponse0_securityAccessType_oer_;
extern const TTCN_Typedescriptor_t SendKeyResponse0_securityAccessType_descr_;
extern const TTCN_RAWdescriptor_t SendKeyResponse0_raw_;
extern const TTCN_Typedescriptor_t SendKeyResponse0_descr_;
extern const TTCN_RAWdescriptor_t RequestSeedResponse1_securityAccessType_raw_;
extern const XERdescriptor_t RequestSeedResponse1_securityAccessType_xer_;
extern const TTCN_OERdescriptor_t RequestSeedResponse1_securityAccessType_oer_;
extern const TTCN_Typedescriptor_t RequestSeedResponse1_securityAccessType_descr_;
extern const TTCN_RAWdescriptor_t RequestSeedResponse1_securitySeed_raw_;
extern const XERdescriptor_t RequestSeedResponse1_securitySeed_xer_;
extern const TTCN_OERdescriptor_t RequestSeedResponse1_securitySeed_oer_;
extern const TTCN_Typedescriptor_t RequestSeedResponse1_securitySeed_descr_;
extern const TTCN_RAWdescriptor_t RequestSeedResponse1_raw_;
extern const TTCN_Typedescriptor_t RequestSeedResponse1_descr_;
extern const TTCN_RAWdescriptor_t SendKeyResponse1_securityAccessType_raw_;
extern const XERdescriptor_t SendKeyResponse1_securityAccessType_xer_;
extern const TTCN_OERdescriptor_t SendKeyResponse1_securityAccessType_oer_;
extern const TTCN_Typedescriptor_t SendKeyResponse1_securityAccessType_descr_;
extern const TTCN_RAWdescriptor_t SendKeyResponse1_raw_;
extern const TTCN_Typedescriptor_t SendKeyResponse1_descr_;
extern const TTCN_RAWdescriptor_t SecurityAccessResponseType_raw_;
extern const TTCN_Typedescriptor_t SecurityAccessResponseType_descr_;
extern const TTCN_RAWdescriptor_t SecurityAccessResponseSID_sid_raw_;
extern const XERdescriptor_t SecurityAccessResponseSID_sid_xer_;
extern const TTCN_OERdescriptor_t SecurityAccessResponseSID_sid_oer_;
extern const TTCN_Typedescriptor_t SecurityAccessResponseSID_sid_descr_;
extern const TTCN_RAWdescriptor_t SecurityAccessResponseSID_reserved_raw_;
extern const XERdescriptor_t SecurityAccessResponseSID_reserved_xer_;
extern const TTCN_OERdescriptor_t SecurityAccessResponseSID_reserved_oer_;
extern const TTCN_Typedescriptor_t SecurityAccessResponseSID_reserved_descr_;
extern const TTCN_RAWdescriptor_t SecurityAccessResponseSID_securityAccessType_raw_;
extern const TTCN_Typedescriptor_t SecurityAccessResponseSID_securityAccessType_descr_;
extern const TTCN_RAWdescriptor_t SecurityAccessResponseSID_raw_;
extern const TTCN_Typedescriptor_t SecurityAccessResponseSID_descr_;
extern const XERdescriptor_t ControlType_xer_;
extern const TTCN_OERdescriptor_t ControlType_oer_;
extern const TTCN_Typedescriptor_t ControlType_descr_;
extern const TTCN_RAWdescriptor_t e__ControlType_raw_;
extern const TTCN_Typedescriptor_t e__ControlType_descr_;
extern const TTCN_RAWdescriptor_t e__DisableEnable_raw_;
extern const TTCN_Typedescriptor_t e__DisableEnable_descr_;
extern const TTCN_RAWdescriptor_t e__CommunicationMessages_raw_;
extern const TTCN_Typedescriptor_t e__CommunicationMessages_descr_;
extern const TTCN_RAWdescriptor_t CommunicationType_disableEnable_raw_;
extern const TTCN_Typedescriptor_t CommunicationType_disableEnable_descr_;
extern const TTCN_RAWdescriptor_t CommunicationType_reserved_raw_;
extern const XERdescriptor_t CommunicationType_reserved_xer_;
extern const TTCN_OERdescriptor_t CommunicationType_reserved_oer_;
extern const TTCN_Typedescriptor_t CommunicationType_reserved_descr_;
extern const TTCN_RAWdescriptor_t CommunicationType_communicationMessages_raw_;
extern const TTCN_Typedescriptor_t CommunicationType_communicationMessages_descr_;
extern const TTCN_RAWdescriptor_t CommunicationType_raw_;
extern const TTCN_Typedescriptor_t CommunicationType_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndTxRequest_suppressPosRspMsgIndicationBit_raw_;
extern const TTCN_Typedescriptor_t EnableRxAndTxRequest_suppressPosRspMsgIndicationBit_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndTxRequest_controlType_raw_;
extern const XERdescriptor_t EnableRxAndTxRequest_controlType_xer_;
extern const TTCN_OERdescriptor_t EnableRxAndTxRequest_controlType_oer_;
extern const TTCN_Typedescriptor_t EnableRxAndTxRequest_controlType_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndTxRequest_communicationType_raw_;
extern const TTCN_Typedescriptor_t EnableRxAndTxRequest_communicationType_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndTxRequest_raw_;
extern const TTCN_Typedescriptor_t EnableRxAndTxRequest_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndDisableTxRequest_suppressPosRspMsgIndicationBit_raw_;
extern const TTCN_Typedescriptor_t EnableRxAndDisableTxRequest_suppressPosRspMsgIndicationBit_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndDisableTxRequest_controlType_raw_;
extern const XERdescriptor_t EnableRxAndDisableTxRequest_controlType_xer_;
extern const TTCN_OERdescriptor_t EnableRxAndDisableTxRequest_controlType_oer_;
extern const TTCN_Typedescriptor_t EnableRxAndDisableTxRequest_controlType_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndDisableTxRequest_communicationType_raw_;
extern const TTCN_Typedescriptor_t EnableRxAndDisableTxRequest_communicationType_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndDisableTxRequest_raw_;
extern const TTCN_Typedescriptor_t EnableRxAndDisableTxRequest_descr_;
extern const TTCN_RAWdescriptor_t DisableRxAndEnableTxRequest_suppressPosRspMsgIndicationBit_raw_;
extern const TTCN_Typedescriptor_t DisableRxAndEnableTxRequest_suppressPosRspMsgIndicationBit_descr_;
extern const TTCN_RAWdescriptor_t DisableRxAndEnableTxRequest_controlType_raw_;
extern const XERdescriptor_t DisableRxAndEnableTxRequest_controlType_xer_;
extern const TTCN_OERdescriptor_t DisableRxAndEnableTxRequest_controlType_oer_;
extern const TTCN_Typedescriptor_t DisableRxAndEnableTxRequest_controlType_descr_;
extern const TTCN_RAWdescriptor_t DisableRxAndEnableTxRequest_communicationType_raw_;
extern const TTCN_Typedescriptor_t DisableRxAndEnableTxRequest_communicationType_descr_;
extern const TTCN_RAWdescriptor_t DisableRxAndEnableTxRequest_raw_;
extern const TTCN_Typedescriptor_t DisableRxAndEnableTxRequest_descr_;
extern const TTCN_RAWdescriptor_t DisableRxAndTxRequest_suppressPosRspMsgIndicationBit_raw_;
extern const TTCN_Typedescriptor_t DisableRxAndTxRequest_suppressPosRspMsgIndicationBit_descr_;
extern const TTCN_RAWdescriptor_t DisableRxAndTxRequest_controlType_raw_;
extern const XERdescriptor_t DisableRxAndTxRequest_controlType_xer_;
extern const TTCN_OERdescriptor_t DisableRxAndTxRequest_controlType_oer_;
extern const TTCN_Typedescriptor_t DisableRxAndTxRequest_controlType_descr_;
extern const TTCN_RAWdescriptor_t DisableRxAndTxRequest_communicationType_raw_;
extern const TTCN_Typedescriptor_t DisableRxAndTxRequest_communicationType_descr_;
extern const TTCN_RAWdescriptor_t DisableRxAndTxRequest_raw_;
extern const TTCN_Typedescriptor_t DisableRxAndTxRequest_descr_;
extern const XERdescriptor_t NodeIdentificationNumber_xer_;
extern const TTCN_OERdescriptor_t NodeIdentificationNumber_oer_;
extern const TTCN_Typedescriptor_t NodeIdentificationNumber_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndDisableTxWithEnhancedAddressInformationRequest_suppressPosRspMsgIndicationBit_raw_;
extern const TTCN_Typedescriptor_t EnableRxAndDisableTxWithEnhancedAddressInformationRequest_suppressPosRspMsgIndicationBit_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndDisableTxWithEnhancedAddressInformationRequest_controlType_raw_;
extern const XERdescriptor_t EnableRxAndDisableTxWithEnhancedAddressInformationRequest_controlType_xer_;
extern const TTCN_OERdescriptor_t EnableRxAndDisableTxWithEnhancedAddressInformationRequest_controlType_oer_;
extern const TTCN_Typedescriptor_t EnableRxAndDisableTxWithEnhancedAddressInformationRequest_controlType_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndDisableTxWithEnhancedAddressInformationRequest_communicationType_raw_;
extern const TTCN_Typedescriptor_t EnableRxAndDisableTxWithEnhancedAddressInformationRequest_communicationType_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndDisableTxWithEnhancedAddressInformationRequest_nodeIdentificationNumber_raw_;
extern const XERdescriptor_t EnableRxAndDisableTxWithEnhancedAddressInformationRequest_nodeIdentificationNumber_xer_;
extern const TTCN_OERdescriptor_t EnableRxAndDisableTxWithEnhancedAddressInformationRequest_nodeIdentificationNumber_oer_;
extern const TTCN_Typedescriptor_t EnableRxAndDisableTxWithEnhancedAddressInformationRequest_nodeIdentificationNumber_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndDisableTxWithEnhancedAddressInformationRequest_raw_;
extern const TTCN_Typedescriptor_t EnableRxAndDisableTxWithEnhancedAddressInformationRequest_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndTxWithEnhancedAddressInformationRequest_suppressPosRspMsgIndicationBit_raw_;
extern const TTCN_Typedescriptor_t EnableRxAndTxWithEnhancedAddressInformationRequest_suppressPosRspMsgIndicationBit_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndTxWithEnhancedAddressInformationRequest_controlType_raw_;
extern const XERdescriptor_t EnableRxAndTxWithEnhancedAddressInformationRequest_controlType_xer_;
extern const TTCN_OERdescriptor_t EnableRxAndTxWithEnhancedAddressInformationRequest_controlType_oer_;
extern const TTCN_Typedescriptor_t EnableRxAndTxWithEnhancedAddressInformationRequest_controlType_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndTxWithEnhancedAddressInformationRequest_communicationType_raw_;
extern const TTCN_Typedescriptor_t EnableRxAndTxWithEnhancedAddressInformationRequest_communicationType_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndTxWithEnhancedAddressInformationRequest_nodeIdentificationNumber_raw_;
extern const XERdescriptor_t EnableRxAndTxWithEnhancedAddressInformationRequest_nodeIdentificationNumber_xer_;
extern const TTCN_OERdescriptor_t EnableRxAndTxWithEnhancedAddressInformationRequest_nodeIdentificationNumber_oer_;
extern const TTCN_Typedescriptor_t EnableRxAndTxWithEnhancedAddressInformationRequest_nodeIdentificationNumber_descr_;
extern const TTCN_RAWdescriptor_t EnableRxAndTxWithEnhancedAddressInformationRequest_raw_;
extern const TTCN_Typedescriptor_t EnableRxAndTxWithEnhancedAddressInformationRequest_descr_;
extern const TTCN_RAWdescriptor_t CommunicationControlRequestType_raw_;
extern const TTCN_Typedescriptor_t CommunicationControlRequestType_descr_;
extern const TTCN_RAWdescriptor_t CommunicationControlRequestSID_sid_raw_;
extern const XERdescriptor_t CommunicationControlRequestSID_sid_xer_;
extern const TTCN_OERdescriptor_t CommunicationControlRequestSID_sid_oer_;
extern const TTCN_Typedescriptor_t CommunicationControlRequestSID_sid_descr_;
extern const TTCN_RAWdescriptor_t CommunicationControlRequestSID_communicationControlRequestType_raw_;
extern const TTCN_Typedescriptor_t CommunicationControlRequestSID_communicationControlRequestType_descr_;
extern const TTCN_RAWdescriptor_t CommunicationControlRequestSID_raw_;
extern const TTCN_Typedescriptor_t CommunicationControlRequestSID_descr_;
extern const TTCN_RAWdescriptor_t CommunicationControlResponseSID_sid_raw_;
extern const XERdescriptor_t CommunicationControlResponseSID_sid_xer_;
extern const TTCN_OERdescriptor_t CommunicationControlResponseSID_sid_oer_;
extern const TTCN_Typedescriptor_t CommunicationControlResponseSID_sid_descr_;
extern const TTCN_RAWdescriptor_t CommunicationControlResponseSID_reserved_raw_;
extern const XERdescriptor_t CommunicationControlResponseSID_reserved_xer_;
extern const TTCN_OERdescriptor_t CommunicationControlResponseSID_reserved_oer_;
extern const TTCN_Typedescriptor_t CommunicationControlResponseSID_reserved_descr_;
extern const TTCN_RAWdescriptor_t CommunicationControlResponseSID_controlType_raw_;
extern const TTCN_Typedescriptor_t CommunicationControlResponseSID_controlType_descr_;
extern const TTCN_RAWdescriptor_t CommunicationControlResponseSID_raw_;
extern const TTCN_Typedescriptor_t CommunicationControlResponseSID_descr_;
extern const TTCN_RAWdescriptor_t TesterPresentRequestSID_sid_raw_;
extern const XERdescriptor_t TesterPresentRequestSID_sid_xer_;
extern const TTCN_OERdescriptor_t TesterPresentRequestSID_sid_oer_;
extern const TTCN_Typedescriptor_t TesterPresentRequestSID_sid_descr_;
extern const TTCN_RAWdescriptor_t TesterPresentRequestSID_suppressPosRspMsgIndicationBit_raw_;
extern const TTCN_Typedescriptor_t TesterPresentRequestSID_suppressPosRspMsgIndicationBit_descr_;
extern const TTCN_RAWdescriptor_t TesterPresentRequestSID_zero_raw_;
extern const XERdescriptor_t TesterPresentRequestSID_zero_xer_;
extern const TTCN_OERdescriptor_t TesterPresentRequestSID_zero_oer_;
extern const TTCN_Typedescriptor_t TesterPresentRequestSID_zero_descr_;
extern const TTCN_RAWdescriptor_t TesterPresentRequestSID_raw_;
extern const TTCN_Typedescriptor_t TesterPresentRequestSID_descr_;
extern const TTCN_RAWdescriptor_t TesterPresentResponseSID_sid_raw_;
extern const XERdescriptor_t TesterPresentResponseSID_sid_xer_;
extern const TTCN_OERdescriptor_t TesterPresentResponseSID_sid_oer_;
extern const TTCN_Typedescriptor_t TesterPresentResponseSID_sid_descr_;
extern const TTCN_RAWdescriptor_t TesterPresentResponseSID_reserved_raw_;
extern const XERdescriptor_t TesterPresentResponseSID_reserved_xer_;
extern const TTCN_OERdescriptor_t TesterPresentResponseSID_reserved_oer_;
extern const TTCN_Typedescriptor_t TesterPresentResponseSID_reserved_descr_;
extern const TTCN_RAWdescriptor_t TesterPresentResponseSID_zero_raw_;
extern const XERdescriptor_t TesterPresentResponseSID_zero_xer_;
extern const TTCN_OERdescriptor_t TesterPresentResponseSID_zero_oer_;
extern const TTCN_Typedescriptor_t TesterPresentResponseSID_zero_descr_;
extern const TTCN_RAWdescriptor_t TesterPresentResponseSID_raw_;
extern const TTCN_Typedescriptor_t TesterPresentResponseSID_descr_;
extern const XERdescriptor_t ServiceIdentifier_xer_;
extern const TTCN_OERdescriptor_t ServiceIdentifier_oer_;
extern const TTCN_Typedescriptor_t ServiceIdentifier_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierRequest1_identifier_raw_;
extern const XERdescriptor_t ReadDataByIdentifierRequest1_identifier_xer_;
extern const TTCN_OERdescriptor_t ReadDataByIdentifierRequest1_identifier_oer_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierRequest1_identifier_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierRequest1_raw_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierRequest1_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierRequest2_identifier_raw_;
extern const XERdescriptor_t ReadDataByIdentifierRequest2_identifier_xer_;
extern const TTCN_OERdescriptor_t ReadDataByIdentifierRequest2_identifier_oer_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierRequest2_identifier_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierRequest2_raw_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierRequest2_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierRequest3_identifier_raw_;
extern const XERdescriptor_t ReadDataByIdentifierRequest3_identifier_xer_;
extern const TTCN_OERdescriptor_t ReadDataByIdentifierRequest3_identifier_oer_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierRequest3_identifier_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierRequest3_raw_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierRequest3_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierRequestSID_sid_raw_;
extern const XERdescriptor_t ReadDataByIdentifierRequestSID_sid_xer_;
extern const TTCN_OERdescriptor_t ReadDataByIdentifierRequestSID_sid_oer_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierRequestSID_sid_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierRequest_raw_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierRequest_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierRequestSID_raw_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierRequestSID_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierResponse1_identifier_raw_;
extern const XERdescriptor_t ReadDataByIdentifierResponse1_identifier_xer_;
extern const TTCN_OERdescriptor_t ReadDataByIdentifierResponse1_identifier_oer_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierResponse1_identifier_descr_;
extern const XERdescriptor_t ReadDataByIdentifierResponse1_readDataByIdentifierResponse_xer_;
extern const TTCN_OERdescriptor_t ReadDataByIdentifierResponse1_readDataByIdentifierResponse_oer_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierResponse1_readDataByIdentifierResponse_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierResponse1_raw_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierResponse1_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierResponse2_identifier_raw_;
extern const XERdescriptor_t ReadDataByIdentifierResponse2_identifier_xer_;
extern const TTCN_OERdescriptor_t ReadDataByIdentifierResponse2_identifier_oer_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierResponse2_identifier_descr_;
extern const XERdescriptor_t ReadDataByIdentifierResponse2_readDataByIdentifierResponse_xer_;
extern const TTCN_OERdescriptor_t ReadDataByIdentifierResponse2_readDataByIdentifierResponse_oer_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierResponse2_readDataByIdentifierResponse_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierResponse2_raw_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierResponse2_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierResponse3_identifier_raw_;
extern const XERdescriptor_t ReadDataByIdentifierResponse3_identifier_xer_;
extern const TTCN_OERdescriptor_t ReadDataByIdentifierResponse3_identifier_oer_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierResponse3_identifier_descr_;
extern const XERdescriptor_t ReadDataByIdentifierResponse3_readDataByIdentifierResponse_xer_;
extern const TTCN_OERdescriptor_t ReadDataByIdentifierResponse3_readDataByIdentifierResponse_oer_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierResponse3_readDataByIdentifierResponse_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierResponse3_raw_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierResponse3_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierResponseSID_sid_raw_;
extern const XERdescriptor_t ReadDataByIdentifierResponseSID_sid_xer_;
extern const TTCN_OERdescriptor_t ReadDataByIdentifierResponseSID_sid_oer_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierResponseSID_sid_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierResponse_raw_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierResponse_descr_;
extern const TTCN_RAWdescriptor_t ReadDataByIdentifierResponseSID_raw_;
extern const TTCN_Typedescriptor_t ReadDataByIdentifierResponseSID_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierRequest1_identifier_raw_;
extern const XERdescriptor_t WriteDataByIdentifierRequest1_identifier_xer_;
extern const TTCN_OERdescriptor_t WriteDataByIdentifierRequest1_identifier_oer_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierRequest1_identifier_descr_;
extern const XERdescriptor_t WriteDataByIdentifierRequest1_dataRecord_xer_;
extern const TTCN_OERdescriptor_t WriteDataByIdentifierRequest1_dataRecord_oer_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierRequest1_dataRecord_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierRequest1_raw_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierRequest1_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierRequest2_identifier_raw_;
extern const XERdescriptor_t WriteDataByIdentifierRequest2_identifier_xer_;
extern const TTCN_OERdescriptor_t WriteDataByIdentifierRequest2_identifier_oer_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierRequest2_identifier_descr_;
extern const XERdescriptor_t WriteDataByIdentifierRequest2_dataRecord_xer_;
extern const TTCN_OERdescriptor_t WriteDataByIdentifierRequest2_dataRecord_oer_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierRequest2_dataRecord_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierRequest2_raw_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierRequest2_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierRequest3_identifier_raw_;
extern const XERdescriptor_t WriteDataByIdentifierRequest3_identifier_xer_;
extern const TTCN_OERdescriptor_t WriteDataByIdentifierRequest3_identifier_oer_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierRequest3_identifier_descr_;
extern const XERdescriptor_t WriteDataByIdentifierRequest3_dataRecord_xer_;
extern const TTCN_OERdescriptor_t WriteDataByIdentifierRequest3_dataRecord_oer_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierRequest3_dataRecord_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierRequest3_raw_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierRequest3_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierRequest_raw_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierRequest_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierRequestSID_sid_raw_;
extern const XERdescriptor_t WriteDataByIdentifierRequestSID_sid_xer_;
extern const TTCN_OERdescriptor_t WriteDataByIdentifierRequestSID_sid_oer_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierRequestSID_sid_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierRequestSID_raw_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierRequestSID_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierResponse1_identifier_raw_;
extern const XERdescriptor_t WriteDataByIdentifierResponse1_identifier_xer_;
extern const TTCN_OERdescriptor_t WriteDataByIdentifierResponse1_identifier_oer_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierResponse1_identifier_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierResponse1_raw_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierResponse1_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierResponse2_identifier_raw_;
extern const XERdescriptor_t WriteDataByIdentifierResponse2_identifier_xer_;
extern const TTCN_OERdescriptor_t WriteDataByIdentifierResponse2_identifier_oer_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierResponse2_identifier_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierResponse2_raw_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierResponse2_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierResponse3_identifier_raw_;
extern const XERdescriptor_t WriteDataByIdentifierResponse3_identifier_xer_;
extern const TTCN_OERdescriptor_t WriteDataByIdentifierResponse3_identifier_oer_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierResponse3_identifier_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierResponse3_raw_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierResponse3_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierResponseSID_sid_raw_;
extern const XERdescriptor_t WriteDataByIdentifierResponseSID_sid_xer_;
extern const TTCN_OERdescriptor_t WriteDataByIdentifierResponseSID_sid_oer_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierResponseSID_sid_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierResponse_raw_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierResponse_descr_;
extern const TTCN_RAWdescriptor_t WriteDataByIdentifierResponseSID_raw_;
extern const TTCN_Typedescriptor_t WriteDataByIdentifierResponseSID_descr_;
extern const TTCN_RAWdescriptor_t e__RequestSID_raw_;
extern const TTCN_Typedescriptor_t e__RequestSID_descr_;
extern const TTCN_RAWdescriptor_t e__ResponseCode_raw_;
extern const TTCN_Typedescriptor_t e__ResponseCode_descr_;
extern const TTCN_RAWdescriptor_t NegativeResponseCodeSID_sid_raw_;
extern const XERdescriptor_t NegativeResponseCodeSID_sid_xer_;
extern const TTCN_OERdescriptor_t NegativeResponseCodeSID_sid_oer_;
extern const TTCN_Typedescriptor_t NegativeResponseCodeSID_sid_descr_;
extern const TTCN_RAWdescriptor_t NegativeResponseCodeSID_requestSID_raw_;
extern const TTCN_Typedescriptor_t NegativeResponseCodeSID_requestSID_descr_;
extern const TTCN_RAWdescriptor_t NegativeResponseCodeSID_responseCode_raw_;
extern const TTCN_Typedescriptor_t NegativeResponseCodeSID_responseCode_descr_;
extern const TTCN_RAWdescriptor_t NegativeResponseCodeSID_raw_;
extern const TTCN_Typedescriptor_t NegativeResponseCodeSID_descr_;
extern const TTCN_RAWdescriptor_t TopLevelMessage__UDS__requests_raw_;
extern const TTCN_Typedescriptor_t TopLevelMessage__UDS__requests_descr_;
extern const TTCN_RAWdescriptor_t TopLevelMessage__UDS__responses_raw_;
extern const TTCN_Typedescriptor_t TopLevelMessage__UDS__responses_descr_;
extern TTCN_Module module_object;

} /* end of namespace */

#endif
