diff --git a/trunk/bindings/_common/SMS.i b/trunk/bindings/_common/SMS.i new file mode 100644 index 00000000..d25744d4 --- /dev/null +++ b/trunk/bindings/_common/SMS.i @@ -0,0 +1,7 @@ +%{ +#include "SMSEncoder.h" +%} + +%nodefaultctor; +%include "SMSEncoder.h" +%clearnodefaultctor; \ No newline at end of file diff --git a/trunk/bindings/_common/SMSEncoder.cxx b/trunk/bindings/_common/SMSEncoder.cxx index 48a73254..bab0cadf 100644 --- a/trunk/bindings/_common/SMSEncoder.cxx +++ b/trunk/bindings/_common/SMSEncoder.cxx @@ -21,35 +21,110 @@ */ #include "SMSEncoder.h" -#include "tinysip.h" /* SIP/IMS */ -#include "tinysms.h" /* Binary SMS API*/ +// Short description: http://betelco.blogspot.com/2009/10/sms-over-3gpp-ims-network.html -tsk_bool_t is_valid_telnum(const tsip_uri_t* uri); -SMSData* SMSEncoder::encode(const char *smsc, const char *destination, const char *asscii) +RPData::RPData(twrap_rpdata_type_t _type, tsms_rpdu_data_t* _rp_data) { - SMSData* encodedData = tsk_null; - - + this->rp_data = (tsms_rpdu_data_t*)tsk_object_ref(_rp_data); + this->type = _type; + this->tmpBuffer = tsk_null; +} +RPData::RPData() : + rp_data(tsk_null), + type(twrap_rpdata_type_sms_none), + tmpBuffer(tsk_null) +{ +} - return encodedData; +twrap_rpdata_type_t RPData::getType() +{ + return this->type; +} + +unsigned RPData::getPayloadLength() +{ + if(!this->tmpBuffer){ + if((this->tmpBuffer = tsk_buffer_create_null())){ + tsms_rpdu_data_serialize(this->rp_data, this->tmpBuffer); + } + } + return this->tmpBuffer ? this->tmpBuffer->size : 0; +} + +unsigned RPData::getPayload(void* output, unsigned maxsize) +{ + unsigned retsize = 0; + + if(!this->tmpBuffer){ + if((this->tmpBuffer = tsk_buffer_create_null())){ + tsms_rpdu_data_serialize(this->rp_data, this->tmpBuffer); + } + } + + if(output && maxsize && this->tmpBuffer && this->tmpBuffer->data){ + retsize = (this->tmpBuffer->size > maxsize) ? maxsize : this->tmpBuffer->size; + memcpy(output, this->tmpBuffer->data, retsize); + } + return retsize; +} + +RPData::~RPData() +{ + TSK_OBJECT_SAFE_FREE(this->rp_data); + TSK_OBJECT_SAFE_FREE(this->tmpBuffer); } -tsk_bool_t is_valid_telnum(const tsip_uri_t* uri) -{ - tsk_size_t i; - tsk_size_t len; - - if(!uri || tsk_strnullORempty(uri->user_name)){ - return tsk_false; - } - - for(i = 0, len = tsk_strlen(uri->user_name); iuser_name[i] != '+' && !isdigit(uri->user_name[i])){ - return tsk_false; - } - } - return tsk_true; -} +// More information about RP-DATA: http://www.doubango.org/API/tinySMS/group__tsms__rpdu__group.html#tsms_rpdu_group_DATA +RPData* SMSEncoder::encodeSubmit(int mr, const char *smsc, const char *destination, const char *ascii) +{ + int ret; + tsk_buffer_t* buffer = tsk_null; + tsms_tpdu_submit_t* sms_submit = tsk_null; + tsms_rpdu_data_t* rp_data = tsk_null; + + RPData* encodedData = tsk_null; + + if(!smsc || ! destination || !ascii){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + if(mr<0 || mr>0xFF){ + TSK_DEBUG_WARN("Invalid Message Reference"); + mr &= 0xFF; + } + + // create SMS-SUBMIT message + if(!(sms_submit = tsms_tpdu_submit_create(mr, (const uint8_t*)smsc, (const uint8_t*)destination))){ + TSK_DEBUG_ERROR("Failed to create the TPDU SMS-SUBMIT message"); + goto bail; + } + // Set content for SMS-SUBMIT + if((buffer = tsms_pack_to_7bit(ascii))){ + ret = tsms_tpdu_submit_set_userdata(sms_submit, buffer, tsms_alpha_7bit); + TSK_OBJECT_SAFE_FREE(buffer); + } + else{ + TSK_DEBUG_ERROR("Failed to encode the TPDU SMS-SUBMIT message"); + goto bail; + } + + // create RP-DATA(SMS-SUBMIT) + if((rp_data = tsms_rpdu_data_create_mo(mr, (const uint8_t*)smsc, TSMS_TPDU_MESSAGE(sms_submit)))){ + encodedData = new RPData(twrap_rpdata_type_sms_submit, rp_data); + } + else{ + TSK_DEBUG_ERROR("Failed to create the RP-DATA(SMS-SUBMIT) message"); + goto bail; + } + +bail: + TSK_OBJECT_SAFE_FREE(buffer); + TSK_OBJECT_SAFE_FREE(sms_submit); + TSK_OBJECT_SAFE_FREE(rp_data); + + return encodedData; +} diff --git a/trunk/bindings/_common/SMSEncoder.h b/trunk/bindings/_common/SMSEncoder.h index 77e5026e..505f0a92 100644 --- a/trunk/bindings/_common/SMSEncoder.h +++ b/trunk/bindings/_common/SMSEncoder.h @@ -24,16 +24,46 @@ #include "tinyWRAP_config.h" -class SMSData +#include "tinysip.h" /* SIP/IMS */ +#include "tinysms.h" /* Binary SMS API*/ + +typedef enum twrap_rpdata_type_e +{ + twrap_rpdata_type_sms_none, + twrap_rpdata_type_sms_submit, + twrap_rpdata_type_sms_deliver, + twrap_rpdata_type_sms_status_report, + twrap_rpdata_type_sms_command, +} +twrap_rpdata_type_t; + +class RPData { public: - SMSData(); +#if !defined(SWIG) + RPData(twrap_rpdata_type_t type, tsms_rpdu_data_t* rp_data); +#endif + RPData(); + + virtual ~RPData(); + +public: + /* Public API functions */ + twrap_rpdata_type_t getType(); + unsigned getPayloadLength(); + unsigned getPayload(void* output, unsigned maxsize); + +private: + twrap_rpdata_type_t type; + tsms_rpdu_data_t* rp_data; + + tsk_buffer_t* tmpBuffer; }; class SMSEncoder { public: - static SMSData* encode(const char* smsc, const char* destination, const char* asscii); + static RPData* encodeSubmit(int mr, const char* smsc, const char* destination, const char* ascii); }; #endif /* TINYWRAP_SMSENCODER_H */ diff --git a/trunk/bindings/_common/SipStack.cxx b/trunk/bindings/_common/SipStack.cxx index 271bb7fe..b07b8bdd 100644 --- a/trunk/bindings/_common/SipStack.cxx +++ b/trunk/bindings/_common/SipStack.cxx @@ -81,8 +81,7 @@ SipStack::~SipStack() bool SipStack::start() { - int ret = tsip_stack_start(this->handle); - return (ret == 0); + return (tsip_stack_start(this->handle) == 0); } bool SipStack::setDebugCallback(DDebugCallback* callback) @@ -109,89 +108,110 @@ bool SipStack::setRealm(const char* realm_uri) bool SipStack::setIMPI(const char* impi) { - int ret = tsip_stack_set(this->handle, + return (tsip_stack_set(this->handle, TSIP_STACK_SET_IMPI(impi), - TSIP_STACK_SET_NULL()); - return (ret == 0); + TSIP_STACK_SET_NULL()) == 0); } bool SipStack::setIMPU(const char* impu_uri) { - int ret = tsip_stack_set(this->handle, + return (tsip_stack_set(this->handle, TSIP_STACK_SET_IMPU(impu_uri), - TSIP_STACK_SET_NULL()); - return (ret == 0); + TSIP_STACK_SET_NULL()) == 0); } bool SipStack::setPassword(const char* password) { - int ret = tsip_stack_set(this->handle, + return (tsip_stack_set(this->handle, TSIP_STACK_SET_PASSWORD(password), - TSIP_STACK_SET_NULL()); - return (ret == 0); + TSIP_STACK_SET_NULL()) == 0); } -bool SipStack::setProxyCSCF(const char* fqdn, unsigned port, const char* transport, const char* ipversion) +bool SipStack::setAMF(const char* amf) { - int ret = tsip_stack_set(this->handle, - TSIP_STACK_SET_PROXY_CSCF(fqdn, port, transport, ipversion), - TSIP_STACK_SET_NULL()); - return (ret == 0); + uint16_t _amf = (uint16_t)tsk_atox(amf); + return (tsip_stack_set(this->handle, + TSIP_STACK_SET_IMS_AKA_AMF(_amf), + TSIP_STACK_SET_NULL()) == 0); +} + +bool SipStack::setOperatorId(const char* opid) +{ + return (tsip_stack_set(this->handle, + TSIP_STACK_SET_IMS_AKA_OPERATOR_ID(opid), + TSIP_STACK_SET_NULL()) == 0); +} + +bool SipStack::setProxyCSCF(const char* fqdn, unsigned short port, const char* transport, const char* ipversion) +{ + unsigned _port = port;//promote + return (tsip_stack_set(this->handle, + TSIP_STACK_SET_PROXY_CSCF(fqdn, _port, transport, ipversion), + TSIP_STACK_SET_NULL()) == 0); } bool SipStack::setLocalIP(const char* ip) { - int ret = tsip_stack_set(this->handle, + return (tsip_stack_set(this->handle, TSIP_STACK_SET_LOCAL_IP(ip), - TSIP_STACK_SET_NULL()); - return (ret == 0); + TSIP_STACK_SET_NULL()) == 0); } -bool SipStack::setLocalPort(unsigned port) +bool SipStack::setLocalPort(unsigned short port) { - int ret = tsip_stack_set(this->handle, - TSIP_STACK_SET_LOCAL_PORT(port), - TSIP_STACK_SET_NULL()); - return (ret == 0); + unsigned _port = port;//promote + return (tsip_stack_set(this->handle, + TSIP_STACK_SET_LOCAL_PORT(_port), + TSIP_STACK_SET_NULL()) == 0); } bool SipStack::setEarlyIMS(bool enabled){ - int ret = tsip_stack_set(this->handle, + return (tsip_stack_set(this->handle, TSIP_STACK_SET_EARLY_IMS(enabled? tsk_true : tsk_false), - TSIP_STACK_SET_NULL()); - return (ret == 0); + TSIP_STACK_SET_NULL()) == 0); } bool SipStack::addHeader(const char* name, const char* value) { - int ret = tsip_stack_set(this->handle, + return (tsip_stack_set(this->handle, TSIP_STACK_SET_HEADER(name, value), - TSIP_STACK_SET_NULL()); - return (ret == 0); + TSIP_STACK_SET_NULL()) == 0); } bool SipStack::removeHeader(const char* name) { - int ret = tsip_stack_set(this->handle, + return (tsip_stack_set(this->handle, TSIP_STACK_UNSET_HEADER(name), - TSIP_STACK_SET_NULL()); - return (ret == 0); + TSIP_STACK_SET_NULL()) == 0); } bool SipStack::addDnsServer(const char* ip) { - int ret = tsip_stack_set(this->handle, + return (tsip_stack_set(this->handle, TSIP_STACK_SET_DNS_SERVER(ip), - TSIP_STACK_SET_NULL()); - return (ret == 0); + TSIP_STACK_SET_NULL()) == 0); } bool SipStack::setAoR(const char* ip, int port) { - int ret = tsip_stack_set(this->handle, + return (tsip_stack_set(this->handle, TSIP_STACK_SET_AOR(ip, port), - TSIP_STACK_SET_NULL()); - return (ret == 0); + TSIP_STACK_SET_NULL()) == 0); +} + +bool SipStack::setSTUNServer(const char* ip, unsigned short port) +{ + unsigned _port = port;//promote + return (tsip_stack_set(this->handle, + TSIP_STACK_SET_STUN_SERVER(ip, _port), + TSIP_STACK_SET_NULL()) == 0); +} + +bool SipStack::setSTUNCred(const char* login, const char* password) +{ + return (tsip_stack_set(this->handle, + TSIP_STACK_SET_STUN_CRED(login, password), + TSIP_STACK_SET_NULL()) == 0); } char* SipStack::dnsENUM(const char* service, const char* e164num, const char* domain) @@ -212,7 +232,7 @@ char* SipStack::dnsENUM(const char* service, const char* e164num, const char* do } } -char* SipStack::dnsNaptrSrv(const char* domain, const char* service, short *OUTPUT) +char* SipStack::dnsNaptrSrv(const char* domain, const char* service, unsigned short *OUTPUT) { tnet_dns_ctx_t* dnsctx = tsip_stack_get_dnsctx(this->handle); char* ip = tsk_null; @@ -233,6 +253,26 @@ char* SipStack::dnsNaptrSrv(const char* domain, const char* service, short *OUTP } } +char* SipStack::dnsSrv(const char* service, unsigned short* OUTPUT) +{ + tnet_dns_ctx_t* dnsctx = tsip_stack_get_dnsctx(this->handle); + char* ip = tsk_null; + tnet_port_t port = 0; + *OUTPUT = 0; + + if(dnsctx){ + if(!tnet_dns_query_srv(dnsctx, service, &ip, &port)){ + *OUTPUT = port; + } + tsk_object_unref(dnsctx); + return ip; + } + else{ + TSK_DEBUG_ERROR("No DNS Context could be found"); + return tsk_null; + } +} + bool SipStack::isValid() { return (this->handle != tsk_null); diff --git a/trunk/bindings/_common/SipStack.h b/trunk/bindings/_common/SipStack.h index 164cf42e..dfbf855a 100644 --- a/trunk/bindings/_common/SipStack.h +++ b/trunk/bindings/_common/SipStack.h @@ -43,17 +43,23 @@ public: /* API functions */ bool setIMPI(const char* impi); bool setIMPU(const char* impu_uri); bool setPassword(const char* password); - bool setProxyCSCF(const char* fqdn, unsigned port, const char* transport, const char* ipversion); + bool setAMF(const char* amf); + bool setOperatorId(const char* opid); + bool setProxyCSCF(const char* fqdn, unsigned short port, const char* transport, const char* ipversion); bool setLocalIP(const char* ip); - bool setLocalPort(unsigned port); + bool setLocalPort(unsigned short port); bool setEarlyIMS(bool enabled); bool addHeader(const char* name, const char* value); bool removeHeader(const char* name); bool addDnsServer(const char* ip); bool setAoR(const char* ip, int port); - + + bool setSTUNServer(const char* ip, unsigned short port); + bool setSTUNCred(const char* login, const char* password); + char* dnsENUM(const char* service, const char* e164num, const char* domain); - char* dnsNaptrSrv(const char* domain, const char* service, short *OUTPUT); + char* dnsNaptrSrv(const char* domain, const char* service, unsigned short *OUTPUT); + char* dnsSrv(const char* service, unsigned short* OUTPUT); bool isValid(); bool stop(); diff --git a/trunk/bindings/_common/SipStack.i b/trunk/bindings/_common/SipStack.i index 27559638..33144f6f 100644 --- a/trunk/bindings/_common/SipStack.i +++ b/trunk/bindings/_common/SipStack.i @@ -147,6 +147,8 @@ typedef enum tsip_invite_event_type_e // Media Events // + tsip_m_early_media, + /* 3GPP TS 24.610: Communication Hold */ tsip_m_local_hold_ok, tsip_m_local_hold_nok, diff --git a/trunk/bindings/_common/SipUri.cxx b/trunk/bindings/_common/SipUri.cxx index fb1ee9ae..1508d112 100644 --- a/trunk/bindings/_common/SipUri.cxx +++ b/trunk/bindings/_common/SipUri.cxx @@ -48,3 +48,46 @@ bool SipUri::isValid() { return (this->uri != tsk_null); } + +const char* SipUri::getScheme() +{ + if(this->uri){ + return this->uri->scheme; + } + return tsk_null; +} + +const char* SipUri::getHost() +{ + return this->uri ? this->uri->host : tsk_null; +} + +unsigned short SipUri::getPort() +{ + return this->uri ? this->uri->port : 0; +} + +const char* SipUri::getUserName() +{ + return this->uri ? this->uri->user_name : tsk_null; +} + +const char* SipUri::getPassword() +{ + return this->uri ? this->uri->password : tsk_null; +} + +const char* SipUri::getDisplayName() +{ + return this->uri ? this->uri->display_name : tsk_null; +} + +const char* SipUri::getParamValue(const char* pname) +{ + if(this->uri && this->uri->params){ + const char* pvalue = tsk_params_get_param_value(this->uri->params, pname); + return pvalue; + } + return tsk_null; +} + diff --git a/trunk/bindings/_common/SipUri.h b/trunk/bindings/_common/SipUri.h index 1244b273..e4a97274 100644 --- a/trunk/bindings/_common/SipUri.h +++ b/trunk/bindings/_common/SipUri.h @@ -32,7 +32,15 @@ public: public: static bool isValid(const char*); + bool isValid(); + const char* getScheme(); + const char* getHost(); + unsigned short getPort(); + const char* getUserName(); + const char* getPassword(); + const char* getDisplayName(); + const char* getParamValue(const char* pname); private: tsip_uri_t* uri; diff --git a/trunk/bindings/_common/tinyWRAP.i b/trunk/bindings/_common/tinyWRAP.i index 634b66f0..66bd866d 100644 --- a/trunk/bindings/_common/tinyWRAP.i +++ b/trunk/bindings/_common/tinyWRAP.i @@ -19,6 +19,7 @@ %newobject getSipHeaderParamValue; %newobject SipStack::dnsENUM; %newobject SipStack::dnsNaptrSrv; +%newobject SipStack::dnsSrv; %newobject MessagingEvent::takeSessionOwnership; %newobject CallEvent::takeSessionOwnership; @@ -32,4 +33,10 @@ %newobject getXcapHeaderValue; %newobject getXcapHeaderParamValue; -%include Xcap.i \ No newline at end of file +%include Xcap.i + + +/* ========== SMS ========== */ +%newobject SMSEncoder::encodeSubmit; + +%include SMS.i \ No newline at end of file diff --git a/trunk/bindings/csharp/RPData.cs b/trunk/bindings/csharp/RPData.cs new file mode 100644 index 00000000..a4dd9e2c --- /dev/null +++ b/trunk/bindings/csharp/RPData.cs @@ -0,0 +1,59 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.39 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class RPData : IDisposable { + private HandleRef swigCPtr; + protected bool swigCMemOwn; + + internal RPData(IntPtr cPtr, bool cMemoryOwn) { + swigCMemOwn = cMemoryOwn; + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(RPData obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~RPData() { + Dispose(); + } + + public virtual void Dispose() { + lock(this) { + if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_RPData(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + GC.SuppressFinalize(this); + } + } + + public RPData() : this(tinyWRAPPINVOKE.new_RPData(), true) { + } + + public twrap_rpdata_type_t getType() { + twrap_rpdata_type_t ret = (twrap_rpdata_type_t)tinyWRAPPINVOKE.RPData_getType(swigCPtr); + return ret; + } + + public uint getPayloadLength() { + uint ret = tinyWRAPPINVOKE.RPData_getPayloadLength(swigCPtr); + return ret; + } + + public uint getPayload(byte[] output, uint maxsize) { + uint ret = tinyWRAPPINVOKE.RPData_getPayload(swigCPtr, output, maxsize); + return ret; + } + +} diff --git a/trunk/bindings/csharp/SMSEncoder.cs b/trunk/bindings/csharp/SMSEncoder.cs new file mode 100644 index 00000000..1ee24d62 --- /dev/null +++ b/trunk/bindings/csharp/SMSEncoder.cs @@ -0,0 +1,47 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.39 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class SMSEncoder : IDisposable { + private HandleRef swigCPtr; + protected bool swigCMemOwn; + + internal SMSEncoder(IntPtr cPtr, bool cMemoryOwn) { + swigCMemOwn = cMemoryOwn; + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(SMSEncoder obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~SMSEncoder() { + Dispose(); + } + + public virtual void Dispose() { + lock(this) { + if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_SMSEncoder(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + GC.SuppressFinalize(this); + } + } + + public static RPData encodeSubmit(int mr, string smsc, string destination, string ascii) { + IntPtr cPtr = tinyWRAPPINVOKE.SMSEncoder_encodeSubmit(mr, smsc, destination, ascii); + RPData ret = (cPtr == IntPtr.Zero) ? null : new RPData(cPtr, true); + return ret; + } + +} diff --git a/trunk/bindings/csharp/SipStack.cs b/trunk/bindings/csharp/SipStack.cs index b89a16fd..05359993 100644 --- a/trunk/bindings/csharp/SipStack.cs +++ b/trunk/bindings/csharp/SipStack.cs @@ -70,7 +70,17 @@ public class SipStack : SafeObject { return ret; } - public bool setProxyCSCF(string fqdn, uint port, string transport, string ipversion) { + public bool setAMF(string amf) { + bool ret = tinyWRAPPINVOKE.SipStack_setAMF(swigCPtr, amf); + return ret; + } + + public bool setOperatorId(string opid) { + bool ret = tinyWRAPPINVOKE.SipStack_setOperatorId(swigCPtr, opid); + return ret; + } + + public bool setProxyCSCF(string fqdn, ushort port, string transport, string ipversion) { bool ret = tinyWRAPPINVOKE.SipStack_setProxyCSCF(swigCPtr, fqdn, port, transport, ipversion); return ret; } @@ -80,7 +90,7 @@ public class SipStack : SafeObject { return ret; } - public bool setLocalPort(uint port) { + public bool setLocalPort(ushort port) { bool ret = tinyWRAPPINVOKE.SipStack_setLocalPort(swigCPtr, port); return ret; } @@ -110,16 +120,31 @@ public class SipStack : SafeObject { return ret; } + public bool setSTUNServer(string ip, ushort port) { + bool ret = tinyWRAPPINVOKE.SipStack_setSTUNServer(swigCPtr, ip, port); + return ret; + } + + public bool setSTUNCred(string login, string password) { + bool ret = tinyWRAPPINVOKE.SipStack_setSTUNCred(swigCPtr, login, password); + return ret; + } + public string dnsENUM(string service, string e164num, string domain) { string ret = tinyWRAPPINVOKE.SipStack_dnsENUM(swigCPtr, service, e164num, domain); return ret; } - public string dnsNaptrSrv(string domain, string service, out short OUTPUT) { + public string dnsNaptrSrv(string domain, string service, out ushort OUTPUT) { string ret = tinyWRAPPINVOKE.SipStack_dnsNaptrSrv(swigCPtr, domain, service, out OUTPUT); return ret; } + public string dnsSrv(string service, out ushort OUTPUT) { + string ret = tinyWRAPPINVOKE.SipStack_dnsSrv(swigCPtr, service, out OUTPUT); + return ret; + } + public bool isValid() { bool ret = tinyWRAPPINVOKE.SipStack_isValid(swigCPtr); return ret; diff --git a/trunk/bindings/csharp/SipUri.cs b/trunk/bindings/csharp/SipUri.cs index 7a9dbb27..4f7c91e5 100644 --- a/trunk/bindings/csharp/SipUri.cs +++ b/trunk/bindings/csharp/SipUri.cs @@ -51,4 +51,39 @@ public class SipUri : IDisposable { return ret; } + public string getScheme() { + string ret = tinyWRAPPINVOKE.SipUri_getScheme(swigCPtr); + return ret; + } + + public string getHost() { + string ret = tinyWRAPPINVOKE.SipUri_getHost(swigCPtr); + return ret; + } + + public ushort getPort() { + ushort ret = tinyWRAPPINVOKE.SipUri_getPort(swigCPtr); + return ret; + } + + public string getUserName() { + string ret = tinyWRAPPINVOKE.SipUri_getUserName(swigCPtr); + return ret; + } + + public string getPassword() { + string ret = tinyWRAPPINVOKE.SipUri_getPassword(swigCPtr); + return ret; + } + + public string getDisplayName() { + string ret = tinyWRAPPINVOKE.SipUri_getDisplayName(swigCPtr); + return ret; + } + + public string getParamValue(string pname) { + string ret = tinyWRAPPINVOKE.SipUri_getParamValue(swigCPtr, pname); + return ret; + } + } diff --git a/trunk/bindings/csharp/tdav_codec_id_t.cs b/trunk/bindings/csharp/tdav_codec_id_t.cs index 14711343..eee07ca2 100644 --- a/trunk/bindings/csharp/tdav_codec_id_t.cs +++ b/trunk/bindings/csharp/tdav_codec_id_t.cs @@ -19,6 +19,9 @@ public enum tdav_codec_id_t { tdav_codec_id_speex_nb = 0x00000001 << 8, tdav_codec_id_speex_wb = 0x00000001 << 9, tdav_codec_id_speex_uwb = 0x00000001 << 10, + tdav_codec_id_bv16 = 0x00000001 << 11, + tdav_codec_id_bv32 = 0x00000001 << 12, + tdav_codec_id_evrc = 0x00000001 << 13, tdav_codec_id_h261 = 0x00010000 << 0, tdav_codec_id_h263 = 0x00010000 << 1, tdav_codec_id_h263p = 0x00010000 << 2, diff --git a/trunk/bindings/csharp/test/Program.cs b/trunk/bindings/csharp/test/Program.cs index 679df405..1855d9bb 100644 --- a/trunk/bindings/csharp/test/Program.cs +++ b/trunk/bindings/csharp/test/Program.cs @@ -11,7 +11,7 @@ namespace test const String REALM = "micromethod.com"; const String USER = "mamadou"; const String PROXY_CSCF_IP = "192.168.0.10"; - const uint PROXY_CSCF_PORT = 5060; + const ushort PROXY_CSCF_PORT = 5060; const String PASSWORD = ""; /* @@ -57,6 +57,9 @@ namespace test /* Sets Proxy-CSCF */ success = sipStack.setProxyCSCF(PROXY_CSCF_IP, PROXY_CSCF_PORT, "udp", "ipv4"); + // STUN + sipStack.setSTUNServer("numb.viagenie.ca", 3478); + sipStack.setSTUNCred("login", "password"); /* Starts the stack */ success = sipStack.start(); @@ -65,14 +68,18 @@ namespace test /* Early IMS */ sipStack.setEarlyIMS(true); + /* AMF and Operator Id */ + sipStack.setAMF("0x00FF"); + sipStack.setOperatorId("0xFF0000000000000000000000000000FF"); - //sipStack.setAoR("127.0.0.1", 1234); + //sipStack.setAoR("127.0.0.1", 1234); audioConsumer.setActivate(true); audioProducer.setActivate(true); videoProducer.setActivate(true); videoConsumer.setActivate(true); + /* Send REGISTER */ regSession = new RegistrationSession(sipStack); regSession.addCaps("+g.oma.sip-im"); @@ -83,9 +90,11 @@ namespace test Console.ReadLine(); - //String sipUri = sipStack.dnsENUM("E2U+SIP", "+1-800-555-5555", "e164.org"); - // short port = 0; + + String sipUri = sipStack.dnsENUM("E2U+SIP", "+1-800-555-5555", "e164.org"); + //ushort port = 0; //String ipAddress = sipStack.dnsNaptrSrv("sip2sip.info", "SIP+D2U", out port); + //String ipAddress = sipStack.dnsSrv("_sip._udp.sip2sip.info", out port); callSession = new CallSession(sipStack); callSession.set100rel(true); @@ -114,6 +123,28 @@ namespace test ////Thread.Sleep(2000); + /*RPData rpdata = SMSEncoder.encodeSubmit(25, "+33160188661", "+33660188661", "salut"); + if (rpdata != null) + { + uint pay_len = rpdata.getPayloadLength(); + if (pay_len > 0) + { + byte[] pay = new byte[pay_len]; + rpdata.getPayload(pay, (uint)pay.Length); + + MessagingSession m = new MessagingSession(sipStack); + m.setToUri(String.Format("sip:+33160188661@{0}", REALM)); + m.addHeader("Content-Type", "application/vnd.3gpp.sms"); + m.addHeader("Transfer-Encoding", "binary"); + m.send(pay, (uint)pay.Length); + + m.Dispose(); + } + rpdata.Dispose(); + } + + Console.ReadLine();*/ + ///* Send SUBSCRIBE(reg) */ //subSession = new SubscriptionSession(sipStack); //subSession.addHeader("Event", "reg"); diff --git a/trunk/bindings/csharp/test/test.csproj b/trunk/bindings/csharp/test/test.csproj index 6fb0d7c2..114a3874 100644 --- a/trunk/bindings/csharp/test/test.csproj +++ b/trunk/bindings/csharp/test/test.csproj @@ -96,6 +96,9 @@ RegistrationSession.cs + + RPData.cs + SafeObject.cs @@ -114,6 +117,12 @@ SipStack.cs + + SipUri.cs + + + SMSEncoder.cs + StackEvent.cs @@ -165,6 +174,9 @@ tsip_subscribe_event_type_t.cs + + twrap_rpdata_type_t.cs + XcapCallback.cs diff --git a/trunk/bindings/csharp/tinyWRAP.sln b/trunk/bindings/csharp/tinyWRAP.sln index 36c1b095..93e1327e 100644 --- a/trunk/bindings/csharp/tinyWRAP.sln +++ b/trunk/bindings/csharp/tinyWRAP.sln @@ -31,6 +31,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test_xcap", "test_xcap\test EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyXCAP", "..\..\tinyXCAP\tinyXCAP.vcproj", "{570CF33D-E65F-448F-8AC2-F9AE2F23152F}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySMS", "..\..\tinySMS\tinySMS.vcproj", "{9A3A5AF3-2333-4477-B880-7F901F9D8972}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -471,6 +473,30 @@ Global {570CF33D-E65F-448F-8AC2-F9AE2F23152F}.Static_Release|Win32.ActiveCfg = Release|Win32 {570CF33D-E65F-448F-8AC2-F9AE2F23152F}.Static_Release|Win32.Build.0 = Release|Win32 {570CF33D-E65F-448F-8AC2-F9AE2F23152F}.Static_Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Debug|Win32.ActiveCfg = Debug|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Debug|Win32.Build.0 = Debug|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Release|Any CPU.ActiveCfg = Release|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Release|Mixed Platforms.Build.0 = Release|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Release|Win32.ActiveCfg = Release|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Release|Win32.Build.0 = Release|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Static_Debug|Any CPU.ActiveCfg = Debug|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Static_Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Static_Debug|Mixed Platforms.Build.0 = Debug|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Static_Debug|Win32.ActiveCfg = Debug|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Static_Debug|Win32.Build.0 = Debug|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Static_Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Static_Release|Any CPU.ActiveCfg = Release|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Static_Release|Mixed Platforms.ActiveCfg = Release|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Static_Release|Mixed Platforms.Build.0 = Release|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Static_Release|Win32.ActiveCfg = Release|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Static_Release|Win32.Build.0 = Release|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Static_Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/trunk/bindings/csharp/tinyWRAP.vcproj b/trunk/bindings/csharp/tinyWRAP.vcproj index 6308ff5e..513b71f0 100644 --- a/trunk/bindings/csharp/tinyWRAP.vcproj +++ b/trunk/bindings/csharp/tinyWRAP.vcproj @@ -41,7 +41,7 @@ + + @@ -271,6 +275,10 @@ RelativePath="..\_common\SipUri.h" > + + @@ -296,6 +304,10 @@ RelativePath="..\_common\SipStack.i" > + + diff --git a/trunk/bindings/csharp/tinyWRAPPINVOKE.cs b/trunk/bindings/csharp/tinyWRAPPINVOKE.cs index 658250ac..30bad27b 100644 --- a/trunk/bindings/csharp/tinyWRAPPINVOKE.cs +++ b/trunk/bindings/csharp/tinyWRAPPINVOKE.cs @@ -214,6 +214,27 @@ class tinyWRAPPINVOKE { [DllImport("tinyWRAP", EntryPoint="CSharp_SipUri_isValid__SWIG_1")] public static extern bool SipUri_isValid__SWIG_1(HandleRef jarg1); + [DllImport("tinyWRAP", EntryPoint="CSharp_SipUri_getScheme")] + public static extern string SipUri_getScheme(HandleRef jarg1); + + [DllImport("tinyWRAP", EntryPoint="CSharp_SipUri_getHost")] + public static extern string SipUri_getHost(HandleRef jarg1); + + [DllImport("tinyWRAP", EntryPoint="CSharp_SipUri_getPort")] + public static extern ushort SipUri_getPort(HandleRef jarg1); + + [DllImport("tinyWRAP", EntryPoint="CSharp_SipUri_getUserName")] + public static extern string SipUri_getUserName(HandleRef jarg1); + + [DllImport("tinyWRAP", EntryPoint="CSharp_SipUri_getPassword")] + public static extern string SipUri_getPassword(HandleRef jarg1); + + [DllImport("tinyWRAP", EntryPoint="CSharp_SipUri_getDisplayName")] + public static extern string SipUri_getDisplayName(HandleRef jarg1); + + [DllImport("tinyWRAP", EntryPoint="CSharp_SipUri_getParamValue")] + public static extern string SipUri_getParamValue(HandleRef jarg1, string jarg2); + [DllImport("tinyWRAP", EntryPoint="CSharp_new_SipMessage")] public static extern IntPtr new_SipMessage(); @@ -733,14 +754,20 @@ class tinyWRAPPINVOKE { [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_setPassword")] public static extern bool SipStack_setPassword(HandleRef jarg1, string jarg2); + [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_setAMF")] + public static extern bool SipStack_setAMF(HandleRef jarg1, string jarg2); + + [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_setOperatorId")] + public static extern bool SipStack_setOperatorId(HandleRef jarg1, string jarg2); + [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_setProxyCSCF")] - public static extern bool SipStack_setProxyCSCF(HandleRef jarg1, string jarg2, uint jarg3, string jarg4, string jarg5); + public static extern bool SipStack_setProxyCSCF(HandleRef jarg1, string jarg2, ushort jarg3, string jarg4, string jarg5); [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_setLocalIP")] public static extern bool SipStack_setLocalIP(HandleRef jarg1, string jarg2); [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_setLocalPort")] - public static extern bool SipStack_setLocalPort(HandleRef jarg1, uint jarg2); + public static extern bool SipStack_setLocalPort(HandleRef jarg1, ushort jarg2); [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_setEarlyIMS")] public static extern bool SipStack_setEarlyIMS(HandleRef jarg1, bool jarg2); @@ -757,11 +784,20 @@ class tinyWRAPPINVOKE { [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_setAoR")] public static extern bool SipStack_setAoR(HandleRef jarg1, string jarg2, int jarg3); + [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_setSTUNServer")] + public static extern bool SipStack_setSTUNServer(HandleRef jarg1, string jarg2, ushort jarg3); + + [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_setSTUNCred")] + public static extern bool SipStack_setSTUNCred(HandleRef jarg1, string jarg2, string jarg3); + [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_dnsENUM")] public static extern string SipStack_dnsENUM(HandleRef jarg1, string jarg2, string jarg3, string jarg4); [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_dnsNaptrSrv")] - public static extern string SipStack_dnsNaptrSrv(HandleRef jarg1, string jarg2, string jarg3, out short jarg4); + public static extern string SipStack_dnsNaptrSrv(HandleRef jarg1, string jarg2, string jarg3, out ushort jarg4); + + [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_dnsSrv")] + public static extern string SipStack_dnsSrv(HandleRef jarg1, string jarg2, out ushort jarg3); [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_isValid")] public static extern bool SipStack_isValid(HandleRef jarg1); @@ -937,6 +973,27 @@ class tinyWRAPPINVOKE { [DllImport("tinyWRAP", EntryPoint="CSharp_XcapStack_stop")] public static extern bool XcapStack_stop(HandleRef jarg1); + [DllImport("tinyWRAP", EntryPoint="CSharp_new_RPData")] + public static extern IntPtr new_RPData(); + + [DllImport("tinyWRAP", EntryPoint="CSharp_delete_RPData")] + public static extern void delete_RPData(HandleRef jarg1); + + [DllImport("tinyWRAP", EntryPoint="CSharp_RPData_getType")] + public static extern int RPData_getType(HandleRef jarg1); + + [DllImport("tinyWRAP", EntryPoint="CSharp_RPData_getPayloadLength")] + public static extern uint RPData_getPayloadLength(HandleRef jarg1); + + [DllImport("tinyWRAP", EntryPoint="CSharp_RPData_getPayload")] + public static extern uint RPData_getPayload(HandleRef jarg1, byte[] jarg2, uint jarg3); + + [DllImport("tinyWRAP", EntryPoint="CSharp_SMSEncoder_encodeSubmit")] + public static extern IntPtr SMSEncoder_encodeSubmit(int jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("tinyWRAP", EntryPoint="CSharp_delete_SMSEncoder")] + public static extern void delete_SMSEncoder(HandleRef jarg1); + [DllImport("tinyWRAP", EntryPoint="CSharp_DialogEventUpcast")] public static extern IntPtr DialogEventUpcast(IntPtr objectRef); diff --git a/trunk/bindings/csharp/tinyWRAP_wrap.cxx b/trunk/bindings/csharp/tinyWRAP_wrap.cxx index f59f5e24..6f9e4e50 100644 --- a/trunk/bindings/csharp/tinyWRAP_wrap.cxx +++ b/trunk/bindings/csharp/tinyWRAP_wrap.cxx @@ -350,6 +350,9 @@ namespace Swig { #include "Xcap.h" +#include "SMSEncoder.h" + + /* --------------------------------------------------- * C++ director class methods @@ -1004,6 +1007,92 @@ SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipUri_isValid__SWIG_1(void * jarg1) } +SWIGEXPORT char * SWIGSTDCALL CSharp_SipUri_getScheme(void * jarg1) { + char * jresult ; + SipUri *arg1 = (SipUri *) 0 ; + char *result = 0 ; + + arg1 = (SipUri *)jarg1; + result = (char *)(arg1)->getScheme(); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_SipUri_getHost(void * jarg1) { + char * jresult ; + SipUri *arg1 = (SipUri *) 0 ; + char *result = 0 ; + + arg1 = (SipUri *)jarg1; + result = (char *)(arg1)->getHost(); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT unsigned short SWIGSTDCALL CSharp_SipUri_getPort(void * jarg1) { + unsigned short jresult ; + SipUri *arg1 = (SipUri *) 0 ; + unsigned short result; + + arg1 = (SipUri *)jarg1; + result = (unsigned short)(arg1)->getPort(); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_SipUri_getUserName(void * jarg1) { + char * jresult ; + SipUri *arg1 = (SipUri *) 0 ; + char *result = 0 ; + + arg1 = (SipUri *)jarg1; + result = (char *)(arg1)->getUserName(); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_SipUri_getPassword(void * jarg1) { + char * jresult ; + SipUri *arg1 = (SipUri *) 0 ; + char *result = 0 ; + + arg1 = (SipUri *)jarg1; + result = (char *)(arg1)->getPassword(); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_SipUri_getDisplayName(void * jarg1) { + char * jresult ; + SipUri *arg1 = (SipUri *) 0 ; + char *result = 0 ; + + arg1 = (SipUri *)jarg1; + result = (char *)(arg1)->getDisplayName(); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_SipUri_getParamValue(void * jarg1, char * jarg2) { + char * jresult ; + SipUri *arg1 = (SipUri *) 0 ; + char *arg2 = (char *) 0 ; + char *result = 0 ; + + arg1 = (SipUri *)jarg1; + arg2 = (char *)jarg2; + result = (char *)(arg1)->getParamValue((char const *)arg2); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + SWIGEXPORT void * SWIGSTDCALL CSharp_new_SipMessage() { void * jresult ; SipMessage *result = 0 ; @@ -3131,18 +3220,46 @@ SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipStack_setPassword(void * jarg1, ch } -SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipStack_setProxyCSCF(void * jarg1, char * jarg2, unsigned int jarg3, char * jarg4, char * jarg5) { +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipStack_setAMF(void * jarg1, char * jarg2) { unsigned int jresult ; SipStack *arg1 = (SipStack *) 0 ; char *arg2 = (char *) 0 ; - unsigned int arg3 ; + bool result; + + arg1 = (SipStack *)jarg1; + arg2 = (char *)jarg2; + result = (bool)(arg1)->setAMF((char const *)arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipStack_setOperatorId(void * jarg1, char * jarg2) { + unsigned int jresult ; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + bool result; + + arg1 = (SipStack *)jarg1; + arg2 = (char *)jarg2; + result = (bool)(arg1)->setOperatorId((char const *)arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipStack_setProxyCSCF(void * jarg1, char * jarg2, unsigned short jarg3, char * jarg4, char * jarg5) { + unsigned int jresult ; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + unsigned short arg3 ; char *arg4 = (char *) 0 ; char *arg5 = (char *) 0 ; bool result; arg1 = (SipStack *)jarg1; arg2 = (char *)jarg2; - arg3 = (unsigned int)jarg3; + arg3 = (unsigned short)jarg3; arg4 = (char *)jarg4; arg5 = (char *)jarg5; result = (bool)(arg1)->setProxyCSCF((char const *)arg2,arg3,(char const *)arg4,(char const *)arg5); @@ -3165,14 +3282,14 @@ SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipStack_setLocalIP(void * jarg1, cha } -SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipStack_setLocalPort(void * jarg1, unsigned int jarg2) { +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipStack_setLocalPort(void * jarg1, unsigned short jarg2) { unsigned int jresult ; SipStack *arg1 = (SipStack *) 0 ; - unsigned int arg2 ; + unsigned short arg2 ; bool result; arg1 = (SipStack *)jarg1; - arg2 = (unsigned int)jarg2; + arg2 = (unsigned short)jarg2; result = (bool)(arg1)->setLocalPort(arg2); jresult = result; return jresult; @@ -3253,6 +3370,38 @@ SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipStack_setAoR(void * jarg1, char * } +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipStack_setSTUNServer(void * jarg1, char * jarg2, unsigned short jarg3) { + unsigned int jresult ; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + unsigned short arg3 ; + bool result; + + arg1 = (SipStack *)jarg1; + arg2 = (char *)jarg2; + arg3 = (unsigned short)jarg3; + result = (bool)(arg1)->setSTUNServer((char const *)arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipStack_setSTUNCred(void * jarg1, char * jarg2, char * jarg3) { + unsigned int jresult ; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + bool result; + + arg1 = (SipStack *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (bool)(arg1)->setSTUNCred((char const *)arg2,(char const *)arg3); + jresult = result; + return jresult; +} + + SWIGEXPORT char * SWIGSTDCALL CSharp_SipStack_dnsENUM(void * jarg1, char * jarg2, char * jarg3, char * jarg4) { char * jresult ; SipStack *arg1 = (SipStack *) 0 ; @@ -3272,18 +3421,18 @@ SWIGEXPORT char * SWIGSTDCALL CSharp_SipStack_dnsENUM(void * jarg1, char * jarg2 } -SWIGEXPORT char * SWIGSTDCALL CSharp_SipStack_dnsNaptrSrv(void * jarg1, char * jarg2, char * jarg3, short * jarg4) { +SWIGEXPORT char * SWIGSTDCALL CSharp_SipStack_dnsNaptrSrv(void * jarg1, char * jarg2, char * jarg3, unsigned short * jarg4) { char * jresult ; SipStack *arg1 = (SipStack *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; - short *arg4 = (short *) 0 ; + unsigned short *arg4 = (unsigned short *) 0 ; char *result = 0 ; arg1 = (SipStack *)jarg1; arg2 = (char *)jarg2; arg3 = (char *)jarg3; - arg4 = (short *)jarg4; + arg4 = (unsigned short *)jarg4; result = (char *)(arg1)->dnsNaptrSrv((char const *)arg2,(char const *)arg3,arg4); jresult = SWIG_csharp_string_callback((const char *)result); delete [] result; @@ -3291,6 +3440,23 @@ SWIGEXPORT char * SWIGSTDCALL CSharp_SipStack_dnsNaptrSrv(void * jarg1, char * j } +SWIGEXPORT char * SWIGSTDCALL CSharp_SipStack_dnsSrv(void * jarg1, char * jarg2, unsigned short * jarg3) { + char * jresult ; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + unsigned short *arg3 = (unsigned short *) 0 ; + char *result = 0 ; + + arg1 = (SipStack *)jarg1; + arg2 = (char *)jarg2; + arg3 = (unsigned short *)jarg3; + result = (char *)(arg1)->dnsSrv((char const *)arg2,arg3); + jresult = SWIG_csharp_string_callback((const char *)result); + delete [] result; + return jresult; +} + + SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipStack_isValid(void * jarg1) { unsigned int jresult ; SipStack *arg1 = (SipStack *) 0 ; @@ -4001,6 +4167,90 @@ SWIGEXPORT unsigned int SWIGSTDCALL CSharp_XcapStack_stop(void * jarg1) { } +SWIGEXPORT void * SWIGSTDCALL CSharp_new_RPData() { + void * jresult ; + RPData *result = 0 ; + + result = (RPData *)new RPData(); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_RPData(void * jarg1) { + RPData *arg1 = (RPData *) 0 ; + + arg1 = (RPData *)jarg1; + delete arg1; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_RPData_getType(void * jarg1) { + int jresult ; + RPData *arg1 = (RPData *) 0 ; + twrap_rpdata_type_t result; + + arg1 = (RPData *)jarg1; + result = (twrap_rpdata_type_t)(arg1)->getType(); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_RPData_getPayloadLength(void * jarg1) { + unsigned int jresult ; + RPData *arg1 = (RPData *) 0 ; + unsigned int result; + + arg1 = (RPData *)jarg1; + result = (unsigned int)(arg1)->getPayloadLength(); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_RPData_getPayload(void * jarg1, void * jarg2, unsigned int jarg3) { + unsigned int jresult ; + RPData *arg1 = (RPData *) 0 ; + void *arg2 = (void *) 0 ; + unsigned int arg3 ; + unsigned int result; + + arg1 = (RPData *)jarg1; + arg2 = jarg2; + arg3 = (unsigned int)jarg3; + result = (unsigned int)(arg1)->getPayload(arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_SMSEncoder_encodeSubmit(int jarg1, char * jarg2, char * jarg3, char * jarg4) { + void * jresult ; + int arg1 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + RPData *result = 0 ; + + arg1 = (int)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (RPData *)SMSEncoder::encodeSubmit(arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_SMSEncoder(void * jarg1) { + SMSEncoder *arg1 = (SMSEncoder *) 0 ; + + arg1 = (SMSEncoder *)jarg1; + delete arg1; +} + + SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_DialogEventUpcast(DialogEvent *objectRef) { return (SipEvent *)objectRef; } diff --git a/trunk/bindings/csharp/tsip_invite_event_type_t.cs b/trunk/bindings/csharp/tsip_invite_event_type_t.cs index bd1237af..9f8c9437 100644 --- a/trunk/bindings/csharp/tsip_invite_event_type_t.cs +++ b/trunk/bindings/csharp/tsip_invite_event_type_t.cs @@ -14,6 +14,7 @@ public enum tsip_invite_event_type_t { tsip_o_ect_ok, tsip_o_ect_nok, tsip_i_ect, + tsip_m_early_media, tsip_m_local_hold_ok, tsip_m_local_hold_nok, tsip_m_local_resume_ok, diff --git a/trunk/bindings/csharp/twrap_rpdata_type_t.cs b/trunk/bindings/csharp/twrap_rpdata_type_t.cs new file mode 100644 index 00000000..d075d696 --- /dev/null +++ b/trunk/bindings/csharp/twrap_rpdata_type_t.cs @@ -0,0 +1,16 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.39 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +public enum twrap_rpdata_type_t { + twrap_rpdata_type_sms_none, + twrap_rpdata_type_sms_submit, + twrap_rpdata_type_sms_deliver, + twrap_rpdata_type_sms_status_report, + twrap_rpdata_type_sms_command +} diff --git a/trunk/bindings/java/RPData.java b/trunk/bindings/java/RPData.java new file mode 100644 index 00000000..96517ac2 --- /dev/null +++ b/trunk/bindings/java/RPData.java @@ -0,0 +1,52 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.39 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package org.doubango.tinyWRAP; + +public class RPData { + private long swigCPtr; + protected boolean swigCMemOwn; + + protected RPData(long cPtr, boolean cMemoryOwn) { + swigCMemOwn = cMemoryOwn; + swigCPtr = cPtr; + } + + protected static long getCPtr(RPData obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if(swigCPtr != 0 && swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_RPData(swigCPtr); + } + swigCPtr = 0; + } + + public RPData() { + this(tinyWRAPJNI.new_RPData(), true); + } + + public twrap_rpdata_type_t getType() { + return twrap_rpdata_type_t.swigToEnum(tinyWRAPJNI.RPData_getType(swigCPtr, this)); + } + + public long getPayloadLength() { + return tinyWRAPJNI.RPData_getPayloadLength(swigCPtr, this); + } + + public long getPayload(java.nio.ByteBuffer output, long maxsize) { + return tinyWRAPJNI.RPData_getPayload(swigCPtr, this, output, maxsize); + } + +} diff --git a/trunk/bindings/java/SMSEncoder.java b/trunk/bindings/java/SMSEncoder.java new file mode 100644 index 00000000..b145016e --- /dev/null +++ b/trunk/bindings/java/SMSEncoder.java @@ -0,0 +1,41 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.39 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package org.doubango.tinyWRAP; + +public class SMSEncoder { + private long swigCPtr; + protected boolean swigCMemOwn; + + protected SMSEncoder(long cPtr, boolean cMemoryOwn) { + swigCMemOwn = cMemoryOwn; + swigCPtr = cPtr; + } + + protected static long getCPtr(SMSEncoder obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if(swigCPtr != 0 && swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SMSEncoder(swigCPtr); + } + swigCPtr = 0; + } + + public static RPData encodeSubmit(int mr, String smsc, String destination, String ascii) { + long cPtr = tinyWRAPJNI.SMSEncoder_encodeSubmit(mr, smsc, destination, ascii); + return (cPtr == 0) ? null : new RPData(cPtr, true); + } + +} diff --git a/trunk/bindings/java/SipStack.java b/trunk/bindings/java/SipStack.java index 00b2a0c7..e4e127fc 100644 --- a/trunk/bindings/java/SipStack.java +++ b/trunk/bindings/java/SipStack.java @@ -61,7 +61,15 @@ public class SipStack extends SafeObject { return tinyWRAPJNI.SipStack_setPassword(swigCPtr, this, password); } - public boolean setProxyCSCF(String fqdn, long port, String transport, String ipversion) { + public boolean setAMF(String amf) { + return tinyWRAPJNI.SipStack_setAMF(swigCPtr, this, amf); + } + + public boolean setOperatorId(String opid) { + return tinyWRAPJNI.SipStack_setOperatorId(swigCPtr, this, opid); + } + + public boolean setProxyCSCF(String fqdn, int port, String transport, String ipversion) { return tinyWRAPJNI.SipStack_setProxyCSCF(swigCPtr, this, fqdn, port, transport, ipversion); } @@ -69,7 +77,7 @@ public class SipStack extends SafeObject { return tinyWRAPJNI.SipStack_setLocalIP(swigCPtr, this, ip); } - public boolean setLocalPort(long port) { + public boolean setLocalPort(int port) { return tinyWRAPJNI.SipStack_setLocalPort(swigCPtr, this, port); } @@ -93,14 +101,26 @@ public class SipStack extends SafeObject { return tinyWRAPJNI.SipStack_setAoR(swigCPtr, this, ip, port); } + public boolean setSTUNServer(String ip, int port) { + return tinyWRAPJNI.SipStack_setSTUNServer(swigCPtr, this, ip, port); + } + + public boolean setSTUNCred(String login, String password) { + return tinyWRAPJNI.SipStack_setSTUNCred(swigCPtr, this, login, password); + } + public String dnsENUM(String service, String e164num, String domain) { return tinyWRAPJNI.SipStack_dnsENUM(swigCPtr, this, service, e164num, domain); } - public String dnsNaptrSrv(String domain, String service, short[] OUTPUT) { + public String dnsNaptrSrv(String domain, String service, int[] OUTPUT) { return tinyWRAPJNI.SipStack_dnsNaptrSrv(swigCPtr, this, domain, service, OUTPUT); } + public String dnsSrv(String service, int[] OUTPUT) { + return tinyWRAPJNI.SipStack_dnsSrv(swigCPtr, this, service, OUTPUT); + } + public boolean isValid() { return tinyWRAPJNI.SipStack_isValid(swigCPtr, this); } diff --git a/trunk/bindings/java/SipUri.java b/trunk/bindings/java/SipUri.java index 81dc1aae..d056a041 100644 --- a/trunk/bindings/java/SipUri.java +++ b/trunk/bindings/java/SipUri.java @@ -45,4 +45,32 @@ public class SipUri { return tinyWRAPJNI.SipUri_isValid__SWIG_1(swigCPtr, this); } + public String getScheme() { + return tinyWRAPJNI.SipUri_getScheme(swigCPtr, this); + } + + public String getHost() { + return tinyWRAPJNI.SipUri_getHost(swigCPtr, this); + } + + public int getPort() { + return tinyWRAPJNI.SipUri_getPort(swigCPtr, this); + } + + public String getUserName() { + return tinyWRAPJNI.SipUri_getUserName(swigCPtr, this); + } + + public String getPassword() { + return tinyWRAPJNI.SipUri_getPassword(swigCPtr, this); + } + + public String getDisplayName() { + return tinyWRAPJNI.SipUri_getDisplayName(swigCPtr, this); + } + + public String getParamValue(String pname) { + return tinyWRAPJNI.SipUri_getParamValue(swigCPtr, this, pname); + } + } diff --git a/trunk/bindings/java/android/RPData.java b/trunk/bindings/java/android/RPData.java new file mode 100644 index 00000000..96517ac2 --- /dev/null +++ b/trunk/bindings/java/android/RPData.java @@ -0,0 +1,52 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.39 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package org.doubango.tinyWRAP; + +public class RPData { + private long swigCPtr; + protected boolean swigCMemOwn; + + protected RPData(long cPtr, boolean cMemoryOwn) { + swigCMemOwn = cMemoryOwn; + swigCPtr = cPtr; + } + + protected static long getCPtr(RPData obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if(swigCPtr != 0 && swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_RPData(swigCPtr); + } + swigCPtr = 0; + } + + public RPData() { + this(tinyWRAPJNI.new_RPData(), true); + } + + public twrap_rpdata_type_t getType() { + return twrap_rpdata_type_t.swigToEnum(tinyWRAPJNI.RPData_getType(swigCPtr, this)); + } + + public long getPayloadLength() { + return tinyWRAPJNI.RPData_getPayloadLength(swigCPtr, this); + } + + public long getPayload(java.nio.ByteBuffer output, long maxsize) { + return tinyWRAPJNI.RPData_getPayload(swigCPtr, this, output, maxsize); + } + +} diff --git a/trunk/bindings/java/android/SMSEncoder.java b/trunk/bindings/java/android/SMSEncoder.java new file mode 100644 index 00000000..b145016e --- /dev/null +++ b/trunk/bindings/java/android/SMSEncoder.java @@ -0,0 +1,41 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.39 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package org.doubango.tinyWRAP; + +public class SMSEncoder { + private long swigCPtr; + protected boolean swigCMemOwn; + + protected SMSEncoder(long cPtr, boolean cMemoryOwn) { + swigCMemOwn = cMemoryOwn; + swigCPtr = cPtr; + } + + protected static long getCPtr(SMSEncoder obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if(swigCPtr != 0 && swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SMSEncoder(swigCPtr); + } + swigCPtr = 0; + } + + public static RPData encodeSubmit(int mr, String smsc, String destination, String ascii) { + long cPtr = tinyWRAPJNI.SMSEncoder_encodeSubmit(mr, smsc, destination, ascii); + return (cPtr == 0) ? null : new RPData(cPtr, true); + } + +} diff --git a/trunk/bindings/java/android/SipStack.java b/trunk/bindings/java/android/SipStack.java index 00b2a0c7..e4e127fc 100644 --- a/trunk/bindings/java/android/SipStack.java +++ b/trunk/bindings/java/android/SipStack.java @@ -61,7 +61,15 @@ public class SipStack extends SafeObject { return tinyWRAPJNI.SipStack_setPassword(swigCPtr, this, password); } - public boolean setProxyCSCF(String fqdn, long port, String transport, String ipversion) { + public boolean setAMF(String amf) { + return tinyWRAPJNI.SipStack_setAMF(swigCPtr, this, amf); + } + + public boolean setOperatorId(String opid) { + return tinyWRAPJNI.SipStack_setOperatorId(swigCPtr, this, opid); + } + + public boolean setProxyCSCF(String fqdn, int port, String transport, String ipversion) { return tinyWRAPJNI.SipStack_setProxyCSCF(swigCPtr, this, fqdn, port, transport, ipversion); } @@ -69,7 +77,7 @@ public class SipStack extends SafeObject { return tinyWRAPJNI.SipStack_setLocalIP(swigCPtr, this, ip); } - public boolean setLocalPort(long port) { + public boolean setLocalPort(int port) { return tinyWRAPJNI.SipStack_setLocalPort(swigCPtr, this, port); } @@ -93,14 +101,26 @@ public class SipStack extends SafeObject { return tinyWRAPJNI.SipStack_setAoR(swigCPtr, this, ip, port); } + public boolean setSTUNServer(String ip, int port) { + return tinyWRAPJNI.SipStack_setSTUNServer(swigCPtr, this, ip, port); + } + + public boolean setSTUNCred(String login, String password) { + return tinyWRAPJNI.SipStack_setSTUNCred(swigCPtr, this, login, password); + } + public String dnsENUM(String service, String e164num, String domain) { return tinyWRAPJNI.SipStack_dnsENUM(swigCPtr, this, service, e164num, domain); } - public String dnsNaptrSrv(String domain, String service, short[] OUTPUT) { + public String dnsNaptrSrv(String domain, String service, int[] OUTPUT) { return tinyWRAPJNI.SipStack_dnsNaptrSrv(swigCPtr, this, domain, service, OUTPUT); } + public String dnsSrv(String service, int[] OUTPUT) { + return tinyWRAPJNI.SipStack_dnsSrv(swigCPtr, this, service, OUTPUT); + } + public boolean isValid() { return tinyWRAPJNI.SipStack_isValid(swigCPtr, this); } diff --git a/trunk/bindings/java/android/SipUri.java b/trunk/bindings/java/android/SipUri.java index 81dc1aae..d056a041 100644 --- a/trunk/bindings/java/android/SipUri.java +++ b/trunk/bindings/java/android/SipUri.java @@ -45,4 +45,32 @@ public class SipUri { return tinyWRAPJNI.SipUri_isValid__SWIG_1(swigCPtr, this); } + public String getScheme() { + return tinyWRAPJNI.SipUri_getScheme(swigCPtr, this); + } + + public String getHost() { + return tinyWRAPJNI.SipUri_getHost(swigCPtr, this); + } + + public int getPort() { + return tinyWRAPJNI.SipUri_getPort(swigCPtr, this); + } + + public String getUserName() { + return tinyWRAPJNI.SipUri_getUserName(swigCPtr, this); + } + + public String getPassword() { + return tinyWRAPJNI.SipUri_getPassword(swigCPtr, this); + } + + public String getDisplayName() { + return tinyWRAPJNI.SipUri_getDisplayName(swigCPtr, this); + } + + public String getParamValue(String pname) { + return tinyWRAPJNI.SipUri_getParamValue(swigCPtr, this, pname); + } + } diff --git a/trunk/bindings/java/android/buildAll.sh b/trunk/bindings/java/android/buildAll.sh index c71b16d6..8038c9f8 100644 --- a/trunk/bindings/java/android/buildAll.sh +++ b/trunk/bindings/java/android/buildAll.sh @@ -1,8 +1,8 @@ #!/bin/bash # Build tinyWRAP for Google Android Systems -#for project in tinySAK tinyNET tinyHTTP tinyXCAP tinyIPSec tinySMS tinySIGCOMP tinySDP tinyRTP tinyMEDIA tinyDAV tinySIP -for project in tinyMEDIA tinyDAV +for project in tinySAK tinyNET tinyHTTP tinyXCAP tinyIPSec tinySMS tinySIGCOMP tinySDP tinyRTP tinyMEDIA tinyDAV tinySIP +#for project in tinyNET do echo -e building "$project....\n" make PROJECT=$project clean diff --git a/trunk/bindings/java/android/droid-makefile b/trunk/bindings/java/android/droid-makefile index 205cbf03..ab7854e9 100644 --- a/trunk/bindings/java/android/droid-makefile +++ b/trunk/bindings/java/android/droid-makefile @@ -1,7 +1,7 @@ APP := lib$(PROJECT).$(EXT) CFLAGS := $(CFLAGS_LIB) -fno-rtti -fno-exceptions -I../../_common -I../../. -I../../../tinySAK/src -I../../../tinyNET/src -I../../../tinyHTTP/include -I../../../tinyXCAP/include \ - -I../../../tinySDP/include -I../../../tinyMEDIA/include -I../../../tinyDAV/include -I../../../tinySIP/include + -I../../../tinySMS/include -I../../../tinySDP/include -I../../../tinyMEDIA/include -I../../../tinyDAV/include -I../../../tinySIP/include # Because of the static build, you need all librarires THIRDPARTIES_LIB := ../../../thirdparties/android/lib @@ -13,7 +13,7 @@ ILBC_LDFLAGS := -liLBC LIBGSM_LDFLAGS := -lgsm LDFLAGS := $(LDFLAGS_LIB) -L$(THIRDPARTIES_LIB) $(FFMPEG_LDFLAGS) $(SPEEX_LDFLAGS) $(OPENCORE_ARM_LDFLAGS) $(ILBC_LDFLAGS) $(LIBGSM_LDFLAGS)\ - -ltinySAK -ltinyHTTP -ltinyXCAP -ltinyIPSec -ltinySIGCOMP -ltinyNET -ltinySDP -ltinyRTP -ltinyMEDIA -ltinyDAV -ltinySIP \ + -ltinySAK -ltinyHTTP -ltinyXCAP -ltinyIPSec -ltinySIGCOMP -ltinySMS -ltinyNET -ltinySDP -ltinyRTP -ltinyMEDIA -ltinyDAV -ltinySIP \ -lm -lstdc++ -llog -lgcc @@ -31,6 +31,7 @@ OBJS = tinyWRAP_wrap.o\ ../../_common/SipSession.o \ ../../_common/SipStack.o \ ../../_common/SipUri.o \ + ../../_common/SMSEncoder.o \ ../../_common/Xcap.o diff --git a/trunk/bindings/java/android/tdav_codec_id_t.java b/trunk/bindings/java/android/tdav_codec_id_t.java index f81a6143..594b31bb 100644 --- a/trunk/bindings/java/android/tdav_codec_id_t.java +++ b/trunk/bindings/java/android/tdav_codec_id_t.java @@ -20,6 +20,9 @@ public enum tdav_codec_id_t { tdav_codec_id_speex_nb(0x00000001 << 8), tdav_codec_id_speex_wb(0x00000001 << 9), tdav_codec_id_speex_uwb(0x00000001 << 10), + tdav_codec_id_bv16(0x00000001 << 11), + tdav_codec_id_bv32(0x00000001 << 12), + tdav_codec_id_evrc(0x00000001 << 13), tdav_codec_id_h261(0x00010000 << 0), tdav_codec_id_h263(0x00010000 << 1), tdav_codec_id_h263p(0x00010000 << 2), diff --git a/trunk/bindings/java/android/tinyWRAPJNI.java b/trunk/bindings/java/android/tinyWRAPJNI.java index 16b1940c..052a001e 100644 --- a/trunk/bindings/java/android/tinyWRAPJNI.java +++ b/trunk/bindings/java/android/tinyWRAPJNI.java @@ -19,6 +19,13 @@ class tinyWRAPJNI { public final static native void delete_SipUri(long jarg1); public final static native boolean SipUri_isValid__SWIG_0(String jarg1); public final static native boolean SipUri_isValid__SWIG_1(long jarg1, SipUri jarg1_); + public final static native String SipUri_getScheme(long jarg1, SipUri jarg1_); + public final static native String SipUri_getHost(long jarg1, SipUri jarg1_); + public final static native int SipUri_getPort(long jarg1, SipUri jarg1_); + public final static native String SipUri_getUserName(long jarg1, SipUri jarg1_); + public final static native String SipUri_getPassword(long jarg1, SipUri jarg1_); + public final static native String SipUri_getDisplayName(long jarg1, SipUri jarg1_); + public final static native String SipUri_getParamValue(long jarg1, SipUri jarg1_, String jarg2); public final static native long new_SipMessage(); public final static native void delete_SipMessage(long jarg1); public final static native String SipMessage_getSipHeaderValue__SWIG_0(long jarg1, SipMessage jarg1_, String jarg2, long jarg3); @@ -197,16 +204,21 @@ class tinyWRAPJNI { public final static native boolean SipStack_setIMPI(long jarg1, SipStack jarg1_, String jarg2); public final static native boolean SipStack_setIMPU(long jarg1, SipStack jarg1_, String jarg2); public final static native boolean SipStack_setPassword(long jarg1, SipStack jarg1_, String jarg2); - public final static native boolean SipStack_setProxyCSCF(long jarg1, SipStack jarg1_, String jarg2, long jarg3, String jarg4, String jarg5); + public final static native boolean SipStack_setAMF(long jarg1, SipStack jarg1_, String jarg2); + public final static native boolean SipStack_setOperatorId(long jarg1, SipStack jarg1_, String jarg2); + public final static native boolean SipStack_setProxyCSCF(long jarg1, SipStack jarg1_, String jarg2, int jarg3, String jarg4, String jarg5); public final static native boolean SipStack_setLocalIP(long jarg1, SipStack jarg1_, String jarg2); - public final static native boolean SipStack_setLocalPort(long jarg1, SipStack jarg1_, long jarg2); + public final static native boolean SipStack_setLocalPort(long jarg1, SipStack jarg1_, int jarg2); public final static native boolean SipStack_setEarlyIMS(long jarg1, SipStack jarg1_, boolean jarg2); public final static native boolean SipStack_addHeader(long jarg1, SipStack jarg1_, String jarg2, String jarg3); public final static native boolean SipStack_removeHeader(long jarg1, SipStack jarg1_, String jarg2); public final static native boolean SipStack_addDnsServer(long jarg1, SipStack jarg1_, String jarg2); public final static native boolean SipStack_setAoR(long jarg1, SipStack jarg1_, String jarg2, int jarg3); + public final static native boolean SipStack_setSTUNServer(long jarg1, SipStack jarg1_, String jarg2, int jarg3); + public final static native boolean SipStack_setSTUNCred(long jarg1, SipStack jarg1_, String jarg2, String jarg3); public final static native String SipStack_dnsENUM(long jarg1, SipStack jarg1_, String jarg2, String jarg3, String jarg4); - public final static native String SipStack_dnsNaptrSrv(long jarg1, SipStack jarg1_, String jarg2, String jarg3, short[] jarg4); + public final static native String SipStack_dnsNaptrSrv(long jarg1, SipStack jarg1_, String jarg2, String jarg3, int[] jarg4); + public final static native String SipStack_dnsSrv(long jarg1, SipStack jarg1_, String jarg2, int[] jarg3); public final static native boolean SipStack_isValid(long jarg1, SipStack jarg1_); public final static native boolean SipStack_stop(long jarg1, SipStack jarg1_); public final static native void SipStack_setCodecs(int jarg1); @@ -252,6 +264,13 @@ class tinyWRAPJNI { public final static native boolean XcapStack_setTimeout(long jarg1, XcapStack jarg1_, long jarg2); public final static native boolean XcapStack_getDocument(long jarg1, XcapStack jarg1_, String jarg2); public final static native boolean XcapStack_stop(long jarg1, XcapStack jarg1_); + public final static native long new_RPData(); + public final static native void delete_RPData(long jarg1); + public final static native int RPData_getType(long jarg1, RPData jarg1_); + public final static native long RPData_getPayloadLength(long jarg1, RPData jarg1_); + public final static native long RPData_getPayload(long jarg1, RPData jarg1_, java.nio.ByteBuffer jarg2, long jarg3); + public final static native long SMSEncoder_encodeSubmit(int jarg1, String jarg2, String jarg3, String jarg4); + public final static native void delete_SMSEncoder(long jarg1); public final static native long SWIGDialogEventUpcast(long jarg1); public final static native long SWIGStackEventUpcast(long jarg1); public final static native long SWIGCallEventUpcast(long jarg1); diff --git a/trunk/bindings/java/android/tinyWRAP_wrap.cxx b/trunk/bindings/java/android/tinyWRAP_wrap.cxx index 7f6b8e1d..ac2d2e0a 100644 --- a/trunk/bindings/java/android/tinyWRAP_wrap.cxx +++ b/trunk/bindings/java/android/tinyWRAP_wrap.cxx @@ -425,6 +425,9 @@ namespace Swig { #include "Xcap.h" +#include "SMSEncoder.h" + + /* --------------------------------------------------- * C++ director class methods @@ -1550,6 +1553,118 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1isVal } +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getScheme(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + SipUri *arg1 = (SipUri *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipUri **)&jarg1; + result = (char *)(arg1)->getScheme(); + if(result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getHost(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + SipUri *arg1 = (SipUri *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipUri **)&jarg1; + result = (char *)(arg1)->getHost(); + if(result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getPort(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jint jresult = 0 ; + SipUri *arg1 = (SipUri *) 0 ; + unsigned short result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipUri **)&jarg1; + result = (unsigned short)(arg1)->getPort(); + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getUserName(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + SipUri *arg1 = (SipUri *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipUri **)&jarg1; + result = (char *)(arg1)->getUserName(); + if(result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getPassword(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + SipUri *arg1 = (SipUri *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipUri **)&jarg1; + result = (char *)(arg1)->getPassword(); + if(result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getDisplayName(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + SipUri *arg1 = (SipUri *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipUri **)&jarg1; + result = (char *)(arg1)->getDisplayName(); + if(result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getParamValue(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + jstring jresult = 0 ; + SipUri *arg1 = (SipUri *) 0 ; + char *arg2 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipUri **)&jarg1; + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (char *)(arg1)->getParamValue((char const *)arg2); + if(result) jresult = jenv->NewStringUTF((const char *)result); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_new_1SipMessage(JNIEnv *jenv, jclass jcls) { jlong jresult = 0 ; SipMessage *result = 0 ; @@ -4363,11 +4478,55 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1set } -SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setProxyCSCF(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jlong jarg3, jstring jarg4, jstring jarg5) { +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setAMF(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { jboolean jresult = 0 ; SipStack *arg1 = (SipStack *) 0 ; char *arg2 = (char *) 0 ; - unsigned int arg3 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipStack **)&jarg1; + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (bool)(arg1)->setAMF((char const *)arg2); + jresult = (jboolean)result; + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setOperatorId(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + jboolean jresult = 0 ; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipStack **)&jarg1; + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (bool)(arg1)->setOperatorId((char const *)arg2); + jresult = (jboolean)result; + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setProxyCSCF(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jint jarg3, jstring jarg4, jstring jarg5) { + jboolean jresult = 0 ; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + unsigned short arg3 ; char *arg4 = (char *) 0 ; char *arg5 = (char *) 0 ; bool result; @@ -4381,7 +4540,7 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1set arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); if (!arg2) return 0; } - arg3 = (unsigned int)jarg3; + arg3 = (unsigned short)jarg3; arg4 = 0; if (jarg4) { arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); @@ -4423,17 +4582,17 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1set } -SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setLocalPort(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setLocalPort(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2) { jboolean jresult = 0 ; SipStack *arg1 = (SipStack *) 0 ; - unsigned int arg2 ; + unsigned short arg2 ; bool result; (void)jenv; (void)jcls; (void)jarg1_; arg1 = *(SipStack **)&jarg1; - arg2 = (unsigned int)jarg2; + arg2 = (unsigned short)jarg2; result = (bool)(arg1)->setLocalPort(arg2); jresult = (jboolean)result; return jresult; @@ -4554,6 +4713,59 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1set } +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setSTUNServer(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jint jarg3) { + jboolean jresult = 0 ; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + unsigned short arg3 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipStack **)&jarg1; + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = (unsigned short)jarg3; + result = (bool)(arg1)->setSTUNServer((char const *)arg2,arg3); + jresult = (jboolean)result; + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setSTUNCred(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3) { + jboolean jresult = 0 ; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipStack **)&jarg1; + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (bool)(arg1)->setSTUNCred((char const *)arg2,(char const *)arg3); + jresult = (jboolean)result; + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsENUM(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4) { jstring jresult = 0 ; SipStack *arg1 = (SipStack *) 0 ; @@ -4591,13 +4803,13 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsE } -SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsNaptrSrv(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jshortArray jarg4) { +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsNaptrSrv(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jintArray jarg4) { jstring jresult = 0 ; SipStack *arg1 = (SipStack *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; - short *arg4 = (short *) 0 ; - short temp4 ; + unsigned short *arg4 = (unsigned short *) 0 ; + unsigned short temp4 ; char *result = 0 ; (void)jenv; @@ -4628,8 +4840,8 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsN result = (char *)(arg1)->dnsNaptrSrv((char const *)arg2,(char const *)arg3,arg4); if(result) jresult = jenv->NewStringUTF((const char *)result); { - jshort jvalue = (jshort)temp4; - jenv->SetShortArrayRegion(jarg4, 0, 1, &jvalue); + jint jvalue = (jint)temp4; + jenv->SetIntArrayRegion(jarg4, 0, 1, &jvalue); } if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); @@ -4639,6 +4851,47 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsN } +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsSrv(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jintArray jarg3) { + jstring jresult = 0 ; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + unsigned short *arg3 = (unsigned short *) 0 ; + unsigned short temp3 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipStack **)&jarg1; + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + { + if (!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); + return 0; + } + if (jenv->GetArrayLength(jarg3) == 0) { + SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); + return 0; + } + arg3 = &temp3; + } + result = (char *)(arg1)->dnsSrv((char const *)arg2,arg3); + if(result) jresult = jenv->NewStringUTF((const char *)result); + { + jint jvalue = (jint)temp3; + jenv->SetIntArrayRegion(jarg3, 0, 1, &jvalue); + } + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + + delete [] result; + return jresult; +} + + SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1isValid(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { jboolean jresult = 0 ; SipStack *arg1 = (SipStack *) 0 ; @@ -5484,6 +5737,124 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_XcapStack_1st } +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_new_1RPData(JNIEnv *jenv, jclass jcls) { + jlong jresult = 0 ; + RPData *result = 0 ; + + (void)jenv; + (void)jcls; + result = (RPData *)new RPData(); + *(RPData **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_delete_1RPData(JNIEnv *jenv, jclass jcls, jlong jarg1) { + RPData *arg1 = (RPData *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(RPData **)&jarg1; + delete arg1; +} + + +SWIGEXPORT jint JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_RPData_1getType(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jint jresult = 0 ; + RPData *arg1 = (RPData *) 0 ; + twrap_rpdata_type_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(RPData **)&jarg1; + result = (twrap_rpdata_type_t)(arg1)->getType(); + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_RPData_1getPayloadLength(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + RPData *arg1 = (RPData *) 0 ; + unsigned int result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(RPData **)&jarg1; + result = (unsigned int)(arg1)->getPayloadLength(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_RPData_1getPayload(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jbyteArray jarg2, jlong jarg3) { + jlong jresult = 0 ; + RPData *arg1 = (RPData *) 0 ; + void *arg2 = (void *) 0 ; + unsigned int arg3 ; + unsigned int result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(RPData **)&jarg1; + + arg2 = jenv->GetDirectBufferAddress(jarg2); + + arg3 = (unsigned int)jarg3; + result = (unsigned int)(arg1)->getPayload(arg2,arg3); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SMSEncoder_1encodeSubmit(JNIEnv *jenv, jclass jcls, jint jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jlong jresult = 0 ; + int arg1 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + RPData *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (int)jarg1; + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (RPData *)SMSEncoder::encodeSubmit(arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + *(RPData **)&jresult = result; + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_delete_1SMSEncoder(JNIEnv *jenv, jclass jcls, jlong jarg1) { + SMSEncoder *arg1 = (SMSEncoder *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(SMSEncoder **)&jarg1; + delete arg1; +} + + SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGDialogEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; diff --git a/trunk/bindings/java/android/tsip_invite_event_type_t.java b/trunk/bindings/java/android/tsip_invite_event_type_t.java index 5a5bfc7a..64f036db 100644 --- a/trunk/bindings/java/android/tsip_invite_event_type_t.java +++ b/trunk/bindings/java/android/tsip_invite_event_type_t.java @@ -15,6 +15,7 @@ public enum tsip_invite_event_type_t { tsip_o_ect_ok, tsip_o_ect_nok, tsip_i_ect, + tsip_m_early_media, tsip_m_local_hold_ok, tsip_m_local_hold_nok, tsip_m_local_resume_ok, diff --git a/trunk/bindings/java/android/twrap_rpdata_type_t.java b/trunk/bindings/java/android/twrap_rpdata_type_t.java new file mode 100644 index 00000000..208b1215 --- /dev/null +++ b/trunk/bindings/java/android/twrap_rpdata_type_t.java @@ -0,0 +1,55 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.39 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package org.doubango.tinyWRAP; + +public enum twrap_rpdata_type_t { + twrap_rpdata_type_sms_none, + twrap_rpdata_type_sms_submit, + twrap_rpdata_type_sms_deliver, + twrap_rpdata_type_sms_status_report, + twrap_rpdata_type_sms_command; + + public final int swigValue() { + return swigValue; + } + + public static twrap_rpdata_type_t swigToEnum(int swigValue) { + twrap_rpdata_type_t[] swigValues = twrap_rpdata_type_t.class.getEnumConstants(); + if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue) + return swigValues[swigValue]; + for (twrap_rpdata_type_t swigEnum : swigValues) + if (swigEnum.swigValue == swigValue) + return swigEnum; + throw new IllegalArgumentException("No enum " + twrap_rpdata_type_t.class + " with value " + swigValue); + } + + @SuppressWarnings("unused") + private twrap_rpdata_type_t() { + this.swigValue = SwigNext.next++; + } + + @SuppressWarnings("unused") + private twrap_rpdata_type_t(int swigValue) { + this.swigValue = swigValue; + SwigNext.next = swigValue+1; + } + + @SuppressWarnings("unused") + private twrap_rpdata_type_t(twrap_rpdata_type_t swigEnum) { + this.swigValue = swigEnum.swigValue; + SwigNext.next = this.swigValue+1; + } + + private final int swigValue; + + private static class SwigNext { + private static int next = 0; + } +} + diff --git a/trunk/bindings/java/tdav_codec_id_t.java b/trunk/bindings/java/tdav_codec_id_t.java index f81a6143..594b31bb 100644 --- a/trunk/bindings/java/tdav_codec_id_t.java +++ b/trunk/bindings/java/tdav_codec_id_t.java @@ -20,6 +20,9 @@ public enum tdav_codec_id_t { tdav_codec_id_speex_nb(0x00000001 << 8), tdav_codec_id_speex_wb(0x00000001 << 9), tdav_codec_id_speex_uwb(0x00000001 << 10), + tdav_codec_id_bv16(0x00000001 << 11), + tdav_codec_id_bv32(0x00000001 << 12), + tdav_codec_id_evrc(0x00000001 << 13), tdav_codec_id_h261(0x00010000 << 0), tdav_codec_id_h263(0x00010000 << 1), tdav_codec_id_h263p(0x00010000 << 2), diff --git a/trunk/bindings/java/tinyWRAPJNI.java b/trunk/bindings/java/tinyWRAPJNI.java index 16b1940c..052a001e 100644 --- a/trunk/bindings/java/tinyWRAPJNI.java +++ b/trunk/bindings/java/tinyWRAPJNI.java @@ -19,6 +19,13 @@ class tinyWRAPJNI { public final static native void delete_SipUri(long jarg1); public final static native boolean SipUri_isValid__SWIG_0(String jarg1); public final static native boolean SipUri_isValid__SWIG_1(long jarg1, SipUri jarg1_); + public final static native String SipUri_getScheme(long jarg1, SipUri jarg1_); + public final static native String SipUri_getHost(long jarg1, SipUri jarg1_); + public final static native int SipUri_getPort(long jarg1, SipUri jarg1_); + public final static native String SipUri_getUserName(long jarg1, SipUri jarg1_); + public final static native String SipUri_getPassword(long jarg1, SipUri jarg1_); + public final static native String SipUri_getDisplayName(long jarg1, SipUri jarg1_); + public final static native String SipUri_getParamValue(long jarg1, SipUri jarg1_, String jarg2); public final static native long new_SipMessage(); public final static native void delete_SipMessage(long jarg1); public final static native String SipMessage_getSipHeaderValue__SWIG_0(long jarg1, SipMessage jarg1_, String jarg2, long jarg3); @@ -197,16 +204,21 @@ class tinyWRAPJNI { public final static native boolean SipStack_setIMPI(long jarg1, SipStack jarg1_, String jarg2); public final static native boolean SipStack_setIMPU(long jarg1, SipStack jarg1_, String jarg2); public final static native boolean SipStack_setPassword(long jarg1, SipStack jarg1_, String jarg2); - public final static native boolean SipStack_setProxyCSCF(long jarg1, SipStack jarg1_, String jarg2, long jarg3, String jarg4, String jarg5); + public final static native boolean SipStack_setAMF(long jarg1, SipStack jarg1_, String jarg2); + public final static native boolean SipStack_setOperatorId(long jarg1, SipStack jarg1_, String jarg2); + public final static native boolean SipStack_setProxyCSCF(long jarg1, SipStack jarg1_, String jarg2, int jarg3, String jarg4, String jarg5); public final static native boolean SipStack_setLocalIP(long jarg1, SipStack jarg1_, String jarg2); - public final static native boolean SipStack_setLocalPort(long jarg1, SipStack jarg1_, long jarg2); + public final static native boolean SipStack_setLocalPort(long jarg1, SipStack jarg1_, int jarg2); public final static native boolean SipStack_setEarlyIMS(long jarg1, SipStack jarg1_, boolean jarg2); public final static native boolean SipStack_addHeader(long jarg1, SipStack jarg1_, String jarg2, String jarg3); public final static native boolean SipStack_removeHeader(long jarg1, SipStack jarg1_, String jarg2); public final static native boolean SipStack_addDnsServer(long jarg1, SipStack jarg1_, String jarg2); public final static native boolean SipStack_setAoR(long jarg1, SipStack jarg1_, String jarg2, int jarg3); + public final static native boolean SipStack_setSTUNServer(long jarg1, SipStack jarg1_, String jarg2, int jarg3); + public final static native boolean SipStack_setSTUNCred(long jarg1, SipStack jarg1_, String jarg2, String jarg3); public final static native String SipStack_dnsENUM(long jarg1, SipStack jarg1_, String jarg2, String jarg3, String jarg4); - public final static native String SipStack_dnsNaptrSrv(long jarg1, SipStack jarg1_, String jarg2, String jarg3, short[] jarg4); + public final static native String SipStack_dnsNaptrSrv(long jarg1, SipStack jarg1_, String jarg2, String jarg3, int[] jarg4); + public final static native String SipStack_dnsSrv(long jarg1, SipStack jarg1_, String jarg2, int[] jarg3); public final static native boolean SipStack_isValid(long jarg1, SipStack jarg1_); public final static native boolean SipStack_stop(long jarg1, SipStack jarg1_); public final static native void SipStack_setCodecs(int jarg1); @@ -252,6 +264,13 @@ class tinyWRAPJNI { public final static native boolean XcapStack_setTimeout(long jarg1, XcapStack jarg1_, long jarg2); public final static native boolean XcapStack_getDocument(long jarg1, XcapStack jarg1_, String jarg2); public final static native boolean XcapStack_stop(long jarg1, XcapStack jarg1_); + public final static native long new_RPData(); + public final static native void delete_RPData(long jarg1); + public final static native int RPData_getType(long jarg1, RPData jarg1_); + public final static native long RPData_getPayloadLength(long jarg1, RPData jarg1_); + public final static native long RPData_getPayload(long jarg1, RPData jarg1_, java.nio.ByteBuffer jarg2, long jarg3); + public final static native long SMSEncoder_encodeSubmit(int jarg1, String jarg2, String jarg3, String jarg4); + public final static native void delete_SMSEncoder(long jarg1); public final static native long SWIGDialogEventUpcast(long jarg1); public final static native long SWIGStackEventUpcast(long jarg1); public final static native long SWIGCallEventUpcast(long jarg1); diff --git a/trunk/bindings/java/tinyWRAP_wrap.cxx b/trunk/bindings/java/tinyWRAP_wrap.cxx index 6f792146..b0638d5e 100644 --- a/trunk/bindings/java/tinyWRAP_wrap.cxx +++ b/trunk/bindings/java/tinyWRAP_wrap.cxx @@ -425,6 +425,9 @@ namespace Swig { #include "Xcap.h" +#include "SMSEncoder.h" + + /* --------------------------------------------------- * C++ director class methods @@ -1550,6 +1553,118 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1isVal } +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getScheme(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + SipUri *arg1 = (SipUri *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipUri **)&jarg1; + result = (char *)(arg1)->getScheme(); + if(result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getHost(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + SipUri *arg1 = (SipUri *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipUri **)&jarg1; + result = (char *)(arg1)->getHost(); + if(result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getPort(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jint jresult = 0 ; + SipUri *arg1 = (SipUri *) 0 ; + unsigned short result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipUri **)&jarg1; + result = (unsigned short)(arg1)->getPort(); + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getUserName(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + SipUri *arg1 = (SipUri *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipUri **)&jarg1; + result = (char *)(arg1)->getUserName(); + if(result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getPassword(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + SipUri *arg1 = (SipUri *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipUri **)&jarg1; + result = (char *)(arg1)->getPassword(); + if(result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getDisplayName(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + SipUri *arg1 = (SipUri *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipUri **)&jarg1; + result = (char *)(arg1)->getDisplayName(); + if(result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getParamValue(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + jstring jresult = 0 ; + SipUri *arg1 = (SipUri *) 0 ; + char *arg2 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipUri **)&jarg1; + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (char *)(arg1)->getParamValue((char const *)arg2); + if(result) jresult = jenv->NewStringUTF((const char *)result); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_new_1SipMessage(JNIEnv *jenv, jclass jcls) { jlong jresult = 0 ; SipMessage *result = 0 ; @@ -4363,11 +4478,55 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1set } -SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setProxyCSCF(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jlong jarg3, jstring jarg4, jstring jarg5) { +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setAMF(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { jboolean jresult = 0 ; SipStack *arg1 = (SipStack *) 0 ; char *arg2 = (char *) 0 ; - unsigned int arg3 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipStack **)&jarg1; + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (bool)(arg1)->setAMF((char const *)arg2); + jresult = (jboolean)result; + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setOperatorId(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + jboolean jresult = 0 ; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipStack **)&jarg1; + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (bool)(arg1)->setOperatorId((char const *)arg2); + jresult = (jboolean)result; + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setProxyCSCF(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jint jarg3, jstring jarg4, jstring jarg5) { + jboolean jresult = 0 ; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + unsigned short arg3 ; char *arg4 = (char *) 0 ; char *arg5 = (char *) 0 ; bool result; @@ -4381,7 +4540,7 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1set arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); if (!arg2) return 0; } - arg3 = (unsigned int)jarg3; + arg3 = (unsigned short)jarg3; arg4 = 0; if (jarg4) { arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); @@ -4423,17 +4582,17 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1set } -SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setLocalPort(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setLocalPort(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2) { jboolean jresult = 0 ; SipStack *arg1 = (SipStack *) 0 ; - unsigned int arg2 ; + unsigned short arg2 ; bool result; (void)jenv; (void)jcls; (void)jarg1_; arg1 = *(SipStack **)&jarg1; - arg2 = (unsigned int)jarg2; + arg2 = (unsigned short)jarg2; result = (bool)(arg1)->setLocalPort(arg2); jresult = (jboolean)result; return jresult; @@ -4554,6 +4713,59 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1set } +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setSTUNServer(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jint jarg3) { + jboolean jresult = 0 ; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + unsigned short arg3 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipStack **)&jarg1; + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = (unsigned short)jarg3; + result = (bool)(arg1)->setSTUNServer((char const *)arg2,arg3); + jresult = (jboolean)result; + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setSTUNCred(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3) { + jboolean jresult = 0 ; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipStack **)&jarg1; + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (bool)(arg1)->setSTUNCred((char const *)arg2,(char const *)arg3); + jresult = (jboolean)result; + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsENUM(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4) { jstring jresult = 0 ; SipStack *arg1 = (SipStack *) 0 ; @@ -4591,13 +4803,13 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsE } -SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsNaptrSrv(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jshortArray jarg4) { +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsNaptrSrv(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jintArray jarg4) { jstring jresult = 0 ; SipStack *arg1 = (SipStack *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; - short *arg4 = (short *) 0 ; - short temp4 ; + unsigned short *arg4 = (unsigned short *) 0 ; + unsigned short temp4 ; char *result = 0 ; (void)jenv; @@ -4628,8 +4840,8 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsN result = (char *)(arg1)->dnsNaptrSrv((char const *)arg2,(char const *)arg3,arg4); if(result) jresult = jenv->NewStringUTF((const char *)result); { - jshort jvalue = (jshort)temp4; - jenv->SetShortArrayRegion(jarg4, 0, 1, &jvalue); + jint jvalue = (jint)temp4; + jenv->SetIntArrayRegion(jarg4, 0, 1, &jvalue); } if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); @@ -4639,6 +4851,47 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsN } +SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsSrv(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jintArray jarg3) { + jstring jresult = 0 ; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + unsigned short *arg3 = (unsigned short *) 0 ; + unsigned short temp3 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(SipStack **)&jarg1; + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + { + if (!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); + return 0; + } + if (jenv->GetArrayLength(jarg3) == 0) { + SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); + return 0; + } + arg3 = &temp3; + } + result = (char *)(arg1)->dnsSrv((char const *)arg2,arg3); + if(result) jresult = jenv->NewStringUTF((const char *)result); + { + jint jvalue = (jint)temp3; + jenv->SetIntArrayRegion(jarg3, 0, 1, &jvalue); + } + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + + delete [] result; + return jresult; +} + + SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1isValid(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { jboolean jresult = 0 ; SipStack *arg1 = (SipStack *) 0 ; @@ -5484,6 +5737,124 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_XcapStack_1st } +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_new_1RPData(JNIEnv *jenv, jclass jcls) { + jlong jresult = 0 ; + RPData *result = 0 ; + + (void)jenv; + (void)jcls; + result = (RPData *)new RPData(); + *(RPData **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_delete_1RPData(JNIEnv *jenv, jclass jcls, jlong jarg1) { + RPData *arg1 = (RPData *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(RPData **)&jarg1; + delete arg1; +} + + +SWIGEXPORT jint JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_RPData_1getType(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jint jresult = 0 ; + RPData *arg1 = (RPData *) 0 ; + twrap_rpdata_type_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(RPData **)&jarg1; + result = (twrap_rpdata_type_t)(arg1)->getType(); + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_RPData_1getPayloadLength(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + RPData *arg1 = (RPData *) 0 ; + unsigned int result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(RPData **)&jarg1; + result = (unsigned int)(arg1)->getPayloadLength(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_RPData_1getPayload(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jbyteArray jarg2, jlong jarg3) { + jlong jresult = 0 ; + RPData *arg1 = (RPData *) 0 ; + void *arg2 = (void *) 0 ; + unsigned int arg3 ; + unsigned int result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(RPData **)&jarg1; + + arg2 = jenv->GetDirectBufferAddress(jarg2); + + arg3 = (unsigned int)jarg3; + result = (unsigned int)(arg1)->getPayload(arg2,arg3); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SMSEncoder_1encodeSubmit(JNIEnv *jenv, jclass jcls, jint jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jlong jresult = 0 ; + int arg1 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + RPData *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (int)jarg1; + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (RPData *)SMSEncoder::encodeSubmit(arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + *(RPData **)&jresult = result; + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_delete_1SMSEncoder(JNIEnv *jenv, jclass jcls, jlong jarg1) { + SMSEncoder *arg1 = (SMSEncoder *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(SMSEncoder **)&jarg1; + delete arg1; +} + + SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGDialogEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; diff --git a/trunk/bindings/java/tsip_invite_event_type_t.java b/trunk/bindings/java/tsip_invite_event_type_t.java index 5a5bfc7a..64f036db 100644 --- a/trunk/bindings/java/tsip_invite_event_type_t.java +++ b/trunk/bindings/java/tsip_invite_event_type_t.java @@ -15,6 +15,7 @@ public enum tsip_invite_event_type_t { tsip_o_ect_ok, tsip_o_ect_nok, tsip_i_ect, + tsip_m_early_media, tsip_m_local_hold_ok, tsip_m_local_hold_nok, tsip_m_local_resume_ok, diff --git a/trunk/bindings/java/twrap_rpdata_type_t.java b/trunk/bindings/java/twrap_rpdata_type_t.java new file mode 100644 index 00000000..208b1215 --- /dev/null +++ b/trunk/bindings/java/twrap_rpdata_type_t.java @@ -0,0 +1,55 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.39 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package org.doubango.tinyWRAP; + +public enum twrap_rpdata_type_t { + twrap_rpdata_type_sms_none, + twrap_rpdata_type_sms_submit, + twrap_rpdata_type_sms_deliver, + twrap_rpdata_type_sms_status_report, + twrap_rpdata_type_sms_command; + + public final int swigValue() { + return swigValue; + } + + public static twrap_rpdata_type_t swigToEnum(int swigValue) { + twrap_rpdata_type_t[] swigValues = twrap_rpdata_type_t.class.getEnumConstants(); + if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue) + return swigValues[swigValue]; + for (twrap_rpdata_type_t swigEnum : swigValues) + if (swigEnum.swigValue == swigValue) + return swigEnum; + throw new IllegalArgumentException("No enum " + twrap_rpdata_type_t.class + " with value " + swigValue); + } + + @SuppressWarnings("unused") + private twrap_rpdata_type_t() { + this.swigValue = SwigNext.next++; + } + + @SuppressWarnings("unused") + private twrap_rpdata_type_t(int swigValue) { + this.swigValue = swigValue; + SwigNext.next = swigValue+1; + } + + @SuppressWarnings("unused") + private twrap_rpdata_type_t(twrap_rpdata_type_t swigEnum) { + this.swigValue = swigEnum.swigValue; + SwigNext.next = this.swigValue+1; + } + + private final int swigValue; + + private static class SwigNext { + private static int next = 0; + } +} + diff --git a/trunk/bindings/perl/tinyWRAP.pm b/trunk/bindings/perl/tinyWRAP.pm index c76db339..512c55bd 100644 --- a/trunk/bindings/perl/tinyWRAP.pm +++ b/trunk/bindings/perl/tinyWRAP.pm @@ -116,6 +116,13 @@ sub DESTROY { } *isValid = *tinyWRAPc::SipUri_isValid; +*getScheme = *tinyWRAPc::SipUri_getScheme; +*getHost = *tinyWRAPc::SipUri_getHost; +*getPort = *tinyWRAPc::SipUri_getPort; +*getUserName = *tinyWRAPc::SipUri_getUserName; +*getPassword = *tinyWRAPc::SipUri_getPassword; +*getDisplayName = *tinyWRAPc::SipUri_getDisplayName; +*getParamValue = *tinyWRAPc::SipUri_getParamValue; sub DISOWN { my $self = shift; my $ptr = tied(%$self); @@ -1081,6 +1088,8 @@ sub DESTROY { *setIMPI = *tinyWRAPc::SipStack_setIMPI; *setIMPU = *tinyWRAPc::SipStack_setIMPU; *setPassword = *tinyWRAPc::SipStack_setPassword; +*setAMF = *tinyWRAPc::SipStack_setAMF; +*setOperatorId = *tinyWRAPc::SipStack_setOperatorId; *setProxyCSCF = *tinyWRAPc::SipStack_setProxyCSCF; *setLocalIP = *tinyWRAPc::SipStack_setLocalIP; *setLocalPort = *tinyWRAPc::SipStack_setLocalPort; @@ -1089,8 +1098,11 @@ sub DESTROY { *removeHeader = *tinyWRAPc::SipStack_removeHeader; *addDnsServer = *tinyWRAPc::SipStack_addDnsServer; *setAoR = *tinyWRAPc::SipStack_setAoR; +*setSTUNServer = *tinyWRAPc::SipStack_setSTUNServer; +*setSTUNCred = *tinyWRAPc::SipStack_setSTUNCred; *dnsENUM = *tinyWRAPc::SipStack_dnsENUM; *dnsNaptrSrv = *tinyWRAPc::SipStack_dnsNaptrSrv; +*dnsSrv = *tinyWRAPc::SipStack_dnsSrv; *isValid = *tinyWRAPc::SipStack_isValid; *stop = *tinyWRAPc::SipStack_stop; *setCodecs = *tinyWRAPc::SipStack_setCodecs; @@ -1314,6 +1326,78 @@ sub ACQUIRE { } +############# Class : tinyWRAP::RPData ############## + +package tinyWRAP::RPData; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( tinyWRAP ); +%OWNER = (); +%ITERATORS = (); +sub new { + my $pkg = shift; + my $self = tinyWRAPc::new_RPData(@_); + bless $self, $pkg if defined($self); +} + +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + tinyWRAPc::delete_RPData($self); + delete $OWNER{$self}; + } +} + +*getType = *tinyWRAPc::RPData_getType; +*getPayloadLength = *tinyWRAPc::RPData_getPayloadLength; +*getPayload = *tinyWRAPc::RPData_getPayload; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : tinyWRAP::SMSEncoder ############## + +package tinyWRAP::SMSEncoder; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( tinyWRAP ); +%OWNER = (); +%ITERATORS = (); +*encodeSubmit = *tinyWRAPc::SMSEncoder_encodeSubmit; +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + tinyWRAPc::delete_SMSEncoder($self); + delete $OWNER{$self}; + } +} + +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + # ------- VARIABLE STUBS -------- package tinyWRAP; @@ -1363,6 +1447,7 @@ package tinyWRAP; *tsip_o_ect_ok = *tinyWRAPc::tsip_o_ect_ok; *tsip_o_ect_nok = *tinyWRAPc::tsip_o_ect_nok; *tsip_i_ect = *tinyWRAPc::tsip_i_ect; +*tsip_m_early_media = *tinyWRAPc::tsip_m_early_media; *tsip_m_local_hold_ok = *tinyWRAPc::tsip_m_local_hold_ok; *tsip_m_local_hold_nok = *tinyWRAPc::tsip_m_local_hold_nok; *tsip_m_local_resume_ok = *tinyWRAPc::tsip_m_local_resume_ok; @@ -1393,6 +1478,9 @@ package tinyWRAP; *tdav_codec_id_speex_nb = *tinyWRAPc::tdav_codec_id_speex_nb; *tdav_codec_id_speex_wb = *tinyWRAPc::tdav_codec_id_speex_wb; *tdav_codec_id_speex_uwb = *tinyWRAPc::tdav_codec_id_speex_uwb; +*tdav_codec_id_bv16 = *tinyWRAPc::tdav_codec_id_bv16; +*tdav_codec_id_bv32 = *tinyWRAPc::tdav_codec_id_bv32; +*tdav_codec_id_evrc = *tinyWRAPc::tdav_codec_id_evrc; *tdav_codec_id_h261 = *tinyWRAPc::tdav_codec_id_h261; *tdav_codec_id_h263 = *tinyWRAPc::tdav_codec_id_h263; *tdav_codec_id_h263p = *tinyWRAPc::tdav_codec_id_h263p; @@ -1405,4 +1493,9 @@ package tinyWRAP; *thttp_event_auth_failed = *tinyWRAPc::thttp_event_auth_failed; *thttp_event_closed = *tinyWRAPc::thttp_event_closed; *thttp_event_transport_error = *tinyWRAPc::thttp_event_transport_error; +*twrap_rpdata_type_sms_none = *tinyWRAPc::twrap_rpdata_type_sms_none; +*twrap_rpdata_type_sms_submit = *tinyWRAPc::twrap_rpdata_type_sms_submit; +*twrap_rpdata_type_sms_deliver = *tinyWRAPc::twrap_rpdata_type_sms_deliver; +*twrap_rpdata_type_sms_status_report = *tinyWRAPc::twrap_rpdata_type_sms_status_report; +*twrap_rpdata_type_sms_command = *tinyWRAPc::twrap_rpdata_type_sms_command; 1; diff --git a/trunk/bindings/perl/tinyWRAP_wrap.cxx b/trunk/bindings/perl/tinyWRAP_wrap.cxx index 8478d120..de12c3b0 100644 --- a/trunk/bindings/perl/tinyWRAP_wrap.cxx +++ b/trunk/bindings/perl/tinyWRAP_wrap.cxx @@ -1510,40 +1510,43 @@ SWIG_Perl_SetModule(swig_module_info *module) { #define SWIGTYPE_p_ProxyVideoProducer swig_types[12] #define SWIGTYPE_p_PublicationEvent swig_types[13] #define SWIGTYPE_p_PublicationSession swig_types[14] -#define SWIGTYPE_p_RegistrationEvent swig_types[15] -#define SWIGTYPE_p_RegistrationSession swig_types[16] -#define SWIGTYPE_p_SafeObject swig_types[17] -#define SWIGTYPE_p_SipCallback swig_types[18] -#define SWIGTYPE_p_SipEvent swig_types[19] -#define SWIGTYPE_p_SipMessage swig_types[20] -#define SWIGTYPE_p_SipSession swig_types[21] -#define SWIGTYPE_p_SipStack swig_types[22] -#define SWIGTYPE_p_SipUri swig_types[23] -#define SWIGTYPE_p_StackEvent swig_types[24] -#define SWIGTYPE_p_SubscriptionEvent swig_types[25] -#define SWIGTYPE_p_SubscriptionSession swig_types[26] -#define SWIGTYPE_p_XcapCallback swig_types[27] -#define SWIGTYPE_p_XcapEvent swig_types[28] -#define SWIGTYPE_p_XcapMessage swig_types[29] -#define SWIGTYPE_p_XcapSelector swig_types[30] -#define SWIGTYPE_p_XcapStack swig_types[31] -#define SWIGTYPE_p_char swig_types[32] -#define SWIGTYPE_p_short swig_types[33] -#define SWIGTYPE_p_tdav_codec_id_e swig_types[34] -#define SWIGTYPE_p_thttp_event_type_e swig_types[35] -#define SWIGTYPE_p_tmedia_chroma_e swig_types[36] -#define SWIGTYPE_p_tmedia_qos_strength_e swig_types[37] -#define SWIGTYPE_p_tmedia_qos_stype_e swig_types[38] -#define SWIGTYPE_p_tsip_event_type_e swig_types[39] -#define SWIGTYPE_p_tsip_invite_event_type_e swig_types[40] -#define SWIGTYPE_p_tsip_message_event_type_e swig_types[41] -#define SWIGTYPE_p_tsip_options_event_type_e swig_types[42] -#define SWIGTYPE_p_tsip_publish_event_type_e swig_types[43] -#define SWIGTYPE_p_tsip_register_event_type_e swig_types[44] -#define SWIGTYPE_p_tsip_subscribe_event_type_e swig_types[45] -#define SWIGTYPE_p_tsk_list_t swig_types[46] -static swig_type_info *swig_types[48]; -static swig_module_info swig_module = {swig_types, 47, 0, 0, 0, 0}; +#define SWIGTYPE_p_RPData swig_types[15] +#define SWIGTYPE_p_RegistrationEvent swig_types[16] +#define SWIGTYPE_p_RegistrationSession swig_types[17] +#define SWIGTYPE_p_SMSEncoder swig_types[18] +#define SWIGTYPE_p_SafeObject swig_types[19] +#define SWIGTYPE_p_SipCallback swig_types[20] +#define SWIGTYPE_p_SipEvent swig_types[21] +#define SWIGTYPE_p_SipMessage swig_types[22] +#define SWIGTYPE_p_SipSession swig_types[23] +#define SWIGTYPE_p_SipStack swig_types[24] +#define SWIGTYPE_p_SipUri swig_types[25] +#define SWIGTYPE_p_StackEvent swig_types[26] +#define SWIGTYPE_p_SubscriptionEvent swig_types[27] +#define SWIGTYPE_p_SubscriptionSession swig_types[28] +#define SWIGTYPE_p_XcapCallback swig_types[29] +#define SWIGTYPE_p_XcapEvent swig_types[30] +#define SWIGTYPE_p_XcapMessage swig_types[31] +#define SWIGTYPE_p_XcapSelector swig_types[32] +#define SWIGTYPE_p_XcapStack swig_types[33] +#define SWIGTYPE_p_char swig_types[34] +#define SWIGTYPE_p_tdav_codec_id_e swig_types[35] +#define SWIGTYPE_p_thttp_event_type_e swig_types[36] +#define SWIGTYPE_p_tmedia_chroma_e swig_types[37] +#define SWIGTYPE_p_tmedia_qos_strength_e swig_types[38] +#define SWIGTYPE_p_tmedia_qos_stype_e swig_types[39] +#define SWIGTYPE_p_tsip_event_type_e swig_types[40] +#define SWIGTYPE_p_tsip_invite_event_type_e swig_types[41] +#define SWIGTYPE_p_tsip_message_event_type_e swig_types[42] +#define SWIGTYPE_p_tsip_options_event_type_e swig_types[43] +#define SWIGTYPE_p_tsip_publish_event_type_e swig_types[44] +#define SWIGTYPE_p_tsip_register_event_type_e swig_types[45] +#define SWIGTYPE_p_tsip_subscribe_event_type_e swig_types[46] +#define SWIGTYPE_p_tsk_list_t swig_types[47] +#define SWIGTYPE_p_twrap_rpdata_type_e swig_types[48] +#define SWIGTYPE_p_unsigned_short swig_types[49] +static swig_type_info *swig_types[51]; +static swig_module_info swig_module = {swig_types, 50, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) @@ -1680,14 +1683,24 @@ SWIG_From_bool SWIG_PERL_DECL_ARGS_1(bool value) } -#include -#if !defined(SWIG_NO_LLONG_MAX) -# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) -# define LLONG_MAX __LONG_LONG_MAX__ -# define LLONG_MIN (-LLONG_MAX - 1LL) -# define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) -# endif -#endif +SWIGINTERNINLINE SV * +SWIG_FromCharPtrAndSize(const char* carray, size_t size) +{ + SV *obj = sv_newmortal(); + if (carray) { + sv_setpvn(obj, carray, size); + } else { + sv_setsv(obj, &PL_sv_undef); + } + return obj; +} + + +SWIGINTERNINLINE SV * +SWIG_FromCharPtr(const char *cptr) +{ + return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); +} SWIGINTERN int @@ -1719,6 +1732,32 @@ SWIG_AsVal_double SWIG_PERL_DECL_ARGS_2(SV *obj, double *val) } +SWIGINTERNINLINE SV * +SWIG_From_unsigned_SS_long SWIG_PERL_DECL_ARGS_1(unsigned long value) +{ + SV *obj = sv_newmortal(); + sv_setuv(obj, (UV) value); + return obj; +} + + +SWIGINTERNINLINE SV * +SWIG_From_unsigned_SS_short SWIG_PERL_DECL_ARGS_1(unsigned short value) +{ + return SWIG_From_unsigned_SS_long SWIG_PERL_CALL_ARGS_1(value); +} + + +#include +#if !defined(SWIG_NO_LLONG_MAX) +# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) +# define LLONG_MAX __LONG_LONG_MAX__ +# define LLONG_MIN (-LLONG_MAX - 1LL) +# define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) +# endif +#endif + + #include @@ -1816,35 +1855,6 @@ SWIG_AsVal_unsigned_SS_int SWIG_PERL_DECL_ARGS_2(SV * obj, unsigned int *val) } -SWIGINTERNINLINE SV * -SWIG_FromCharPtrAndSize(const char* carray, size_t size) -{ - SV *obj = sv_newmortal(); - if (carray) { - sv_setpvn(obj, carray, size); - } else { - sv_setsv(obj, &PL_sv_undef); - } - return obj; -} - - -SWIGINTERNINLINE SV * -SWIG_FromCharPtr(const char *cptr) -{ - return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); -} - - -SWIGINTERNINLINE SV * -SWIG_From_unsigned_SS_long SWIG_PERL_DECL_ARGS_1(unsigned long value) -{ - SV *obj = sv_newmortal(); - sv_setuv(obj, (UV) value); - return obj; -} - - SWIGINTERNINLINE SV * SWIG_From_unsigned_SS_int SWIG_PERL_DECL_ARGS_1(unsigned int value) { @@ -1929,8 +1939,27 @@ SWIG_AsVal_int SWIG_PERL_DECL_ARGS_2(SV * obj, int *val) } +SWIGINTERN int +SWIG_AsVal_unsigned_SS_short SWIG_PERL_DECL_ARGS_2(SV * obj, unsigned short *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long SWIG_PERL_CALL_ARGS_2(obj, &v); + if (SWIG_IsOK(res)) { + if ((v > USHRT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< unsigned short >(v); + } + } + return res; +} + + #include "Xcap.h" + +#include "SMSEncoder.h" + #ifdef __cplusplus extern "C" { #endif @@ -2335,6 +2364,213 @@ XS(_wrap_SipUri_isValid) { } +XS(_wrap_SipUri_getScheme) { + { + SipUri *arg1 = (SipUri *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: SipUri_getScheme(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SipUri, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipUri_getScheme" "', argument " "1"" of type '" "SipUri *""'"); + } + arg1 = reinterpret_cast< SipUri * >(argp1); + result = (char *)(arg1)->getScheme(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_SipUri_getHost) { + { + SipUri *arg1 = (SipUri *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: SipUri_getHost(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SipUri, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipUri_getHost" "', argument " "1"" of type '" "SipUri *""'"); + } + arg1 = reinterpret_cast< SipUri * >(argp1); + result = (char *)(arg1)->getHost(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_SipUri_getPort) { + { + SipUri *arg1 = (SipUri *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + unsigned short result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: SipUri_getPort(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SipUri, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipUri_getPort" "', argument " "1"" of type '" "SipUri *""'"); + } + arg1 = reinterpret_cast< SipUri * >(argp1); + result = (unsigned short)(arg1)->getPort(); + ST(argvi) = SWIG_From_unsigned_SS_short SWIG_PERL_CALL_ARGS_1(static_cast< unsigned short >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_SipUri_getUserName) { + { + SipUri *arg1 = (SipUri *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: SipUri_getUserName(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SipUri, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipUri_getUserName" "', argument " "1"" of type '" "SipUri *""'"); + } + arg1 = reinterpret_cast< SipUri * >(argp1); + result = (char *)(arg1)->getUserName(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_SipUri_getPassword) { + { + SipUri *arg1 = (SipUri *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: SipUri_getPassword(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SipUri, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipUri_getPassword" "', argument " "1"" of type '" "SipUri *""'"); + } + arg1 = reinterpret_cast< SipUri * >(argp1); + result = (char *)(arg1)->getPassword(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_SipUri_getDisplayName) { + { + SipUri *arg1 = (SipUri *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: SipUri_getDisplayName(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SipUri, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipUri_getDisplayName" "', argument " "1"" of type '" "SipUri *""'"); + } + arg1 = reinterpret_cast< SipUri * >(argp1); + result = (char *)(arg1)->getDisplayName(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_SipUri_getParamValue) { + { + SipUri *arg1 = (SipUri *) 0 ; + char *arg2 = (char *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: SipUri_getParamValue(self,pname);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SipUri, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipUri_getParamValue" "', argument " "1"" of type '" "SipUri *""'"); + } + arg1 = reinterpret_cast< SipUri * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SipUri_getParamValue" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)(arg1)->getParamValue((char const *)arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + XS(_wrap_new_SipMessage) { { int argvi = 0; @@ -7284,11 +7520,89 @@ XS(_wrap_SipStack_setPassword) { } +XS(_wrap_SipStack_setAMF) { + { + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: SipStack_setAMF(self,amf);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SipStack, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipStack_setAMF" "', argument " "1"" of type '" "SipStack *""'"); + } + arg1 = reinterpret_cast< SipStack * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SipStack_setAMF" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (bool)(arg1)->setAMF((char const *)arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_SipStack_setOperatorId) { + { + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: SipStack_setOperatorId(self,opid);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SipStack, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipStack_setOperatorId" "', argument " "1"" of type '" "SipStack *""'"); + } + arg1 = reinterpret_cast< SipStack * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SipStack_setOperatorId" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (bool)(arg1)->setOperatorId((char const *)arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + XS(_wrap_SipStack_setProxyCSCF) { { SipStack *arg1 = (SipStack *) 0 ; char *arg2 = (char *) 0 ; - unsigned int arg3 ; + unsigned short arg3 ; char *arg4 = (char *) 0 ; char *arg5 = (char *) 0 ; void *argp1 = 0 ; @@ -7296,7 +7610,7 @@ XS(_wrap_SipStack_setProxyCSCF) { int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; - unsigned int val3 ; + unsigned short val3 ; int ecode3 = 0 ; int res4 ; char *buf4 = 0 ; @@ -7321,11 +7635,11 @@ XS(_wrap_SipStack_setProxyCSCF) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SipStack_setProxyCSCF" "', argument " "2"" of type '" "char const *""'"); } arg2 = reinterpret_cast< char * >(buf2); - ecode3 = SWIG_AsVal_unsigned_SS_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3); + ecode3 = SWIG_AsVal_unsigned_SS_short SWIG_PERL_CALL_ARGS_2(ST(2), &val3); if (!SWIG_IsOK(ecode3)) { - SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SipStack_setProxyCSCF" "', argument " "3"" of type '" "unsigned int""'"); + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SipStack_setProxyCSCF" "', argument " "3"" of type '" "unsigned short""'"); } - arg3 = static_cast< unsigned int >(val3); + arg3 = static_cast< unsigned short >(val3); res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SipStack_setProxyCSCF" "', argument " "4"" of type '" "char const *""'"); @@ -7397,10 +7711,10 @@ XS(_wrap_SipStack_setLocalIP) { XS(_wrap_SipStack_setLocalPort) { { SipStack *arg1 = (SipStack *) 0 ; - unsigned int arg2 ; + unsigned short arg2 ; void *argp1 = 0 ; int res1 = 0 ; - unsigned int val2 ; + unsigned short val2 ; int ecode2 = 0 ; int argvi = 0; bool result; @@ -7414,11 +7728,11 @@ XS(_wrap_SipStack_setLocalPort) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipStack_setLocalPort" "', argument " "1"" of type '" "SipStack *""'"); } arg1 = reinterpret_cast< SipStack * >(argp1); - ecode2 = SWIG_AsVal_unsigned_SS_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + ecode2 = SWIG_AsVal_unsigned_SS_short SWIG_PERL_CALL_ARGS_2(ST(1), &val2); if (!SWIG_IsOK(ecode2)) { - SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SipStack_setLocalPort" "', argument " "2"" of type '" "unsigned int""'"); + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SipStack_setLocalPort" "', argument " "2"" of type '" "unsigned short""'"); } - arg2 = static_cast< unsigned int >(val2); + arg2 = static_cast< unsigned short >(val2); result = (bool)(arg1)->setLocalPort(arg2); ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; @@ -7647,6 +7961,105 @@ XS(_wrap_SipStack_setAoR) { } +XS(_wrap_SipStack_setSTUNServer) { + { + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + unsigned short arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + unsigned short val3 ; + int ecode3 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: SipStack_setSTUNServer(self,ip,port);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SipStack, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipStack_setSTUNServer" "', argument " "1"" of type '" "SipStack *""'"); + } + arg1 = reinterpret_cast< SipStack * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SipStack_setSTUNServer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + ecode3 = SWIG_AsVal_unsigned_SS_short SWIG_PERL_CALL_ARGS_2(ST(2), &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SipStack_setSTUNServer" "', argument " "3"" of type '" "unsigned short""'"); + } + arg3 = static_cast< unsigned short >(val3); + result = (bool)(arg1)->setSTUNServer((char const *)arg2,arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + + SWIG_croak_null(); + } +} + + +XS(_wrap_SipStack_setSTUNCred) { + { + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: SipStack_setSTUNCred(self,login,password);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SipStack, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipStack_setSTUNCred" "', argument " "1"" of type '" "SipStack *""'"); + } + arg1 = reinterpret_cast< SipStack * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SipStack_setSTUNCred" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SipStack_setSTUNCred" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (bool)(arg1)->setSTUNCred((char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + XS(_wrap_SipStack_dnsENUM) { { SipStack *arg1 = (SipStack *) 0 ; @@ -7714,7 +8127,7 @@ XS(_wrap_SipStack_dnsNaptrSrv) { SipStack *arg1 = (SipStack *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; - short *arg4 = (short *) 0 ; + unsigned short *arg4 = (unsigned short *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; @@ -7723,7 +8136,7 @@ XS(_wrap_SipStack_dnsNaptrSrv) { int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; - short temp4 ; + unsigned short temp4 ; int res4 = SWIG_TMPOBJ ; int argvi = 0; char *result = 0 ; @@ -7751,10 +8164,10 @@ XS(_wrap_SipStack_dnsNaptrSrv) { result = (char *)(arg1)->dnsNaptrSrv((char const *)arg2,(char const *)arg3,arg4); ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; if (SWIG_IsTmpObj(res4)) { - if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_From_short SWIG_PERL_CALL_ARGS_1((*arg4)); argvi++ ; + if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_From_unsigned_SS_short SWIG_PERL_CALL_ARGS_1((*arg4)); argvi++ ; } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0) : 0; - if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_short, new_flags); argvi++ ; + if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_unsigned_short, new_flags); argvi++ ; } if (alloc2 == SWIG_NEWOBJ) delete[] buf2; @@ -7772,6 +8185,58 @@ XS(_wrap_SipStack_dnsNaptrSrv) { } +XS(_wrap_SipStack_dnsSrv) { + { + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + unsigned short *arg3 = (unsigned short *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + unsigned short temp3 ; + int res3 = SWIG_TMPOBJ ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + arg3 = &temp3; + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: SipStack_dnsSrv(self,service);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SipStack, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipStack_dnsSrv" "', argument " "1"" of type '" "SipStack *""'"); + } + arg1 = reinterpret_cast< SipStack * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SipStack_dnsSrv" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)(arg1)->dnsSrv((char const *)arg2,arg3); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (SWIG_IsTmpObj(res3)) { + if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_From_unsigned_SS_short SWIG_PERL_CALL_ARGS_1((*arg3)); argvi++ ; + } else { + int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0) : 0; + if (argvi >= items) EXTEND(sp,1); ST(argvi) = SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_unsigned_short, new_flags); argvi++ ; + } + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + + delete[] result; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + + SWIG_croak_null(); + } +} + + XS(_wrap_SipStack_isValid) { { SipStack *arg1 = (SipStack *) 0 ; @@ -9513,6 +9978,241 @@ XS(_wrap_XcapStack_stop) { } +XS(_wrap_new_RPData) { + { + int argvi = 0; + RPData *result = 0 ; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: new_RPData();"); + } + result = (RPData *)new RPData(); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RPData, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_RPData) { + { + RPData *arg1 = (RPData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_RPData(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_RPData, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RPData" "', argument " "1"" of type '" "RPData *""'"); + } + arg1 = reinterpret_cast< RPData * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_RPData_getType) { + { + RPData *arg1 = (RPData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + twrap_rpdata_type_t result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: RPData_getType(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_RPData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RPData_getType" "', argument " "1"" of type '" "RPData *""'"); + } + arg1 = reinterpret_cast< RPData * >(argp1); + result = (twrap_rpdata_type_t)(arg1)->getType(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_RPData_getPayloadLength) { + { + RPData *arg1 = (RPData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + unsigned int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: RPData_getPayloadLength(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_RPData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RPData_getPayloadLength" "', argument " "1"" of type '" "RPData *""'"); + } + arg1 = reinterpret_cast< RPData * >(argp1); + result = (unsigned int)(arg1)->getPayloadLength(); + ST(argvi) = SWIG_From_unsigned_SS_int SWIG_PERL_CALL_ARGS_1(static_cast< unsigned int >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_RPData_getPayload) { + { + RPData *arg1 = (RPData *) 0 ; + void *arg2 = (void *) 0 ; + unsigned int arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + unsigned int val3 ; + int ecode3 = 0 ; + int argvi = 0; + unsigned int result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: RPData_getPayload(self,output,maxsize);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_RPData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RPData_getPayload" "', argument " "1"" of type '" "RPData *""'"); + } + arg1 = reinterpret_cast< RPData * >(argp1); + res2 = SWIG_ConvertPtr(ST(1),SWIG_as_voidptrptr(&arg2), 0, 0); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RPData_getPayload" "', argument " "2"" of type '" "void *""'"); + } + ecode3 = SWIG_AsVal_unsigned_SS_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RPData_getPayload" "', argument " "3"" of type '" "unsigned int""'"); + } + arg3 = static_cast< unsigned int >(val3); + result = (unsigned int)(arg1)->getPayload(arg2,arg3); + ST(argvi) = SWIG_From_unsigned_SS_int SWIG_PERL_CALL_ARGS_1(static_cast< unsigned int >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_SMSEncoder_encodeSubmit) { + { + int arg1 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int val1 ; + int ecode1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + RPData *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: SMSEncoder_encodeSubmit(mr,smsc,destination,ascii);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SMSEncoder_encodeSubmit" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SMSEncoder_encodeSubmit" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SMSEncoder_encodeSubmit" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SMSEncoder_encodeSubmit" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (RPData *)SMSEncoder::encodeSubmit(arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RPData, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_SMSEncoder) { + { + SMSEncoder *arg1 = (SMSEncoder *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_SMSEncoder(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SMSEncoder, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SMSEncoder" "', argument " "1"" of type '" "SMSEncoder *""'"); + } + arg1 = reinterpret_cast< SMSEncoder * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ @@ -9576,8 +10276,10 @@ static swig_type_info _swigt__p_ProxyVideoFrame = {"_p_ProxyVideoFrame", "ProxyV static swig_type_info _swigt__p_ProxyVideoProducer = {"_p_ProxyVideoProducer", "ProxyVideoProducer *", 0, 0, (void*)"tinyWRAP::ProxyVideoProducer", 0}; static swig_type_info _swigt__p_PublicationEvent = {"_p_PublicationEvent", "PublicationEvent *", 0, 0, (void*)"tinyWRAP::PublicationEvent", 0}; static swig_type_info _swigt__p_PublicationSession = {"_p_PublicationSession", "PublicationSession *", 0, 0, (void*)"tinyWRAP::PublicationSession", 0}; +static swig_type_info _swigt__p_RPData = {"_p_RPData", "RPData *", 0, 0, (void*)"tinyWRAP::RPData", 0}; static swig_type_info _swigt__p_RegistrationEvent = {"_p_RegistrationEvent", "RegistrationEvent *", 0, 0, (void*)"tinyWRAP::RegistrationEvent", 0}; static swig_type_info _swigt__p_RegistrationSession = {"_p_RegistrationSession", "RegistrationSession *", 0, 0, (void*)"tinyWRAP::RegistrationSession", 0}; +static swig_type_info _swigt__p_SMSEncoder = {"_p_SMSEncoder", "SMSEncoder *", 0, 0, (void*)"tinyWRAP::SMSEncoder", 0}; static swig_type_info _swigt__p_SafeObject = {"_p_SafeObject", "SafeObject *", 0, 0, (void*)"tinyWRAP::SafeObject", 0}; static swig_type_info _swigt__p_SipCallback = {"_p_SipCallback", "SipCallback *", 0, 0, (void*)"tinyWRAP::SipCallback", 0}; static swig_type_info _swigt__p_SipEvent = {"_p_SipEvent", "SipEvent *", 0, 0, (void*)"tinyWRAP::SipEvent", 0}; @@ -9594,7 +10296,6 @@ static swig_type_info _swigt__p_XcapMessage = {"_p_XcapMessage", "XcapMessage *" static swig_type_info _swigt__p_XcapSelector = {"_p_XcapSelector", "XcapSelector *", 0, 0, (void*)"tinyWRAP::XcapSelector", 0}; static swig_type_info _swigt__p_XcapStack = {"_p_XcapStack", "XcapStack *", 0, 0, (void*)"tinyWRAP::XcapStack", 0}; static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; -static swig_type_info _swigt__p_short = {"_p_short", "short *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tdav_codec_id_e = {"_p_tdav_codec_id_e", "enum tdav_codec_id_e *|tdav_codec_id_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_thttp_event_type_e = {"_p_thttp_event_type_e", "enum thttp_event_type_e *|thttp_event_type_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tmedia_chroma_e = {"_p_tmedia_chroma_e", "tmedia_chroma_t *|enum tmedia_chroma_e *", 0, 0, (void*)0, 0}; @@ -9608,6 +10309,8 @@ static swig_type_info _swigt__p_tsip_publish_event_type_e = {"_p_tsip_publish_ev static swig_type_info _swigt__p_tsip_register_event_type_e = {"_p_tsip_register_event_type_e", "enum tsip_register_event_type_e *|tsip_register_event_type_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tsip_subscribe_event_type_e = {"_p_tsip_subscribe_event_type_e", "enum tsip_subscribe_event_type_e *|tsip_subscribe_event_type_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tsk_list_t = {"_p_tsk_list_t", "twrap_xcap_steps_L_t *|tsk_list_t *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_twrap_rpdata_type_e = {"_p_twrap_rpdata_type_e", "enum twrap_rpdata_type_e *|twrap_rpdata_type_t *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_unsigned_short = {"_p_unsigned_short", "unsigned short *", 0, 0, (void*)0, 0}; static swig_type_info *swig_type_initial[] = { &_swigt__p_CallEvent, @@ -9625,8 +10328,10 @@ static swig_type_info *swig_type_initial[] = { &_swigt__p_ProxyVideoProducer, &_swigt__p_PublicationEvent, &_swigt__p_PublicationSession, + &_swigt__p_RPData, &_swigt__p_RegistrationEvent, &_swigt__p_RegistrationSession, + &_swigt__p_SMSEncoder, &_swigt__p_SafeObject, &_swigt__p_SipCallback, &_swigt__p_SipEvent, @@ -9643,7 +10348,6 @@ static swig_type_info *swig_type_initial[] = { &_swigt__p_XcapSelector, &_swigt__p_XcapStack, &_swigt__p_char, - &_swigt__p_short, &_swigt__p_tdav_codec_id_e, &_swigt__p_thttp_event_type_e, &_swigt__p_tmedia_chroma_e, @@ -9657,6 +10361,8 @@ static swig_type_info *swig_type_initial[] = { &_swigt__p_tsip_register_event_type_e, &_swigt__p_tsip_subscribe_event_type_e, &_swigt__p_tsk_list_t, + &_swigt__p_twrap_rpdata_type_e, + &_swigt__p_unsigned_short, }; static swig_cast_info _swigc__p_CallEvent[] = { {&_swigt__p_CallEvent, 0, 0, 0},{0, 0, 0, 0}}; @@ -9674,8 +10380,10 @@ static swig_cast_info _swigc__p_ProxyVideoFrame[] = { {&_swigt__p_ProxyVideoFra static swig_cast_info _swigc__p_ProxyVideoProducer[] = { {&_swigt__p_ProxyVideoProducer, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_PublicationEvent[] = { {&_swigt__p_PublicationEvent, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_PublicationSession[] = { {&_swigt__p_PublicationSession, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_RPData[] = { {&_swigt__p_RPData, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_RegistrationEvent[] = { {&_swigt__p_RegistrationEvent, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_RegistrationSession[] = { {&_swigt__p_RegistrationSession, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_SMSEncoder[] = { {&_swigt__p_SMSEncoder, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_SafeObject[] = { {&_swigt__p_SipStack, _p_SipStackTo_p_SafeObject, 0, 0}, {&_swigt__p_SafeObject, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_SipCallback[] = { {&_swigt__p_SipCallback, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_SipEvent[] = { {&_swigt__p_SipEvent, 0, 0, 0}, {&_swigt__p_CallEvent, _p_CallEventTo_p_SipEvent, 0, 0}, {&_swigt__p_OptionsEvent, _p_OptionsEventTo_p_SipEvent, 0, 0}, {&_swigt__p_DialogEvent, _p_DialogEventTo_p_SipEvent, 0, 0}, {&_swigt__p_PublicationEvent, _p_PublicationEventTo_p_SipEvent, 0, 0}, {&_swigt__p_RegistrationEvent, _p_RegistrationEventTo_p_SipEvent, 0, 0}, {&_swigt__p_SubscriptionEvent, _p_SubscriptionEventTo_p_SipEvent, 0, 0}, {&_swigt__p_StackEvent, _p_StackEventTo_p_SipEvent, 0, 0}, {&_swigt__p_MessagingEvent, _p_MessagingEventTo_p_SipEvent, 0, 0},{0, 0, 0, 0}}; @@ -9692,7 +10400,6 @@ static swig_cast_info _swigc__p_XcapMessage[] = { {&_swigt__p_XcapMessage, 0, 0 static swig_cast_info _swigc__p_XcapSelector[] = { {&_swigt__p_XcapSelector, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_XcapStack[] = { {&_swigt__p_XcapStack, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; -static swig_cast_info _swigc__p_short[] = { {&_swigt__p_short, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tdav_codec_id_e[] = { {&_swigt__p_tdav_codec_id_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_thttp_event_type_e[] = { {&_swigt__p_thttp_event_type_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tmedia_chroma_e[] = { {&_swigt__p_tmedia_chroma_e, 0, 0, 0},{0, 0, 0, 0}}; @@ -9706,6 +10413,8 @@ static swig_cast_info _swigc__p_tsip_publish_event_type_e[] = { {&_swigt__p_tsi static swig_cast_info _swigc__p_tsip_register_event_type_e[] = { {&_swigt__p_tsip_register_event_type_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tsip_subscribe_event_type_e[] = { {&_swigt__p_tsip_subscribe_event_type_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tsk_list_t[] = { {&_swigt__p_tsk_list_t, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_twrap_rpdata_type_e[] = { {&_swigt__p_twrap_rpdata_type_e, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_unsigned_short[] = { {&_swigt__p_unsigned_short, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info *swig_cast_initial[] = { _swigc__p_CallEvent, @@ -9723,8 +10432,10 @@ static swig_cast_info *swig_cast_initial[] = { _swigc__p_ProxyVideoProducer, _swigc__p_PublicationEvent, _swigc__p_PublicationSession, + _swigc__p_RPData, _swigc__p_RegistrationEvent, _swigc__p_RegistrationSession, + _swigc__p_SMSEncoder, _swigc__p_SafeObject, _swigc__p_SipCallback, _swigc__p_SipEvent, @@ -9741,7 +10452,6 @@ static swig_cast_info *swig_cast_initial[] = { _swigc__p_XcapSelector, _swigc__p_XcapStack, _swigc__p_char, - _swigc__p_short, _swigc__p_tdav_codec_id_e, _swigc__p_thttp_event_type_e, _swigc__p_tmedia_chroma_e, @@ -9755,6 +10465,8 @@ static swig_cast_info *swig_cast_initial[] = { _swigc__p_tsip_register_event_type_e, _swigc__p_tsip_subscribe_event_type_e, _swigc__p_tsk_list_t, + _swigc__p_twrap_rpdata_type_e, + _swigc__p_unsigned_short, }; @@ -9779,6 +10491,13 @@ static swig_command_info swig_commands[] = { {"tinyWRAPc::new_SipUri", _wrap_new_SipUri}, {"tinyWRAPc::delete_SipUri", _wrap_delete_SipUri}, {"tinyWRAPc::SipUri_isValid", _wrap_SipUri_isValid}, +{"tinyWRAPc::SipUri_getScheme", _wrap_SipUri_getScheme}, +{"tinyWRAPc::SipUri_getHost", _wrap_SipUri_getHost}, +{"tinyWRAPc::SipUri_getPort", _wrap_SipUri_getPort}, +{"tinyWRAPc::SipUri_getUserName", _wrap_SipUri_getUserName}, +{"tinyWRAPc::SipUri_getPassword", _wrap_SipUri_getPassword}, +{"tinyWRAPc::SipUri_getDisplayName", _wrap_SipUri_getDisplayName}, +{"tinyWRAPc::SipUri_getParamValue", _wrap_SipUri_getParamValue}, {"tinyWRAPc::new_SipMessage", _wrap_new_SipMessage}, {"tinyWRAPc::delete_SipMessage", _wrap_delete_SipMessage}, {"tinyWRAPc::SipMessage_getSipHeaderValue", _wrap_SipMessage_getSipHeaderValue}, @@ -9919,6 +10638,8 @@ static swig_command_info swig_commands[] = { {"tinyWRAPc::SipStack_setIMPI", _wrap_SipStack_setIMPI}, {"tinyWRAPc::SipStack_setIMPU", _wrap_SipStack_setIMPU}, {"tinyWRAPc::SipStack_setPassword", _wrap_SipStack_setPassword}, +{"tinyWRAPc::SipStack_setAMF", _wrap_SipStack_setAMF}, +{"tinyWRAPc::SipStack_setOperatorId", _wrap_SipStack_setOperatorId}, {"tinyWRAPc::SipStack_setProxyCSCF", _wrap_SipStack_setProxyCSCF}, {"tinyWRAPc::SipStack_setLocalIP", _wrap_SipStack_setLocalIP}, {"tinyWRAPc::SipStack_setLocalPort", _wrap_SipStack_setLocalPort}, @@ -9927,8 +10648,11 @@ static swig_command_info swig_commands[] = { {"tinyWRAPc::SipStack_removeHeader", _wrap_SipStack_removeHeader}, {"tinyWRAPc::SipStack_addDnsServer", _wrap_SipStack_addDnsServer}, {"tinyWRAPc::SipStack_setAoR", _wrap_SipStack_setAoR}, +{"tinyWRAPc::SipStack_setSTUNServer", _wrap_SipStack_setSTUNServer}, +{"tinyWRAPc::SipStack_setSTUNCred", _wrap_SipStack_setSTUNCred}, {"tinyWRAPc::SipStack_dnsENUM", _wrap_SipStack_dnsENUM}, {"tinyWRAPc::SipStack_dnsNaptrSrv", _wrap_SipStack_dnsNaptrSrv}, +{"tinyWRAPc::SipStack_dnsSrv", _wrap_SipStack_dnsSrv}, {"tinyWRAPc::SipStack_isValid", _wrap_SipStack_isValid}, {"tinyWRAPc::SipStack_stop", _wrap_SipStack_stop}, {"tinyWRAPc::SipStack_setCodecs", _wrap_SipStack_setCodecs}, @@ -9969,6 +10693,13 @@ static swig_command_info swig_commands[] = { {"tinyWRAPc::XcapStack_setTimeout", _wrap_XcapStack_setTimeout}, {"tinyWRAPc::XcapStack_getDocument", _wrap_XcapStack_getDocument}, {"tinyWRAPc::XcapStack_stop", _wrap_XcapStack_stop}, +{"tinyWRAPc::new_RPData", _wrap_new_RPData}, +{"tinyWRAPc::delete_RPData", _wrap_delete_RPData}, +{"tinyWRAPc::RPData_getType", _wrap_RPData_getType}, +{"tinyWRAPc::RPData_getPayloadLength", _wrap_RPData_getPayloadLength}, +{"tinyWRAPc::RPData_getPayload", _wrap_RPData_getPayload}, +{"tinyWRAPc::SMSEncoder_encodeSubmit", _wrap_SMSEncoder_encodeSubmit}, +{"tinyWRAPc::delete_SMSEncoder", _wrap_delete_SMSEncoder}, {0,0} }; /* ----------------------------------------------------------------------------- @@ -10515,6 +11246,11 @@ XS(SWIG_init) { sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_ect))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tsip_m_early_media", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_m_early_media))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_m_local_hold_ok", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_m_local_hold_ok))); @@ -10665,6 +11401,21 @@ XS(SWIG_init) { sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_speex_uwb))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_bv16", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_bv16))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_bv32", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_bv32))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_evrc", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_evrc))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_h261", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_h261))); @@ -10730,6 +11481,33 @@ XS(SWIG_init) { sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(thttp_event_transport_error))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "twrap_rpdata_type_sms_none", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_rpdata_type_sms_none))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "twrap_rpdata_type_sms_submit", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_rpdata_type_sms_submit))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "twrap_rpdata_type_sms_deliver", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_rpdata_type_sms_deliver))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "twrap_rpdata_type_sms_status_report", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_rpdata_type_sms_status_report))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "twrap_rpdata_type_sms_command", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_rpdata_type_sms_command))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + SWIG_TypeClientData(SWIGTYPE_p_RPData, (void*) "tinyWRAP::RPData"); + SWIG_TypeClientData(SWIGTYPE_p_SMSEncoder, (void*) "tinyWRAP::SMSEncoder"); ST(0) = &PL_sv_yes; XSRETURN(1); } diff --git a/trunk/bindings/python/tinyWRAP.py b/trunk/bindings/python/tinyWRAP.py index b09fca3f..acf87f9d 100644 --- a/trunk/bindings/python/tinyWRAP.py +++ b/trunk/bindings/python/tinyWRAP.py @@ -99,6 +99,13 @@ class SipUri(_object): __swig_destroy__ = _tinyWRAP.delete_SipUri __del__ = lambda self : None; def isValid(self, *args): return _tinyWRAP.SipUri_isValid(self, *args) + def getScheme(self): return _tinyWRAP.SipUri_getScheme(self) + def getHost(self): return _tinyWRAP.SipUri_getHost(self) + def getPort(self): return _tinyWRAP.SipUri_getPort(self) + def getUserName(self): return _tinyWRAP.SipUri_getUserName(self) + def getPassword(self): return _tinyWRAP.SipUri_getPassword(self) + def getDisplayName(self): return _tinyWRAP.SipUri_getDisplayName(self) + def getParamValue(self, *args): return _tinyWRAP.SipUri_getParamValue(self, *args) SipUri_swigregister = _tinyWRAP.SipUri_swigregister SipUri_swigregister(SipUri) @@ -634,6 +641,8 @@ class SipStack(SafeObject): def setIMPI(self, *args): return _tinyWRAP.SipStack_setIMPI(self, *args) def setIMPU(self, *args): return _tinyWRAP.SipStack_setIMPU(self, *args) def setPassword(self, *args): return _tinyWRAP.SipStack_setPassword(self, *args) + def setAMF(self, *args): return _tinyWRAP.SipStack_setAMF(self, *args) + def setOperatorId(self, *args): return _tinyWRAP.SipStack_setOperatorId(self, *args) def setProxyCSCF(self, *args): return _tinyWRAP.SipStack_setProxyCSCF(self, *args) def setLocalIP(self, *args): return _tinyWRAP.SipStack_setLocalIP(self, *args) def setLocalPort(self, *args): return _tinyWRAP.SipStack_setLocalPort(self, *args) @@ -642,8 +651,11 @@ class SipStack(SafeObject): def removeHeader(self, *args): return _tinyWRAP.SipStack_removeHeader(self, *args) def addDnsServer(self, *args): return _tinyWRAP.SipStack_addDnsServer(self, *args) def setAoR(self, *args): return _tinyWRAP.SipStack_setAoR(self, *args) + def setSTUNServer(self, *args): return _tinyWRAP.SipStack_setSTUNServer(self, *args) + def setSTUNCred(self, *args): return _tinyWRAP.SipStack_setSTUNCred(self, *args) def dnsENUM(self, *args): return _tinyWRAP.SipStack_dnsENUM(self, *args) def dnsNaptrSrv(self, *args): return _tinyWRAP.SipStack_dnsNaptrSrv(self, *args) + def dnsSrv(self, *args): return _tinyWRAP.SipStack_dnsSrv(self, *args) def isValid(self): return _tinyWRAP.SipStack_isValid(self) def stop(self): return _tinyWRAP.SipStack_stop(self) __swig_getmethods__["setCodecs"] = lambda x: _tinyWRAP.SipStack_setCodecs @@ -706,6 +718,7 @@ tsip_ao_request = _tinyWRAP.tsip_ao_request tsip_o_ect_ok = _tinyWRAP.tsip_o_ect_ok tsip_o_ect_nok = _tinyWRAP.tsip_o_ect_nok tsip_i_ect = _tinyWRAP.tsip_i_ect +tsip_m_early_media = _tinyWRAP.tsip_m_early_media tsip_m_local_hold_ok = _tinyWRAP.tsip_m_local_hold_ok tsip_m_local_hold_nok = _tinyWRAP.tsip_m_local_hold_nok tsip_m_local_resume_ok = _tinyWRAP.tsip_m_local_resume_ok @@ -736,6 +749,9 @@ tdav_codec_id_ilbc = _tinyWRAP.tdav_codec_id_ilbc tdav_codec_id_speex_nb = _tinyWRAP.tdav_codec_id_speex_nb tdav_codec_id_speex_wb = _tinyWRAP.tdav_codec_id_speex_wb tdav_codec_id_speex_uwb = _tinyWRAP.tdav_codec_id_speex_uwb +tdav_codec_id_bv16 = _tinyWRAP.tdav_codec_id_bv16 +tdav_codec_id_bv32 = _tinyWRAP.tdav_codec_id_bv32 +tdav_codec_id_evrc = _tinyWRAP.tdav_codec_id_evrc tdav_codec_id_h261 = _tinyWRAP.tdav_codec_id_h261 tdav_codec_id_h263 = _tinyWRAP.tdav_codec_id_h263 tdav_codec_id_h263p = _tinyWRAP.tdav_codec_id_h263p @@ -855,5 +871,46 @@ thttp_event_message = _tinyWRAP.thttp_event_message thttp_event_auth_failed = _tinyWRAP.thttp_event_auth_failed thttp_event_closed = _tinyWRAP.thttp_event_closed thttp_event_transport_error = _tinyWRAP.thttp_event_transport_error +twrap_rpdata_type_sms_none = _tinyWRAP.twrap_rpdata_type_sms_none +twrap_rpdata_type_sms_submit = _tinyWRAP.twrap_rpdata_type_sms_submit +twrap_rpdata_type_sms_deliver = _tinyWRAP.twrap_rpdata_type_sms_deliver +twrap_rpdata_type_sms_status_report = _tinyWRAP.twrap_rpdata_type_sms_status_report +twrap_rpdata_type_sms_command = _tinyWRAP.twrap_rpdata_type_sms_command +class RPData(_object): + __swig_setmethods__ = {} + __setattr__ = lambda self, name, value: _swig_setattr(self, RPData, name, value) + __swig_getmethods__ = {} + __getattr__ = lambda self, name: _swig_getattr(self, RPData, name) + __repr__ = _swig_repr + def __init__(self): + this = _tinyWRAP.new_RPData() + try: self.this.append(this) + except: self.this = this + __swig_destroy__ = _tinyWRAP.delete_RPData + __del__ = lambda self : None; + def getType(self): return _tinyWRAP.RPData_getType(self) + def getPayloadLength(self): return _tinyWRAP.RPData_getPayloadLength(self) + def getPayload(self, *args): return _tinyWRAP.RPData_getPayload(self, *args) +RPData_swigregister = _tinyWRAP.RPData_swigregister +RPData_swigregister(RPData) + +class SMSEncoder(_object): + __swig_setmethods__ = {} + __setattr__ = lambda self, name, value: _swig_setattr(self, SMSEncoder, name, value) + __swig_getmethods__ = {} + __getattr__ = lambda self, name: _swig_getattr(self, SMSEncoder, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_getmethods__["encodeSubmit"] = lambda x: _tinyWRAP.SMSEncoder_encodeSubmit + if _newclass:encodeSubmit = staticmethod(_tinyWRAP.SMSEncoder_encodeSubmit) + __swig_destroy__ = _tinyWRAP.delete_SMSEncoder + __del__ = lambda self : None; +SMSEncoder_swigregister = _tinyWRAP.SMSEncoder_swigregister +SMSEncoder_swigregister(SMSEncoder) + +def SMSEncoder_encodeSubmit(*args): + return _tinyWRAP.SMSEncoder_encodeSubmit(*args) +SMSEncoder_encodeSubmit = _tinyWRAP.SMSEncoder_encodeSubmit + diff --git a/trunk/bindings/python/tinyWRAP_wrap.cxx b/trunk/bindings/python/tinyWRAP_wrap.cxx index 6677385a..d408513a 100644 --- a/trunk/bindings/python/tinyWRAP_wrap.cxx +++ b/trunk/bindings/python/tinyWRAP_wrap.cxx @@ -3136,40 +3136,43 @@ namespace Swig { #define SWIGTYPE_p_ProxyVideoProducer swig_types[12] #define SWIGTYPE_p_PublicationEvent swig_types[13] #define SWIGTYPE_p_PublicationSession swig_types[14] -#define SWIGTYPE_p_RegistrationEvent swig_types[15] -#define SWIGTYPE_p_RegistrationSession swig_types[16] -#define SWIGTYPE_p_SafeObject swig_types[17] -#define SWIGTYPE_p_SipCallback swig_types[18] -#define SWIGTYPE_p_SipEvent swig_types[19] -#define SWIGTYPE_p_SipMessage swig_types[20] -#define SWIGTYPE_p_SipSession swig_types[21] -#define SWIGTYPE_p_SipStack swig_types[22] -#define SWIGTYPE_p_SipUri swig_types[23] -#define SWIGTYPE_p_StackEvent swig_types[24] -#define SWIGTYPE_p_SubscriptionEvent swig_types[25] -#define SWIGTYPE_p_SubscriptionSession swig_types[26] -#define SWIGTYPE_p_XcapCallback swig_types[27] -#define SWIGTYPE_p_XcapEvent swig_types[28] -#define SWIGTYPE_p_XcapMessage swig_types[29] -#define SWIGTYPE_p_XcapSelector swig_types[30] -#define SWIGTYPE_p_XcapStack swig_types[31] -#define SWIGTYPE_p_char swig_types[32] -#define SWIGTYPE_p_short swig_types[33] -#define SWIGTYPE_p_tdav_codec_id_e swig_types[34] -#define SWIGTYPE_p_thttp_event_type_e swig_types[35] -#define SWIGTYPE_p_tmedia_chroma_e swig_types[36] -#define SWIGTYPE_p_tmedia_qos_strength_e swig_types[37] -#define SWIGTYPE_p_tmedia_qos_stype_e swig_types[38] -#define SWIGTYPE_p_tsip_event_type_e swig_types[39] -#define SWIGTYPE_p_tsip_invite_event_type_e swig_types[40] -#define SWIGTYPE_p_tsip_message_event_type_e swig_types[41] -#define SWIGTYPE_p_tsip_options_event_type_e swig_types[42] -#define SWIGTYPE_p_tsip_publish_event_type_e swig_types[43] -#define SWIGTYPE_p_tsip_register_event_type_e swig_types[44] -#define SWIGTYPE_p_tsip_subscribe_event_type_e swig_types[45] -#define SWIGTYPE_p_tsk_list_t swig_types[46] -static swig_type_info *swig_types[48]; -static swig_module_info swig_module = {swig_types, 47, 0, 0, 0, 0}; +#define SWIGTYPE_p_RPData swig_types[15] +#define SWIGTYPE_p_RegistrationEvent swig_types[16] +#define SWIGTYPE_p_RegistrationSession swig_types[17] +#define SWIGTYPE_p_SMSEncoder swig_types[18] +#define SWIGTYPE_p_SafeObject swig_types[19] +#define SWIGTYPE_p_SipCallback swig_types[20] +#define SWIGTYPE_p_SipEvent swig_types[21] +#define SWIGTYPE_p_SipMessage swig_types[22] +#define SWIGTYPE_p_SipSession swig_types[23] +#define SWIGTYPE_p_SipStack swig_types[24] +#define SWIGTYPE_p_SipUri swig_types[25] +#define SWIGTYPE_p_StackEvent swig_types[26] +#define SWIGTYPE_p_SubscriptionEvent swig_types[27] +#define SWIGTYPE_p_SubscriptionSession swig_types[28] +#define SWIGTYPE_p_XcapCallback swig_types[29] +#define SWIGTYPE_p_XcapEvent swig_types[30] +#define SWIGTYPE_p_XcapMessage swig_types[31] +#define SWIGTYPE_p_XcapSelector swig_types[32] +#define SWIGTYPE_p_XcapStack swig_types[33] +#define SWIGTYPE_p_char swig_types[34] +#define SWIGTYPE_p_tdav_codec_id_e swig_types[35] +#define SWIGTYPE_p_thttp_event_type_e swig_types[36] +#define SWIGTYPE_p_tmedia_chroma_e swig_types[37] +#define SWIGTYPE_p_tmedia_qos_strength_e swig_types[38] +#define SWIGTYPE_p_tmedia_qos_stype_e swig_types[39] +#define SWIGTYPE_p_tsip_event_type_e swig_types[40] +#define SWIGTYPE_p_tsip_invite_event_type_e swig_types[41] +#define SWIGTYPE_p_tsip_message_event_type_e swig_types[42] +#define SWIGTYPE_p_tsip_options_event_type_e swig_types[43] +#define SWIGTYPE_p_tsip_publish_event_type_e swig_types[44] +#define SWIGTYPE_p_tsip_register_event_type_e swig_types[45] +#define SWIGTYPE_p_tsip_subscribe_event_type_e swig_types[46] +#define SWIGTYPE_p_tsk_list_t swig_types[47] +#define SWIGTYPE_p_twrap_rpdata_type_e swig_types[48] +#define SWIGTYPE_p_unsigned_short swig_types[49] +static swig_type_info *swig_types[51]; +static swig_module_info swig_module = {swig_types, 50, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) @@ -3377,6 +3380,49 @@ SWIGINTERNINLINE PyObject* } +SWIGINTERNINLINE PyObject * +SWIG_FromCharPtrAndSize(const char* carray, size_t size) +{ + if (carray) { + if (size > INT_MAX) { + swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); + return pchar_descriptor ? + SWIG_NewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void(); + } else { +#if PY_VERSION_HEX >= 0x03000000 + return PyUnicode_FromStringAndSize(carray, static_cast< int >(size)); +#else + return PyString_FromStringAndSize(carray, static_cast< int >(size)); +#endif + } + } else { + return SWIG_Py_Void(); + } +} + + +SWIGINTERNINLINE PyObject * +SWIG_FromCharPtr(const char *cptr) +{ + return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); +} + + +SWIGINTERNINLINE PyObject* +SWIG_From_unsigned_SS_long (unsigned long value) +{ + return (value > LONG_MAX) ? + PyLong_FromUnsignedLong(value) : PyInt_FromLong(static_cast< long >(value)); +} + + +SWIGINTERNINLINE PyObject * +SWIG_From_unsigned_SS_short (unsigned short value) +{ + return SWIG_From_unsigned_SS_long (value); +} + + #include #if !defined(SWIG_NO_LLONG_MAX) # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) @@ -3527,42 +3573,6 @@ SWIG_AsVal_unsigned_SS_int (PyObject * obj, unsigned int *val) } -SWIGINTERNINLINE PyObject * -SWIG_FromCharPtrAndSize(const char* carray, size_t size) -{ - if (carray) { - if (size > INT_MAX) { - swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); - return pchar_descriptor ? - SWIG_NewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void(); - } else { -#if PY_VERSION_HEX >= 0x03000000 - return PyUnicode_FromStringAndSize(carray, static_cast< int >(size)); -#else - return PyString_FromStringAndSize(carray, static_cast< int >(size)); -#endif - } - } else { - return SWIG_Py_Void(); - } -} - - -SWIGINTERNINLINE PyObject * -SWIG_FromCharPtr(const char *cptr) -{ - return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); -} - - -SWIGINTERNINLINE PyObject* -SWIG_From_unsigned_SS_long (unsigned long value) -{ - return (value > LONG_MAX) ? - PyLong_FromUnsignedLong(value) : PyInt_FromLong(static_cast< long >(value)); -} - - SWIGINTERNINLINE PyObject * SWIG_From_unsigned_SS_int (unsigned int value) { @@ -3643,9 +3653,28 @@ SWIG_AsVal_int (PyObject * obj, int *val) } +SWIGINTERN int +SWIG_AsVal_unsigned_SS_short (PyObject * obj, unsigned short *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long (obj, &v); + if (SWIG_IsOK(res)) { + if ((v > USHRT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< unsigned short >(v); + } + } + return res; +} + + #include "Xcap.h" +#include "SMSEncoder.h" + + /* --------------------------------------------------- * C++ director class methods @@ -4821,6 +4850,172 @@ fail: } +SWIGINTERN PyObject *_wrap_SipUri_getScheme(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SipUri *arg1 = (SipUri *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:SipUri_getScheme",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SipUri, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipUri_getScheme" "', argument " "1"" of type '" "SipUri *""'"); + } + arg1 = reinterpret_cast< SipUri * >(argp1); + result = (char *)(arg1)->getScheme(); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SipUri_getHost(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SipUri *arg1 = (SipUri *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:SipUri_getHost",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SipUri, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipUri_getHost" "', argument " "1"" of type '" "SipUri *""'"); + } + arg1 = reinterpret_cast< SipUri * >(argp1); + result = (char *)(arg1)->getHost(); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SipUri_getPort(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SipUri *arg1 = (SipUri *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + unsigned short result; + + if (!PyArg_ParseTuple(args,(char *)"O:SipUri_getPort",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SipUri, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipUri_getPort" "', argument " "1"" of type '" "SipUri *""'"); + } + arg1 = reinterpret_cast< SipUri * >(argp1); + result = (unsigned short)(arg1)->getPort(); + resultobj = SWIG_From_unsigned_SS_short(static_cast< unsigned short >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SipUri_getUserName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SipUri *arg1 = (SipUri *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:SipUri_getUserName",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SipUri, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipUri_getUserName" "', argument " "1"" of type '" "SipUri *""'"); + } + arg1 = reinterpret_cast< SipUri * >(argp1); + result = (char *)(arg1)->getUserName(); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SipUri_getPassword(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SipUri *arg1 = (SipUri *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:SipUri_getPassword",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SipUri, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipUri_getPassword" "', argument " "1"" of type '" "SipUri *""'"); + } + arg1 = reinterpret_cast< SipUri * >(argp1); + result = (char *)(arg1)->getPassword(); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SipUri_getDisplayName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SipUri *arg1 = (SipUri *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:SipUri_getDisplayName",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SipUri, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipUri_getDisplayName" "', argument " "1"" of type '" "SipUri *""'"); + } + arg1 = reinterpret_cast< SipUri * >(argp1); + result = (char *)(arg1)->getDisplayName(); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SipUri_getParamValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SipUri *arg1 = (SipUri *) 0 ; + char *arg2 = (char *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:SipUri_getParamValue",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SipUri, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipUri_getParamValue" "', argument " "1"" of type '" "SipUri *""'"); + } + arg1 = reinterpret_cast< SipUri * >(argp1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SipUri_getParamValue" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)(arg1)->getParamValue((char const *)arg2); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + SWIGINTERN PyObject *SipUri_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; @@ -9425,11 +9620,79 @@ fail: } +SWIGINTERN PyObject *_wrap_SipStack_setAMF(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:SipStack_setAMF",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SipStack, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipStack_setAMF" "', argument " "1"" of type '" "SipStack *""'"); + } + arg1 = reinterpret_cast< SipStack * >(argp1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SipStack_setAMF" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (bool)(arg1)->setAMF((char const *)arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SipStack_setOperatorId(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:SipStack_setOperatorId",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SipStack, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipStack_setOperatorId" "', argument " "1"" of type '" "SipStack *""'"); + } + arg1 = reinterpret_cast< SipStack * >(argp1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SipStack_setOperatorId" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (bool)(arg1)->setOperatorId((char const *)arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + SWIGINTERN PyObject *_wrap_SipStack_setProxyCSCF(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SipStack *arg1 = (SipStack *) 0 ; char *arg2 = (char *) 0 ; - unsigned int arg3 ; + unsigned short arg3 ; char *arg4 = (char *) 0 ; char *arg5 = (char *) 0 ; void *argp1 = 0 ; @@ -9437,7 +9700,7 @@ SWIGINTERN PyObject *_wrap_SipStack_setProxyCSCF(PyObject *SWIGUNUSEDPARM(self), int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; - unsigned int val3 ; + unsigned short val3 ; int ecode3 = 0 ; int res4 ; char *buf4 = 0 ; @@ -9463,11 +9726,11 @@ SWIGINTERN PyObject *_wrap_SipStack_setProxyCSCF(PyObject *SWIGUNUSEDPARM(self), SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SipStack_setProxyCSCF" "', argument " "2"" of type '" "char const *""'"); } arg2 = reinterpret_cast< char * >(buf2); - ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3); + ecode3 = SWIG_AsVal_unsigned_SS_short(obj2, &val3); if (!SWIG_IsOK(ecode3)) { - SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SipStack_setProxyCSCF" "', argument " "3"" of type '" "unsigned int""'"); + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SipStack_setProxyCSCF" "', argument " "3"" of type '" "unsigned short""'"); } - arg3 = static_cast< unsigned int >(val3); + arg3 = static_cast< unsigned short >(val3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SipStack_setProxyCSCF" "', argument " "4"" of type '" "char const *""'"); @@ -9529,10 +9792,10 @@ fail: SWIGINTERN PyObject *_wrap_SipStack_setLocalPort(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SipStack *arg1 = (SipStack *) 0 ; - unsigned int arg2 ; + unsigned short arg2 ; void *argp1 = 0 ; int res1 = 0 ; - unsigned int val2 ; + unsigned short val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; @@ -9544,11 +9807,11 @@ SWIGINTERN PyObject *_wrap_SipStack_setLocalPort(PyObject *SWIGUNUSEDPARM(self), SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipStack_setLocalPort" "', argument " "1"" of type '" "SipStack *""'"); } arg1 = reinterpret_cast< SipStack * >(argp1); - ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2); + ecode2 = SWIG_AsVal_unsigned_SS_short(obj1, &val2); if (!SWIG_IsOK(ecode2)) { - SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SipStack_setLocalPort" "', argument " "2"" of type '" "unsigned int""'"); + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SipStack_setLocalPort" "', argument " "2"" of type '" "unsigned short""'"); } - arg2 = static_cast< unsigned int >(val2); + arg2 = static_cast< unsigned short >(val2); result = (bool)(arg1)->setLocalPort(arg2); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; @@ -9745,6 +10008,95 @@ fail: } +SWIGINTERN PyObject *_wrap_SipStack_setSTUNServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + unsigned short arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + unsigned short val3 ; + int ecode3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:SipStack_setSTUNServer",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SipStack, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipStack_setSTUNServer" "', argument " "1"" of type '" "SipStack *""'"); + } + arg1 = reinterpret_cast< SipStack * >(argp1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SipStack_setSTUNServer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + ecode3 = SWIG_AsVal_unsigned_SS_short(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SipStack_setSTUNServer" "', argument " "3"" of type '" "unsigned short""'"); + } + arg3 = static_cast< unsigned short >(val3); + result = (bool)(arg1)->setSTUNServer((char const *)arg2,arg3); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SipStack_setSTUNCred(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:SipStack_setSTUNCred",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SipStack, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipStack_setSTUNCred" "', argument " "1"" of type '" "SipStack *""'"); + } + arg1 = reinterpret_cast< SipStack * >(argp1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SipStack_setSTUNCred" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SipStack_setSTUNCred" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (bool)(arg1)->setSTUNCred((char const *)arg2,(char const *)arg3); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + SWIGINTERN PyObject *_wrap_SipStack_dnsENUM(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SipStack *arg1 = (SipStack *) 0 ; @@ -9809,7 +10161,7 @@ SWIGINTERN PyObject *_wrap_SipStack_dnsNaptrSrv(PyObject *SWIGUNUSEDPARM(self), SipStack *arg1 = (SipStack *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; - short *arg4 = (short *) 0 ; + unsigned short *arg4 = (unsigned short *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; @@ -9818,7 +10170,7 @@ SWIGINTERN PyObject *_wrap_SipStack_dnsNaptrSrv(PyObject *SWIGUNUSEDPARM(self), int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; - short temp4 ; + unsigned short temp4 ; int res4 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; @@ -9845,10 +10197,10 @@ SWIGINTERN PyObject *_wrap_SipStack_dnsNaptrSrv(PyObject *SWIGUNUSEDPARM(self), result = (char *)(arg1)->dnsNaptrSrv((char const *)arg2,(char const *)arg3,arg4); resultobj = SWIG_FromCharPtr((const char *)result); if (SWIG_IsTmpObj(res4)) { - resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_short((*arg4))); + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_unsigned_SS_short((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; - resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_short, new_flags)); + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_unsigned_short, new_flags)); } if (alloc2 == SWIG_NEWOBJ) delete[] buf2; if (alloc3 == SWIG_NEWOBJ) delete[] buf3; @@ -9861,6 +10213,51 @@ fail: } +SWIGINTERN PyObject *_wrap_SipStack_dnsSrv(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SipStack *arg1 = (SipStack *) 0 ; + char *arg2 = (char *) 0 ; + unsigned short *arg3 = (unsigned short *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + unsigned short temp3 ; + int res3 = SWIG_TMPOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char *result = 0 ; + + arg3 = &temp3; + if (!PyArg_ParseTuple(args,(char *)"OO:SipStack_dnsSrv",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SipStack, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SipStack_dnsSrv" "', argument " "1"" of type '" "SipStack *""'"); + } + arg1 = reinterpret_cast< SipStack * >(argp1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SipStack_dnsSrv" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)(arg1)->dnsSrv((char const *)arg2,arg3); + resultobj = SWIG_FromCharPtr((const char *)result); + if (SWIG_IsTmpObj(res3)) { + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_unsigned_SS_short((*arg3))); + } else { + int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_unsigned_short, new_flags)); + } + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + delete[] result; + return resultobj; +fail: + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + SWIGINTERN PyObject *_wrap_SipStack_isValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SipStack *arg1 = (SipStack *) 0 ; @@ -11379,6 +11776,215 @@ SWIGINTERN PyObject *XcapStack_swigregister(PyObject *SWIGUNUSEDPARM(self), PyOb return SWIG_Py_Void(); } +SWIGINTERN PyObject *_wrap_new_RPData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + RPData *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)":new_RPData")) SWIG_fail; + result = (RPData *)new RPData(); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RPData, SWIG_POINTER_NEW | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_delete_RPData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + RPData *arg1 = (RPData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_RPData",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RPData, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RPData" "', argument " "1"" of type '" "RPData *""'"); + } + arg1 = reinterpret_cast< RPData * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RPData_getType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + RPData *arg1 = (RPData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + twrap_rpdata_type_t result; + + if (!PyArg_ParseTuple(args,(char *)"O:RPData_getType",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RPData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RPData_getType" "', argument " "1"" of type '" "RPData *""'"); + } + arg1 = reinterpret_cast< RPData * >(argp1); + result = (twrap_rpdata_type_t)(arg1)->getType(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RPData_getPayloadLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + RPData *arg1 = (RPData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + unsigned int result; + + if (!PyArg_ParseTuple(args,(char *)"O:RPData_getPayloadLength",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RPData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RPData_getPayloadLength" "', argument " "1"" of type '" "RPData *""'"); + } + arg1 = reinterpret_cast< RPData * >(argp1); + result = (unsigned int)(arg1)->getPayloadLength(); + resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RPData_getPayload(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + RPData *arg1 = (RPData *) 0 ; + void *arg2 = (void *) 0 ; + unsigned int arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + unsigned int val3 ; + int ecode3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + unsigned int result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:RPData_getPayload",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RPData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RPData_getPayload" "', argument " "1"" of type '" "RPData *""'"); + } + arg1 = reinterpret_cast< RPData * >(argp1); + res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RPData_getPayload" "', argument " "2"" of type '" "void *""'"); + } + ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RPData_getPayload" "', argument " "3"" of type '" "unsigned int""'"); + } + arg3 = static_cast< unsigned int >(val3); + result = (unsigned int)(arg1)->getPayload(arg2,arg3); + resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *RPData_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_RPData, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_SMSEncoder_encodeSubmit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int arg1 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int val1 ; + int ecode1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + RPData *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:SMSEncoder_encodeSubmit",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SMSEncoder_encodeSubmit" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SMSEncoder_encodeSubmit" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SMSEncoder_encodeSubmit" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SMSEncoder_encodeSubmit" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (RPData *)SMSEncoder::encodeSubmit(arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RPData, SWIG_POINTER_OWN | 0 ); + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_delete_SMSEncoder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + SMSEncoder *arg1 = (SMSEncoder *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_SMSEncoder",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SMSEncoder, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SMSEncoder" "', argument " "1"" of type '" "SMSEncoder *""'"); + } + arg1 = reinterpret_cast< SMSEncoder * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *SMSEncoder_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_SMSEncoder, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + static PyMethodDef SwigMethods[] = { { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL}, { (char *)"new_DDebugCallback", _wrap_new_DDebugCallback, METH_VARARGS, NULL}, @@ -11391,6 +11997,13 @@ static PyMethodDef SwigMethods[] = { { (char *)"new_SipUri", _wrap_new_SipUri, METH_VARARGS, NULL}, { (char *)"delete_SipUri", _wrap_delete_SipUri, METH_VARARGS, NULL}, { (char *)"SipUri_isValid", _wrap_SipUri_isValid, METH_VARARGS, NULL}, + { (char *)"SipUri_getScheme", _wrap_SipUri_getScheme, METH_VARARGS, NULL}, + { (char *)"SipUri_getHost", _wrap_SipUri_getHost, METH_VARARGS, NULL}, + { (char *)"SipUri_getPort", _wrap_SipUri_getPort, METH_VARARGS, NULL}, + { (char *)"SipUri_getUserName", _wrap_SipUri_getUserName, METH_VARARGS, NULL}, + { (char *)"SipUri_getPassword", _wrap_SipUri_getPassword, METH_VARARGS, NULL}, + { (char *)"SipUri_getDisplayName", _wrap_SipUri_getDisplayName, METH_VARARGS, NULL}, + { (char *)"SipUri_getParamValue", _wrap_SipUri_getParamValue, METH_VARARGS, NULL}, { (char *)"SipUri_swigregister", SipUri_swigregister, METH_VARARGS, NULL}, { (char *)"new_SipMessage", _wrap_new_SipMessage, METH_VARARGS, NULL}, { (char *)"delete_SipMessage", _wrap_delete_SipMessage, METH_VARARGS, NULL}, @@ -11561,6 +12174,8 @@ static PyMethodDef SwigMethods[] = { { (char *)"SipStack_setIMPI", _wrap_SipStack_setIMPI, METH_VARARGS, NULL}, { (char *)"SipStack_setIMPU", _wrap_SipStack_setIMPU, METH_VARARGS, NULL}, { (char *)"SipStack_setPassword", _wrap_SipStack_setPassword, METH_VARARGS, NULL}, + { (char *)"SipStack_setAMF", _wrap_SipStack_setAMF, METH_VARARGS, NULL}, + { (char *)"SipStack_setOperatorId", _wrap_SipStack_setOperatorId, METH_VARARGS, NULL}, { (char *)"SipStack_setProxyCSCF", _wrap_SipStack_setProxyCSCF, METH_VARARGS, NULL}, { (char *)"SipStack_setLocalIP", _wrap_SipStack_setLocalIP, METH_VARARGS, NULL}, { (char *)"SipStack_setLocalPort", _wrap_SipStack_setLocalPort, METH_VARARGS, NULL}, @@ -11569,8 +12184,11 @@ static PyMethodDef SwigMethods[] = { { (char *)"SipStack_removeHeader", _wrap_SipStack_removeHeader, METH_VARARGS, NULL}, { (char *)"SipStack_addDnsServer", _wrap_SipStack_addDnsServer, METH_VARARGS, NULL}, { (char *)"SipStack_setAoR", _wrap_SipStack_setAoR, METH_VARARGS, NULL}, + { (char *)"SipStack_setSTUNServer", _wrap_SipStack_setSTUNServer, METH_VARARGS, NULL}, + { (char *)"SipStack_setSTUNCred", _wrap_SipStack_setSTUNCred, METH_VARARGS, NULL}, { (char *)"SipStack_dnsENUM", _wrap_SipStack_dnsENUM, METH_VARARGS, NULL}, { (char *)"SipStack_dnsNaptrSrv", _wrap_SipStack_dnsNaptrSrv, METH_VARARGS, NULL}, + { (char *)"SipStack_dnsSrv", _wrap_SipStack_dnsSrv, METH_VARARGS, NULL}, { (char *)"SipStack_isValid", _wrap_SipStack_isValid, METH_VARARGS, NULL}, { (char *)"SipStack_stop", _wrap_SipStack_stop, METH_VARARGS, NULL}, { (char *)"SipStack_setCodecs", _wrap_SipStack_setCodecs, METH_VARARGS, NULL}, @@ -11618,6 +12236,15 @@ static PyMethodDef SwigMethods[] = { { (char *)"XcapStack_getDocument", _wrap_XcapStack_getDocument, METH_VARARGS, NULL}, { (char *)"XcapStack_stop", _wrap_XcapStack_stop, METH_VARARGS, NULL}, { (char *)"XcapStack_swigregister", XcapStack_swigregister, METH_VARARGS, NULL}, + { (char *)"new_RPData", _wrap_new_RPData, METH_VARARGS, NULL}, + { (char *)"delete_RPData", _wrap_delete_RPData, METH_VARARGS, NULL}, + { (char *)"RPData_getType", _wrap_RPData_getType, METH_VARARGS, NULL}, + { (char *)"RPData_getPayloadLength", _wrap_RPData_getPayloadLength, METH_VARARGS, NULL}, + { (char *)"RPData_getPayload", _wrap_RPData_getPayload, METH_VARARGS, NULL}, + { (char *)"RPData_swigregister", RPData_swigregister, METH_VARARGS, NULL}, + { (char *)"SMSEncoder_encodeSubmit", _wrap_SMSEncoder_encodeSubmit, METH_VARARGS, NULL}, + { (char *)"delete_SMSEncoder", _wrap_delete_SMSEncoder, METH_VARARGS, NULL}, + { (char *)"SMSEncoder_swigregister", SMSEncoder_swigregister, METH_VARARGS, NULL}, { NULL, NULL, 0, NULL } }; @@ -11684,8 +12311,10 @@ static swig_type_info _swigt__p_ProxyVideoFrame = {"_p_ProxyVideoFrame", "ProxyV static swig_type_info _swigt__p_ProxyVideoProducer = {"_p_ProxyVideoProducer", "ProxyVideoProducer *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_PublicationEvent = {"_p_PublicationEvent", "PublicationEvent *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_PublicationSession = {"_p_PublicationSession", "PublicationSession *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_RPData = {"_p_RPData", "RPData *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_RegistrationEvent = {"_p_RegistrationEvent", "RegistrationEvent *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_RegistrationSession = {"_p_RegistrationSession", "RegistrationSession *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_SMSEncoder = {"_p_SMSEncoder", "SMSEncoder *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_SafeObject = {"_p_SafeObject", "SafeObject *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_SipCallback = {"_p_SipCallback", "SipCallback *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_SipEvent = {"_p_SipEvent", "SipEvent *", 0, 0, (void*)0, 0}; @@ -11702,7 +12331,6 @@ static swig_type_info _swigt__p_XcapMessage = {"_p_XcapMessage", "XcapMessage *" static swig_type_info _swigt__p_XcapSelector = {"_p_XcapSelector", "XcapSelector *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_XcapStack = {"_p_XcapStack", "XcapStack *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; -static swig_type_info _swigt__p_short = {"_p_short", "short *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tdav_codec_id_e = {"_p_tdav_codec_id_e", "enum tdav_codec_id_e *|tdav_codec_id_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_thttp_event_type_e = {"_p_thttp_event_type_e", "enum thttp_event_type_e *|thttp_event_type_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tmedia_chroma_e = {"_p_tmedia_chroma_e", "tmedia_chroma_t *|enum tmedia_chroma_e *", 0, 0, (void*)0, 0}; @@ -11716,6 +12344,8 @@ static swig_type_info _swigt__p_tsip_publish_event_type_e = {"_p_tsip_publish_ev static swig_type_info _swigt__p_tsip_register_event_type_e = {"_p_tsip_register_event_type_e", "enum tsip_register_event_type_e *|tsip_register_event_type_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tsip_subscribe_event_type_e = {"_p_tsip_subscribe_event_type_e", "enum tsip_subscribe_event_type_e *|tsip_subscribe_event_type_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tsk_list_t = {"_p_tsk_list_t", "twrap_xcap_steps_L_t *|tsk_list_t *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_twrap_rpdata_type_e = {"_p_twrap_rpdata_type_e", "enum twrap_rpdata_type_e *|twrap_rpdata_type_t *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_unsigned_short = {"_p_unsigned_short", "unsigned short *", 0, 0, (void*)0, 0}; static swig_type_info *swig_type_initial[] = { &_swigt__p_CallEvent, @@ -11733,8 +12363,10 @@ static swig_type_info *swig_type_initial[] = { &_swigt__p_ProxyVideoProducer, &_swigt__p_PublicationEvent, &_swigt__p_PublicationSession, + &_swigt__p_RPData, &_swigt__p_RegistrationEvent, &_swigt__p_RegistrationSession, + &_swigt__p_SMSEncoder, &_swigt__p_SafeObject, &_swigt__p_SipCallback, &_swigt__p_SipEvent, @@ -11751,7 +12383,6 @@ static swig_type_info *swig_type_initial[] = { &_swigt__p_XcapSelector, &_swigt__p_XcapStack, &_swigt__p_char, - &_swigt__p_short, &_swigt__p_tdav_codec_id_e, &_swigt__p_thttp_event_type_e, &_swigt__p_tmedia_chroma_e, @@ -11765,6 +12396,8 @@ static swig_type_info *swig_type_initial[] = { &_swigt__p_tsip_register_event_type_e, &_swigt__p_tsip_subscribe_event_type_e, &_swigt__p_tsk_list_t, + &_swigt__p_twrap_rpdata_type_e, + &_swigt__p_unsigned_short, }; static swig_cast_info _swigc__p_CallEvent[] = { {&_swigt__p_CallEvent, 0, 0, 0},{0, 0, 0, 0}}; @@ -11782,8 +12415,10 @@ static swig_cast_info _swigc__p_ProxyVideoFrame[] = { {&_swigt__p_ProxyVideoFra static swig_cast_info _swigc__p_ProxyVideoProducer[] = { {&_swigt__p_ProxyVideoProducer, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_PublicationEvent[] = { {&_swigt__p_PublicationEvent, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_PublicationSession[] = { {&_swigt__p_PublicationSession, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_RPData[] = { {&_swigt__p_RPData, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_RegistrationEvent[] = { {&_swigt__p_RegistrationEvent, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_RegistrationSession[] = { {&_swigt__p_RegistrationSession, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_SMSEncoder[] = { {&_swigt__p_SMSEncoder, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_SafeObject[] = { {&_swigt__p_SipStack, _p_SipStackTo_p_SafeObject, 0, 0}, {&_swigt__p_SafeObject, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_SipCallback[] = { {&_swigt__p_SipCallback, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_SipEvent[] = { {&_swigt__p_SipEvent, 0, 0, 0}, {&_swigt__p_CallEvent, _p_CallEventTo_p_SipEvent, 0, 0}, {&_swigt__p_OptionsEvent, _p_OptionsEventTo_p_SipEvent, 0, 0}, {&_swigt__p_DialogEvent, _p_DialogEventTo_p_SipEvent, 0, 0}, {&_swigt__p_PublicationEvent, _p_PublicationEventTo_p_SipEvent, 0, 0}, {&_swigt__p_RegistrationEvent, _p_RegistrationEventTo_p_SipEvent, 0, 0}, {&_swigt__p_SubscriptionEvent, _p_SubscriptionEventTo_p_SipEvent, 0, 0}, {&_swigt__p_StackEvent, _p_StackEventTo_p_SipEvent, 0, 0}, {&_swigt__p_MessagingEvent, _p_MessagingEventTo_p_SipEvent, 0, 0},{0, 0, 0, 0}}; @@ -11800,7 +12435,6 @@ static swig_cast_info _swigc__p_XcapMessage[] = { {&_swigt__p_XcapMessage, 0, 0 static swig_cast_info _swigc__p_XcapSelector[] = { {&_swigt__p_XcapSelector, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_XcapStack[] = { {&_swigt__p_XcapStack, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; -static swig_cast_info _swigc__p_short[] = { {&_swigt__p_short, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tdav_codec_id_e[] = { {&_swigt__p_tdav_codec_id_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_thttp_event_type_e[] = { {&_swigt__p_thttp_event_type_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tmedia_chroma_e[] = { {&_swigt__p_tmedia_chroma_e, 0, 0, 0},{0, 0, 0, 0}}; @@ -11814,6 +12448,8 @@ static swig_cast_info _swigc__p_tsip_publish_event_type_e[] = { {&_swigt__p_tsi static swig_cast_info _swigc__p_tsip_register_event_type_e[] = { {&_swigt__p_tsip_register_event_type_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tsip_subscribe_event_type_e[] = { {&_swigt__p_tsip_subscribe_event_type_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tsk_list_t[] = { {&_swigt__p_tsk_list_t, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_twrap_rpdata_type_e[] = { {&_swigt__p_twrap_rpdata_type_e, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_unsigned_short[] = { {&_swigt__p_unsigned_short, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info *swig_cast_initial[] = { _swigc__p_CallEvent, @@ -11831,8 +12467,10 @@ static swig_cast_info *swig_cast_initial[] = { _swigc__p_ProxyVideoProducer, _swigc__p_PublicationEvent, _swigc__p_PublicationSession, + _swigc__p_RPData, _swigc__p_RegistrationEvent, _swigc__p_RegistrationSession, + _swigc__p_SMSEncoder, _swigc__p_SafeObject, _swigc__p_SipCallback, _swigc__p_SipEvent, @@ -11849,7 +12487,6 @@ static swig_cast_info *swig_cast_initial[] = { _swigc__p_XcapSelector, _swigc__p_XcapStack, _swigc__p_char, - _swigc__p_short, _swigc__p_tdav_codec_id_e, _swigc__p_thttp_event_type_e, _swigc__p_tmedia_chroma_e, @@ -11863,6 +12500,8 @@ static swig_cast_info *swig_cast_initial[] = { _swigc__p_tsip_register_event_type_e, _swigc__p_tsip_subscribe_event_type_e, _swigc__p_tsk_list_t, + _swigc__p_twrap_rpdata_type_e, + _swigc__p_unsigned_short, }; @@ -12497,6 +13136,7 @@ SWIG_init(void) { SWIG_Python_SetConstant(d, "tsip_o_ect_ok",SWIG_From_int(static_cast< int >(tsip_o_ect_ok))); SWIG_Python_SetConstant(d, "tsip_o_ect_nok",SWIG_From_int(static_cast< int >(tsip_o_ect_nok))); SWIG_Python_SetConstant(d, "tsip_i_ect",SWIG_From_int(static_cast< int >(tsip_i_ect))); + SWIG_Python_SetConstant(d, "tsip_m_early_media",SWIG_From_int(static_cast< int >(tsip_m_early_media))); SWIG_Python_SetConstant(d, "tsip_m_local_hold_ok",SWIG_From_int(static_cast< int >(tsip_m_local_hold_ok))); SWIG_Python_SetConstant(d, "tsip_m_local_hold_nok",SWIG_From_int(static_cast< int >(tsip_m_local_hold_nok))); SWIG_Python_SetConstant(d, "tsip_m_local_resume_ok",SWIG_From_int(static_cast< int >(tsip_m_local_resume_ok))); @@ -12527,6 +13167,9 @@ SWIG_init(void) { SWIG_Python_SetConstant(d, "tdav_codec_id_speex_nb",SWIG_From_int(static_cast< int >(tdav_codec_id_speex_nb))); SWIG_Python_SetConstant(d, "tdav_codec_id_speex_wb",SWIG_From_int(static_cast< int >(tdav_codec_id_speex_wb))); SWIG_Python_SetConstant(d, "tdav_codec_id_speex_uwb",SWIG_From_int(static_cast< int >(tdav_codec_id_speex_uwb))); + SWIG_Python_SetConstant(d, "tdav_codec_id_bv16",SWIG_From_int(static_cast< int >(tdav_codec_id_bv16))); + SWIG_Python_SetConstant(d, "tdav_codec_id_bv32",SWIG_From_int(static_cast< int >(tdav_codec_id_bv32))); + SWIG_Python_SetConstant(d, "tdav_codec_id_evrc",SWIG_From_int(static_cast< int >(tdav_codec_id_evrc))); SWIG_Python_SetConstant(d, "tdav_codec_id_h261",SWIG_From_int(static_cast< int >(tdav_codec_id_h261))); SWIG_Python_SetConstant(d, "tdav_codec_id_h263",SWIG_From_int(static_cast< int >(tdav_codec_id_h263))); SWIG_Python_SetConstant(d, "tdav_codec_id_h263p",SWIG_From_int(static_cast< int >(tdav_codec_id_h263p))); @@ -12539,6 +13182,11 @@ SWIG_init(void) { SWIG_Python_SetConstant(d, "thttp_event_auth_failed",SWIG_From_int(static_cast< int >(thttp_event_auth_failed))); SWIG_Python_SetConstant(d, "thttp_event_closed",SWIG_From_int(static_cast< int >(thttp_event_closed))); SWIG_Python_SetConstant(d, "thttp_event_transport_error",SWIG_From_int(static_cast< int >(thttp_event_transport_error))); + SWIG_Python_SetConstant(d, "twrap_rpdata_type_sms_none",SWIG_From_int(static_cast< int >(twrap_rpdata_type_sms_none))); + SWIG_Python_SetConstant(d, "twrap_rpdata_type_sms_submit",SWIG_From_int(static_cast< int >(twrap_rpdata_type_sms_submit))); + SWIG_Python_SetConstant(d, "twrap_rpdata_type_sms_deliver",SWIG_From_int(static_cast< int >(twrap_rpdata_type_sms_deliver))); + SWIG_Python_SetConstant(d, "twrap_rpdata_type_sms_status_report",SWIG_From_int(static_cast< int >(twrap_rpdata_type_sms_status_report))); + SWIG_Python_SetConstant(d, "twrap_rpdata_type_sms_command",SWIG_From_int(static_cast< int >(twrap_rpdata_type_sms_command))); #if PY_VERSION_HEX >= 0x03000000 return m; #else diff --git a/trunk/thirdparties/android/lib/libbv16.a b/trunk/thirdparties/android/lib/libbv16.a index a87c9244..891fe7f2 100644 Binary files a/trunk/thirdparties/android/lib/libbv16.a and b/trunk/thirdparties/android/lib/libbv16.a differ diff --git a/trunk/thirdparties/android/lib/libspeex.a b/trunk/thirdparties/android/lib/libspeex.a index 77a691c9..ea6fbf0a 100644 Binary files a/trunk/thirdparties/android/lib/libspeex.a and b/trunk/thirdparties/android/lib/libspeex.a differ diff --git a/trunk/thirdparties/android/lib/libspeexdsp.a b/trunk/thirdparties/android/lib/libspeexdsp.a index cf9aa88a..d9c4cac4 100644 Binary files a/trunk/thirdparties/android/lib/libspeexdsp.a and b/trunk/thirdparties/android/lib/libspeexdsp.a differ diff --git a/trunk/thirdparties/win32/lib/BroadVoice16/libbv16.a b/trunk/thirdparties/win32/lib/BroadVoice16/libbv16.a index a8526638..9ead59b3 100644 Binary files a/trunk/thirdparties/win32/lib/BroadVoice16/libbv16.a and b/trunk/thirdparties/win32/lib/BroadVoice16/libbv16.a differ diff --git a/trunk/tinyDAV/droid-makefile b/trunk/tinyDAV/droid-makefile index dce5eff9..0c4a271c 100644 --- a/trunk/tinyDAV/droid-makefile +++ b/trunk/tinyDAV/droid-makefile @@ -12,18 +12,19 @@ SPEEX_LDFLAGS := -lspeexdsp -lspeex OPENCORE_ARM_CFLAGS := -DHAVE_OPENCORE_AMR=1 OPENCORE_ARM_LDFLAGS := -lopencore-amrnb -ILBC_CFLAGS := -DHAVE_ILBC=1 +ILBC_CFLAGS := -DHAVE_ILBC=0 ILBC_LDFLAGS := -liLBC LIBGSM_CFLAGS := -DHAVE_LIBGSM=1 LIBGSM_LDFLAGS := -lgsm -BV16_CFLAGS := -DHAVE_BV16=1 -I$(THIRDPARTIES_INC)/BroadVoice16/bv16 -I$(THIRDPARTIES_INC)/BroadVoice16/bvcommon +BV16_CFLAGS := -DHAVE_BV16=0 -I$(THIRDPARTIES_INC)/BroadVoice16/bv16 -I$(THIRDPARTIES_INC)/BroadVoice16/bvcommon BV16_LDFLAGS := -lbv16 CFLAGS := $(CFLAGS_LIB) -I$(THIRDPARTIES_INC) $(ILBC_CFLAGS) $(LIBGSM_CFLAGS) \ $(FFMPEG_CFLAGS) $(SPEEX_CFLAGS) $(OPENCORE_ARM_CFLAGS) $(BV16_CFLAGS) \ - -I../tinySAK/src -I../tinyNET/src -I../tinySDP/include -I../tinyRTP/include -I../tinyMEDIA/include -I./include + -I../tinySAK/src -I../tinyNET/src -I../tinySDP/include -I../tinyRTP/include -I../tinyMEDIA/include -I./include \ + -DJB_HISTORY_SIZE=300 LDFLAGS := $(LDFLAGS_LIB) -L$(THIRDPARTIES_LIB)\ $(FFMPEG_LDFLAGS) $(SPEEX_LDFLAGS) $(OPENCORE_ARM_LDFLAGS) $(ILBC_LDFLAGS) $(LIBGSM_LDFLAGS) $(BV16_LDFLAGS)\ diff --git a/trunk/tinyDAV/include/tinydav/audio/tdav_jitterbuffer.h b/trunk/tinyDAV/include/tinydav/audio/tdav_jitterbuffer.h index 499ee409..0d8aacc5 100644 --- a/trunk/tinyDAV/include/tinydav/audio/tdav_jitterbuffer.h +++ b/trunk/tinyDAV/include/tinydav/audio/tdav_jitterbuffer.h @@ -54,11 +54,10 @@ TDAV_BEGIN_DECLS // configuration constants /* Number of historical timestamps to use in calculating jitter and jitterbuffer size */ -#if defined(_WIN32_WCE) || ANDROID -# define JB_HISTORY_SIZE 200 -#else +#ifndef JB_HISTORY_SIZE # define JB_HISTORY_SIZE 500 #endif + /* minimum jitterbuffer size, disabled if 0 */ #define JB_MIN_SIZE 0 /* maximum jitterbuffer size, disabled if 0 */ diff --git a/trunk/tinyDAV/include/tinydav/audio/tdav_session_audio.h b/trunk/tinyDAV/include/tinydav/audio/tdav_session_audio.h index 638b9ef2..9da3bb7c 100644 --- a/trunk/tinyDAV/include/tinydav/audio/tdav_session_audio.h +++ b/trunk/tinyDAV/include/tinydav/audio/tdav_session_audio.h @@ -69,6 +69,9 @@ typedef struct tdav_session_audio_s char* local_ip; //uint16_t local_port; + /* NAT Traversal context */ + tnet_nat_context_handle_t* natt_ctx; + char* remote_ip; uint16_t remote_port; diff --git a/trunk/tinyDAV/include/tinydav/codecs/bv/tdav_codec_bv16.h b/trunk/tinyDAV/include/tinydav/codecs/bv/tdav_codec_bv16.h index d50d6ad7..0b5ffffc 100644 --- a/trunk/tinyDAV/include/tinydav/codecs/bv/tdav_codec_bv16.h +++ b/trunk/tinyDAV/include/tinydav/codecs/bv/tdav_codec_bv16.h @@ -47,11 +47,13 @@ typedef struct tdav_codec_bv16_s struct { void *state; void *bs; + void *x; } encoder; struct { void *state; void *bs; + void *x; } decoder; } tdav_codec_bv16_t; diff --git a/trunk/tinyDAV/include/tinydav/video/tdav_session_video.h b/trunk/tinyDAV/include/tinydav/video/tdav_session_video.h index 3398314b..f19a72c0 100644 --- a/trunk/tinyDAV/include/tinydav/video/tdav_session_video.h +++ b/trunk/tinyDAV/include/tinydav/video/tdav_session_video.h @@ -56,6 +56,9 @@ typedef struct tdav_session_video_s char* remote_ip; uint16_t remote_port; + /* NAT Traversal context */ + tnet_nat_context_handle_t* natt_ctx; + tsk_bool_t rtcp_enabled; struct trtp_manager_s* rtp_manager; diff --git a/trunk/tinyDAV/src/audio/tdav_session_audio.c b/trunk/tinyDAV/src/audio/tdav_session_audio.c index b6281357..e29a2c3b 100644 --- a/trunk/tinyDAV/src/audio/tdav_session_audio.c +++ b/trunk/tinyDAV/src/audio/tdav_session_audio.c @@ -211,6 +211,12 @@ int tmedia_session_audio_set(tmedia_session_t* self, const tmedia_param_t* param audio->useIPv6 = tsk_striequals(param->value, "ipv6"); } } + else if(param->value_type == tmedia_pvt_pobject){ + if(tsk_striequals(param->key, "natt-ctx")){ + TSK_OBJECT_SAFE_FREE(audio->natt_ctx); + audio->natt_ctx = tsk_object_ref(param->value); + } + } return ret; } @@ -230,6 +236,9 @@ int tdav_session_audio_prepare(tmedia_session_t* self) ret = trtp_manager_set_rtp_callback(audio->rtp_manager, tdav_session_audio_rtp_cb, audio); ret = trtp_manager_prepare(audio->rtp_manager); + if(audio->natt_ctx){ + ret = trtp_manager_set_natt_ctx(audio->rtp_manager, audio->natt_ctx); + } } } @@ -511,7 +520,13 @@ const tsdp_header_M_t* tdav_session_audio_get_lo(tmedia_session_t* self) changed = (self->ro_changed || !self->M.lo); if(!self->M.lo){ - if((self->M.lo = tsdp_header_M_create(self->plugin->media, audio->rtp_manager->transport->master->port, "RTP/AVP"))){ + if((self->M.lo = tsdp_header_M_create(self->plugin->media, audio->rtp_manager->rtp.public_port, "RTP/AVP"))){ + /* If NATT is active, do not rely on the global IP address Connection line */ + if(audio->natt_ctx){ + tsdp_header_M_add_headers(self->M.lo, + TSDP_HEADER_C_VA_ARGS("IN", audio->useIPv6 ? "IP6" : "IP4", audio->rtp_manager->rtp.public_ip), + tsk_null); + } /* 3GPP TS 24.229 - 6.1.1 General In order to support accurate bandwidth calculations, the UE may include the "a=ptime" attribute for all "audio" media lines as described in RFC 4566 [39]. If a UE receives an "audio" media line with "a=ptime" specified, the UE should @@ -755,6 +770,9 @@ static tsk_object_t* tdav_session_audio_dtor(tsk_object_t * self) TSK_FREE(session->encoder.buffer); TSK_FREE(session->decoder.buffer); + /* NAT Traversal context */ + TSK_OBJECT_SAFE_FREE(session->natt_ctx); + tsk_safeobj_deinit(session); /* deinit base */ diff --git a/trunk/tinyDAV/src/codecs/bv/tdav_codec_bv16.c b/trunk/tinyDAV/src/codecs/bv/tdav_codec_bv16.c index 020ba25d..c58eea5e 100644 --- a/trunk/tinyDAV/src/codecs/bv/tdav_codec_bv16.c +++ b/trunk/tinyDAV/src/codecs/bv/tdav_codec_bv16.c @@ -49,25 +49,41 @@ /* RFC 4298 - 3.1. BroadVoice16 Bit Stream Definition */ #define TDAV_BV16_FRAME_SIZE 10 +#define FRSZ_IN_U8 (FRSZ*2) /* ============ BV16 Plugin interface ================= */ #define tdav_codec_bv16_fmtp_get tsk_null #define tdav_codec_bv16_fmtp_set tsk_null +static int sizestate = sizeof(struct BV16_Encoder_State); +static int sizebitstream = sizeof(struct BV16_Bit_Stream); + int tdav_codec_bv16_open(tmedia_codec_t* self) { tdav_codec_bv16_t* bv16 = (tdav_codec_bv16_t*)self; if(!bv16->encoder.state){ - bv16->encoder.state = allocWord16(0, sizeof(struct BV16_Encoder_State)/2-1); + bv16->encoder.state = allocWord16(0, sizestate/2-1); Reset_BV16_Encoder((struct BV16_Encoder_State*)bv16->encoder.state); } + if(!bv16->encoder.bs){ + bv16->encoder.bs = allocWord16(0, sizebitstream/2-1); + } + if(!bv16->encoder.x){ + bv16->encoder.x = allocWord16(0, FRSZ-1); + } if(!bv16->decoder.state){ - bv16->decoder.state = allocWord16(0, sizeof(struct BV16_Decoder_State)/2-1); + bv16->decoder.state = allocWord16(0, sizestate/2-1); Reset_BV16_Decoder((struct BV16_Decoder_State*)bv16->decoder.state); } + if(!bv16->decoder.bs){ + bv16->decoder.bs = allocWord16(0, sizebitstream/2-1); + } + if(!bv16->decoder.x){ + bv16->decoder.x = allocWord16(0, FRSZ-1); + } return 0; } @@ -76,6 +92,33 @@ int tdav_codec_bv16_close(tmedia_codec_t* self) { tdav_codec_bv16_t* bv16 = (tdav_codec_bv16_t*)self; + if(bv16->encoder.state){ + deallocWord16(bv16->encoder.state, 0, sizestate/2-1); + bv16->encoder.state = tsk_null; + } + if(bv16->encoder.bs){ + deallocWord16(bv16->encoder.bs, 0, sizebitstream/2-1); + bv16->encoder.bs = tsk_null; + } + if(bv16->encoder.x){ + deallocWord16(bv16->encoder.x, 0, FRSZ-1); + bv16->encoder.x = tsk_null; + } + + if(bv16->decoder.state){ + deallocWord16(bv16->decoder.state, 0, sizestate/2-1); + bv16->decoder.state = tsk_null; + } + if(bv16->encoder.bs){ + deallocWord16(bv16->decoder.bs, 0, sizebitstream/2-1); + bv16->decoder.bs = tsk_null; + } + if(bv16->decoder.x){ + deallocWord16(bv16->decoder.x, 0, FRSZ-1); + bv16->decoder.x = tsk_null; + } + + return 0; } @@ -95,16 +138,36 @@ tsk_size_t tdav_codec_bv16_encode(tmedia_codec_t* self, const void* in_data, tsk tsk_size_t tdav_codec_bv16_decode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size, const tsk_object_t* proto_hdr) { - //tsk_size_t out_size; - //int ret; + tsk_size_t out_size = 0; + int i; tdav_codec_bv16_t* bv16 = (tdav_codec_bv16_t*)self; + uint8_t mama[600]; if(!self || !in_data || !in_size || !out_data || (in_size % TDAV_BV16_FRAME_SIZE)){ TSK_DEBUG_ERROR("Invalid parameter"); return 0; } - return 0; + for(i=0; i<(int)in_size; i+=TDAV_BV16_FRAME_SIZE){ + BV16_BitUnPack(mama, (struct BV16_Bit_Stream*)bv16->decoder.bs); + //BV16_BitUnPack(&((UWord8 *)in_data)[i], (struct BV16_Bit_Stream*)bv16->decoder.bs); + BV16_Decode((struct BV16_Bit_Stream*)bv16->decoder.bs, (struct BV16_Decoder_State*)bv16->decoder.state, bv16->decoder.x); + + + if(*out_max_size<(out_size + FRSZ_IN_U8)){ + if(!(*out_data = tsk_realloc(*out_data, (out_size + FRSZ_IN_U8)))){ + TSK_DEBUG_ERROR("Failed to allocate new buffer"); + *out_max_size = 0; + return 0; + } + *out_max_size = (out_size + FRSZ_IN_U8); + } + memcpy(&((uint8_t*)* out_data)[out_size], bv16->decoder.x, FRSZ_IN_U8); + out_size += FRSZ_IN_U8; + } + + + return out_size; } tsk_bool_t tdav_codec_bv16_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) diff --git a/trunk/tinyDAV/src/codecs/h264/tdav_codec_h264.c b/trunk/tinyDAV/src/codecs/h264/tdav_codec_h264.c index 07d6bbd3..4ef76e26 100644 --- a/trunk/tinyDAV/src/codecs/h264/tdav_codec_h264.c +++ b/trunk/tinyDAV/src/codecs/h264/tdav_codec_h264.c @@ -854,7 +854,6 @@ last: // ////#define START_CODE_PREFIX 16777216 /* 0x10000000 */ // for(i = size_of_scp; i<(size - size_of_scp); i++){ -// //if( *( ((uint32_t*) &pdata[i])-0 ) == START_CODE_PREFIX ){ // if(pdata[i] == H264_START_CODE_PREFIX[0] && pdata[i+1] == H264_START_CODE_PREFIX[1] && pdata[i+2] == H264_START_CODE_PREFIX[2] && pdata[i+3] == H264_START_CODE_PREFIX[3]){ /* Found Start Code Prefix */ // prev_scp = last_scp; // if((i - last_scp) >= H264_RTP_PAYLOAD_SIZE || 1){ diff --git a/trunk/tinyDAV/src/codecs/h264/tdav_codec_h264_rtp.c b/trunk/tinyDAV/src/codecs/h264/tdav_codec_h264_rtp.c index 5fbdcb07..714d3a4c 100644 --- a/trunk/tinyDAV/src/codecs/h264/tdav_codec_h264_rtp.c +++ b/trunk/tinyDAV/src/codecs/h264/tdav_codec_h264_rtp.c @@ -281,10 +281,6 @@ void tdav_codec_h264_rtp_callback(struct tdav_codec_h264_s *self, const void *da { uint8_t* pdata = (uint8_t*)data; - - //#define START_CODE_PREFIX 16777216 /* 0x10000000 */ - - //while(size && *( ((uint32_t*) &pdata[0])-0 ) == START_CODE_PREFIX ){ while(pdata[0] == H264_START_CODE_PREFIX[0] && pdata[1] == H264_START_CODE_PREFIX[1] && pdata[2] == H264_START_CODE_PREFIX[2] && pdata[3] == H264_START_CODE_PREFIX[3]){ pdata += 4; size -= 4; diff --git a/trunk/tinyDAV/src/codecs/speex/tdav_codec_speex.c b/trunk/tinyDAV/src/codecs/speex/tdav_codec_speex.c index ad416ed4..93565aab 100644 --- a/trunk/tinyDAV/src/codecs/speex/tdav_codec_speex.c +++ b/trunk/tinyDAV/src/codecs/speex/tdav_codec_speex.c @@ -44,6 +44,7 @@ int tdav_codec_speex_deinit(tdav_codec_speex_t* self); int tdav_codec_speex_open(tmedia_codec_t* self) { + static int quality = 6; tdav_codec_speex_t* speex = (tdav_codec_speex_t*)self; tsk_size_t size = 0; @@ -60,6 +61,7 @@ int tdav_codec_speex_open(tmedia_codec_t* self) return -3; } + speex_encoder_ctl(speex->encoder.state, SPEEX_SET_QUALITY, &quality); speex_encoder_ctl(speex->encoder.state, SPEEX_GET_FRAME_SIZE, &speex->encoder.size); if(!speex->encoder.size){ speex->encoder.size = 20; diff --git a/trunk/tinyDAV/src/video/tdav_session_video.c b/trunk/tinyDAV/src/video/tdav_session_video.c index 3b587a5e..f8bd6fcd 100644 --- a/trunk/tinyDAV/src/video/tdav_session_video.c +++ b/trunk/tinyDAV/src/video/tdav_session_video.c @@ -246,6 +246,12 @@ int tmedia_session_video_set(tmedia_session_t* self, const tmedia_param_t* param video->useIPv6 = tsk_striequals(param->value, "ipv6"); } } + else if(param->value_type == tmedia_pvt_pobject){ + if(tsk_striequals(param->key, "natt-ctx")){ + TSK_OBJECT_SAFE_FREE(video->natt_ctx); + video->natt_ctx = tsk_object_ref(param->value); + } + } return ret; } @@ -265,6 +271,9 @@ int tdav_session_video_prepare(tmedia_session_t* self) ret = trtp_manager_set_rtp_callback(video->rtp_manager, tdav_session_video_rtp_cb, video); ret = trtp_manager_prepare(video->rtp_manager); + if(video->natt_ctx){ + ret = trtp_manager_set_natt_ctx(video->rtp_manager, video->natt_ctx); + } } } @@ -410,8 +419,13 @@ const tsdp_header_M_t* tdav_session_video_get_lo(tmedia_session_t* self) changed = (self->ro_changed || !self->M.lo); if(!self->M.lo){ - if((self->M.lo = tsdp_header_M_create(self->plugin->media, video->rtp_manager->transport->master->port, "RTP/AVP"))){ - /* Add common attributes */ + if((self->M.lo = tsdp_header_M_create(self->plugin->media, video->rtp_manager->rtp.public_port, "RTP/AVP"))){ + /* If NATT is active, do not rely on the global IP address Connection line */ + if(video->natt_ctx){ + tsdp_header_M_add_headers(self->M.lo, + TSDP_HEADER_C_VA_ARGS("IN", video->useIPv6 ? "IP6" : "IP4", video->rtp_manager->rtp.public_ip), + tsk_null); + } } else{ TSK_DEBUG_ERROR("Failed to create lo"); @@ -556,6 +570,9 @@ static tsk_object_t* tdav_session_video_dtor(tsk_object_t * self) TSK_FREE(session->decoder.buffer); TSK_FREE(session->decoder.conv_buffer); + /* NAT Traversal context */ + TSK_OBJECT_SAFE_FREE(session->natt_ctx); + tsk_safeobj_deinit(session); /* deinit base */ diff --git a/trunk/tinyDAV/tinyDAV.vcproj b/trunk/tinyDAV/tinyDAV.vcproj index 32629e03..c78d9a8e 100644 --- a/trunk/tinyDAV/tinyDAV.vcproj +++ b/trunk/tinyDAV/tinyDAV.vcproj @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories=""$(PSDK_DIR)include";"$(DXSDK_DIR)include";..\thirdparties\win32\include;include;..\tinyRTP\include;..\tinyMEDIA\include;..\tinySDP\include;..\tinyNET\src;..\tinyDSHOW\include;..\tinySAK\src;..\thirdparties\win32\include\BroadVoice16\bvcommon;..\thirdparties\win32\include\BroadVoice16\bv16" - PreprocessorDefinitions="HAVE_BV16=1;HAVE_OPENCORE_AMR=1;HAVE_ILBC=1;HAVE_LIBGSM=1;HAVE_TINYDSHOW=1;HAVE_DSOUND_H=1;HAVE_FFMPEG=1;HAVE_SPEEX_DSP=1;HAVE_LIB_SPEEX=1;FLIP_DECODED_PICT=1;DEBUG_LEVEL=DEBUG_LEVEL_INFO;WIN32;_DEBUG;_WINDOWS;_USRDLL;_WIN32_WINNT=0x0501;TINYDAV_EXPORTS" + PreprocessorDefinitions="HAVE_BV16=0;HAVE_OPENCORE_AMR=1;HAVE_ILBC=1;HAVE_LIBGSM=1;HAVE_TINYDSHOW=1;HAVE_DSOUND_H=1;HAVE_FFMPEG=1;HAVE_SPEEX_DSP=1;HAVE_LIB_SPEEX=1;FLIP_DECODED_PICT=1;G192BITSTREAM=0;DEBUG_LEVEL=DEBUG_LEVEL_INFO;WIN32;_DEBUG;_WINDOWS;_USRDLL;_WIN32_WINNT=0x0501;TINYDAV_EXPORTS" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" diff --git a/trunk/tinyDEMO/cmd.h b/trunk/tinyDEMO/cmd.h index 07099a52..e758c959 100644 --- a/trunk/tinyDEMO/cmd.h +++ b/trunk/tinyDEMO/cmd.h @@ -92,6 +92,10 @@ typedef enum opt_type_e opt_sigcomp_id, /* --sigcomp-id urn:uuid:2e5fdc76-00be-4314-8202-1116fa82a473 */ opt_silent, /* --silent */ opt_smsc, /* --smsc +3315245856 */ + opt_stun_ip, /* --stun-ip numb.viagenie.ca */ + opt_stun_pwd, /* --stun-pwd mysecret */ + opt_stun_port, /* --stun-port 3478 */ + opt_stun_usr, /* --stun-usr bob@open-ims.test */ opt_to, /* --to sip:alice@open-ims.test */ } opt_type_t; diff --git a/trunk/tinyDEMO/common.c b/trunk/tinyDEMO/common.c index 50926485..02b8e11c 100644 --- a/trunk/tinyDEMO/common.c +++ b/trunk/tinyDEMO/common.c @@ -28,6 +28,7 @@ #include "register.h" #include "subscribe.h" +#include #include #include @@ -62,7 +63,9 @@ int stack_callback(const tsip_event_t *_event) return -1; } +#if 0 tsk_safeobj_lock(ctx); +#endif switch(_event->type){ case tsip_event_register: @@ -128,8 +131,9 @@ int stack_callback(const tsip_event_t *_event) break; } } - +#if 0 tsk_safeobj_unlock(ctx); +#endif return ret; } @@ -235,6 +239,7 @@ int stack_config(const opts_L_t* opts) int ret = 0; tsk_param_t* param; tsk_bool_t pcscf_changed = tsk_false; + tsk_bool_t stun_done = tsk_false; if(!opts){ return -1; @@ -364,6 +369,45 @@ int stack_config(const opts_L_t* opts) break; } + case opt_stun_ip: + case opt_stun_pwd: + case opt_stun_port: + case opt_stun_usr: + { + if(!stun_done){ + const opt_t* _opt; + const char* ip = tsk_null, *usr = tsk_null, *pwd = tsk_null; + unsigned port = 0; + + if((_opt = opt_get_by_type(opts, opt_stun_ip))){ + ip = _opt->value; + } + if((_opt = opt_get_by_type(opts, opt_stun_port))){ + port = atoi(_opt->value); + } + if((_opt = opt_get_by_type(opts, opt_stun_usr))){ + usr = _opt->value; + } + if((_opt = opt_get_by_type(opts, opt_stun_pwd))){ + pwd = _opt->value; + } + + if(ip && port){ + tsip_stack_set(ctx->stack, + TSIP_STACK_SET_STUN_SERVER(ip, port), + TSIP_STACK_SET_NULL()); + } + if(usr){ + tsip_stack_set(ctx->stack, + TSIP_STACK_SET_STUN_CRED(usr, pwd), + TSIP_STACK_SET_NULL()); + } + + stun_done = tsk_true; + } + break; + } + }/* switch */ } /* foreach */ @@ -423,9 +467,9 @@ session_t* session_create(session_type_t type, tsip_ssession_handle_t* handle) // 100rel TSIP_MSESSION_SET_100rel(), // Session timers - TSIP_MSESSION_SET_TIMERS(90, "uac"), + TSIP_MSESSION_SET_TIMERS(3600, "uac"), // QoS - TSIP_MSESSION_SET_QOS(tmedia_qos_stype_segmented, tmedia_qos_strength_optional), + TSIP_MSESSION_SET_QOS(tmedia_qos_stype_none, tmedia_qos_strength_none), // close media params TSIP_MSESSION_SET_NULL() diff --git a/trunk/tinyDEMO/core-micromethod.sn b/trunk/tinyDEMO/core-micromethod.sn index 7b69d0b7..aa2d51ab 100644 --- a/trunk/tinyDEMO/core-micromethod.sn +++ b/trunk/tinyDEMO/core-micromethod.sn @@ -2,11 +2,11 @@ # user's parameters (like ANSI-C #define) %%domain micromethod.com -%%user bob -%%pwd bob +%%user mamdou +%%pwd mamadou %%proxy_ip 192.168.0.10 # IP address or FQDN %%proxy_port 5060 -%%proxy_trans udp # udp, tcp, tls or sctp +%%proxy_trans tcp # udp, tcp, tls or sctp %%expires 30 # expires used by all dialogs %%sleep-sec 1.0 # number of seconds to wait before sending next sip message @@ -19,6 +19,7 @@ # Configure the stack # Realm, IMPI and IMPU are mandatory ++cst --realm $$(domain) --impi $$(user)@$$(domain) --impu sip:$$(user)@$$(domain) --pwd $$(pwd) \ + --stun-ip numb.viagenie.ca --stun-port 3478 --stun-usr $$(user)@$$(domain) --stun-pwd $$(pwd) \ --pcscf-ip $$(proxy_ip) --pcscf-port $$(proxy_port) --pcscf-trans $$(proxy_trans) \ --header Privacy=none --header Allow=INVITE, ACK, CANCEL, BYE, MESSAGE, OPTIONS, NOTIFY, PRACK, UPDATE, REFER \ --header P-Access-Network-Info=ADSL;utran-cell-id-3gpp=00000000 \ @@ -27,7 +28,6 @@ # Run the engine ++r - # OPTIONS to hack AOR #++opt #++sleep --sec $$(sleep-sec) @@ -41,8 +41,8 @@ ++sleep --sec $$(sleep-sec) # SUBSCRIBE to reg event package (silent hangup) -#++sub --to sip:$$(user)@$$(domain) --xp $$(expires) --silent --header Event=reg --header Accept=application/reginfo+xml \ -# --header Allow-Events=refer, presence, presence.winfo, xcap-diff, conference >>(sub-reg-sid) +++sub --to sip:$$(user)@$$(domain) --xp $$(expires) --silent --header Event=reg --header Accept=application/reginfo+xml \ + --header Allow-Events=refer, presence, presence.winfo, xcap-diff, conference >>(sub-reg-sid) #SUBSCRIBE to presence event package (alice) #++sub --to sip:alice@$$(domain) --xp $$(expires) --header Event=presence --header Supported=eventlist\ @@ -68,9 +68,10 @@ # --pay hello world #send INVITE -#++a --to sip:bob@$$(domain) \ -# --header Action-Header=Myheader-value @@action \ -# >>(inv_audio_sid) +++av --to sip:bob@$$(domain) \ + --header Action-Header=Myheader-value @@action \ + >>(inv_audio_sid) + #++sleep --sec -1 #++ho --sid $$(inv_audio_sid) #++sleep --sec -1 diff --git a/trunk/tinyDEMO/dssl.c b/trunk/tinyDEMO/dssl.c index e77466a8..55a030cb 100644 --- a/trunk/tinyDEMO/dssl.c +++ b/trunk/tinyDEMO/dssl.c @@ -83,7 +83,7 @@ tsk_bool_t next_not_(const char* p, const char* pe, char c) * Ragel state machine. */ -/* #line 307 "./dssl.rl" */ +/* #line 311 "./dssl.rl" */ cmd_t* dssl_parse(const char *buffer, tsk_size_t size, tsk_bool_t *comment, tsk_params_L_t* params) @@ -123,205 +123,225 @@ static const char _demo_machine_parser_cmd_actions[] = { 60, 1, 61, 1, 62, 1, 63, 1, 64, 1, 65, 1, 66, 1, 67, 1, 68, 1, 69, 1, 70, 1, 71, 1, - 72, 1, 74, 1, 80, 1, 81, 2, + 72, 1, 73, 1, 74, 1, 75, 1, + 76, 1, 78, 1, 84, 1, 85, 2, 0, 3, 2, 0, 12, 2, 1, 0, - 2, 2, 76, 2, 3, 0, 2, 4, - 73, 2, 4, 78, 2, 5, 0, 2, - 9, 79, 2, 11, 75, 2, 13, 75, - 2, 14, 75, 2, 15, 75, 2, 16, - 75, 2, 17, 75, 2, 18, 75, 2, - 19, 75, 2, 20, 75, 2, 21, 75, - 2, 22, 75, 2, 23, 75, 2, 24, - 75, 2, 25, 75, 2, 26, 75, 2, - 27, 75, 2, 28, 75, 2, 29, 75, - 2, 30, 75, 2, 31, 75, 2, 32, - 75, 2, 33, 75, 2, 34, 75, 2, - 35, 75, 2, 36, 75, 2, 37, 75, - 2, 67, 12, 2, 68, 12, 2, 69, - 12, 2, 72, 0, 2, 72, 3, 2, - 72, 10, 2, 72, 12, 2, 72, 13, - 2, 72, 14, 2, 72, 15, 2, 72, - 16, 2, 72, 17, 2, 72, 18, 2, - 72, 19, 2, 72, 20, 2, 72, 21, - 2, 72, 22, 2, 72, 23, 2, 72, - 24, 2, 72, 25, 2, 72, 26, 2, - 72, 27, 2, 72, 28, 2, 72, 29, - 2, 72, 30, 2, 72, 31, 2, 72, - 32, 2, 72, 33, 2, 72, 34, 2, - 72, 35, 2, 72, 36, 2, 72, 37, - 2, 72, 38, 2, 72, 39, 2, 72, - 40, 2, 72, 41, 2, 72, 42, 2, - 72, 43, 2, 72, 44, 2, 72, 45, - 2, 72, 46, 2, 72, 47, 2, 72, - 48, 2, 72, 49, 2, 72, 50, 2, - 72, 51, 2, 72, 52, 2, 72, 53, - 2, 72, 54, 2, 72, 55, 2, 72, - 56, 2, 72, 57, 2, 72, 58, 2, - 72, 59, 2, 72, 60, 2, 72, 61, - 2, 72, 62, 2, 72, 63, 2, 72, - 64, 2, 72, 65, 2, 72, 66, 2, - 72, 67, 2, 72, 68, 2, 72, 69, - 3, 0, 4, 73, 3, 0, 4, 78, - 3, 0, 9, 79, 3, 0, 11, 75, - 3, 3, 2, 76, 3, 5, 0, 8, - 3, 7, 6, 77, 3, 10, 0, 3, - 3, 12, 2, 76, 3, 13, 11, 75, - 3, 14, 11, 75, 3, 15, 11, 75, - 3, 16, 11, 75, 3, 17, 11, 75, - 3, 18, 11, 75, 3, 19, 11, 75, - 3, 20, 11, 75, 3, 21, 11, 75, - 3, 22, 11, 75, 3, 23, 11, 75, - 3, 24, 11, 75, 3, 25, 11, 75, - 3, 26, 11, 75, 3, 27, 11, 75, - 3, 28, 11, 75, 3, 29, 11, 75, - 3, 30, 11, 75, 3, 31, 11, 75, - 3, 32, 11, 75, 3, 33, 11, 75, - 3, 34, 11, 75, 3, 35, 11, 75, - 3, 36, 11, 75, 3, 37, 11, 75, - 3, 38, 0, 3, 3, 39, 0, 3, - 3, 40, 0, 3, 3, 41, 0, 3, - 3, 42, 0, 3, 3, 43, 0, 3, - 3, 44, 0, 3, 3, 45, 0, 3, - 3, 46, 0, 3, 3, 47, 0, 3, - 3, 48, 0, 3, 3, 49, 0, 3, - 3, 50, 0, 3, 3, 51, 0, 3, - 3, 52, 0, 3, 3, 53, 0, 3, - 3, 54, 0, 3, 3, 55, 0, 3, - 3, 56, 0, 3, 3, 57, 0, 3, - 3, 58, 0, 3, 3, 59, 0, 3, - 3, 60, 0, 3, 3, 61, 0, 3, - 3, 62, 0, 3, 3, 63, 0, 3, - 3, 64, 0, 3, 3, 65, 0, 3, - 3, 66, 0, 3, 3, 67, 2, 76, - 3, 68, 2, 76, 3, 69, 2, 76, - 3, 72, 0, 12, 3, 72, 1, 0, - 3, 72, 10, 0, 3, 72, 38, 0, - 3, 72, 38, 10, 3, 72, 39, 0, - 3, 72, 39, 10, 3, 72, 40, 0, - 3, 72, 40, 10, 3, 72, 41, 0, - 3, 72, 41, 10, 3, 72, 42, 0, - 3, 72, 42, 10, 3, 72, 43, 0, - 3, 72, 43, 10, 3, 72, 44, 0, - 3, 72, 44, 10, 3, 72, 45, 0, - 3, 72, 45, 10, 3, 72, 46, 0, - 3, 72, 46, 10, 3, 72, 47, 0, - 3, 72, 47, 10, 3, 72, 48, 0, - 3, 72, 48, 10, 3, 72, 49, 0, - 3, 72, 49, 10, 3, 72, 50, 0, - 3, 72, 50, 10, 3, 72, 51, 0, - 3, 72, 51, 10, 3, 72, 52, 0, - 3, 72, 52, 10, 3, 72, 53, 0, - 3, 72, 53, 10, 3, 72, 54, 0, - 3, 72, 54, 10, 3, 72, 55, 0, - 3, 72, 55, 10, 3, 72, 56, 0, - 3, 72, 56, 10, 3, 72, 57, 0, - 3, 72, 57, 10, 3, 72, 58, 0, - 3, 72, 58, 10, 3, 72, 59, 0, - 3, 72, 59, 10, 3, 72, 60, 0, - 3, 72, 60, 10, 3, 72, 61, 0, - 3, 72, 61, 10, 3, 72, 62, 0, - 3, 72, 62, 10, 3, 72, 63, 0, - 3, 72, 63, 10, 3, 72, 64, 0, - 3, 72, 64, 10, 3, 72, 65, 0, - 3, 72, 65, 10, 3, 72, 66, 0, - 3, 72, 66, 10, 3, 72, 67, 12, - 3, 72, 68, 12, 3, 72, 69, 12, - 4, 0, 3, 2, 76, 4, 0, 7, - 6, 77, 4, 0, 12, 2, 76, 4, - 1, 0, 10, 3, 4, 3, 12, 2, - 76, 4, 3, 67, 2, 76, 4, 3, - 68, 2, 76, 4, 3, 69, 2, 76, - 4, 38, 10, 0, 3, 4, 39, 10, - 0, 3, 4, 40, 10, 0, 3, 4, - 41, 10, 0, 3, 4, 42, 10, 0, - 3, 4, 43, 10, 0, 3, 4, 44, - 10, 0, 3, 4, 45, 10, 0, 3, - 4, 46, 10, 0, 3, 4, 47, 10, - 0, 3, 4, 48, 10, 0, 3, 4, - 49, 10, 0, 3, 4, 50, 10, 0, - 3, 4, 51, 10, 0, 3, 4, 52, - 10, 0, 3, 4, 53, 10, 0, 3, - 4, 54, 10, 0, 3, 4, 55, 10, - 0, 3, 4, 56, 10, 0, 3, 4, - 57, 10, 0, 3, 4, 58, 10, 0, - 3, 4, 59, 10, 0, 3, 4, 60, - 10, 0, 3, 4, 61, 10, 0, 3, - 4, 62, 10, 0, 3, 4, 63, 10, - 0, 3, 4, 64, 10, 0, 3, 4, - 65, 10, 0, 3, 4, 66, 10, 0, - 3, 4, 67, 12, 2, 76, 4, 68, - 12, 2, 76, 4, 69, 12, 2, 76, - 4, 72, 1, 0, 10, 4, 72, 38, - 10, 0, 4, 72, 39, 10, 0, 4, - 72, 40, 10, 0, 4, 72, 41, 10, - 0, 4, 72, 42, 10, 0, 4, 72, - 43, 10, 0, 4, 72, 44, 10, 0, - 4, 72, 45, 10, 0, 4, 72, 46, - 10, 0, 4, 72, 47, 10, 0, 4, - 72, 48, 10, 0, 4, 72, 49, 10, - 0, 4, 72, 50, 10, 0, 4, 72, - 51, 10, 0, 4, 72, 52, 10, 0, - 4, 72, 53, 10, 0, 4, 72, 54, - 10, 0, 4, 72, 55, 10, 0, 4, - 72, 56, 10, 0, 4, 72, 57, 10, - 0, 4, 72, 58, 10, 0, 4, 72, - 59, 10, 0, 4, 72, 60, 10, 0, - 4, 72, 61, 10, 0, 4, 72, 62, - 10, 0, 4, 72, 63, 10, 0, 4, - 72, 64, 10, 0, 4, 72, 65, 10, - 0, 4, 72, 66, 10, 0, 5, 3, - 0, 12, 2, 76, 5, 3, 67, 12, - 2, 76, 5, 3, 68, 12, 2, 76, - 5, 3, 69, 12, 2, 76, 5, 10, - 0, 3, 2, 76, 5, 38, 0, 3, - 2, 76, 5, 39, 0, 3, 2, 76, - 5, 40, 0, 3, 2, 76, 5, 41, - 0, 3, 2, 76, 5, 42, 0, 3, - 2, 76, 5, 43, 0, 3, 2, 76, - 5, 44, 0, 3, 2, 76, 5, 45, - 0, 3, 2, 76, 5, 46, 0, 3, - 2, 76, 5, 47, 0, 3, 2, 76, - 5, 48, 0, 3, 2, 76, 5, 49, - 0, 3, 2, 76, 5, 50, 0, 3, - 2, 76, 5, 51, 0, 3, 2, 76, - 5, 52, 0, 3, 2, 76, 5, 53, - 0, 3, 2, 76, 5, 54, 0, 3, - 2, 76, 5, 55, 0, 3, 2, 76, - 5, 56, 0, 3, 2, 76, 5, 57, - 0, 3, 2, 76, 5, 58, 0, 3, - 2, 76, 5, 59, 0, 3, 2, 76, - 5, 60, 0, 3, 2, 76, 5, 61, - 0, 3, 2, 76, 5, 62, 0, 3, - 2, 76, 5, 63, 0, 3, 2, 76, - 5, 64, 0, 3, 2, 76, 5, 65, - 0, 3, 2, 76, 5, 66, 0, 3, - 2, 76, 6, 1, 0, 10, 3, 2, - 76, 6, 38, 10, 0, 3, 2, 76, - 6, 39, 10, 0, 3, 2, 76, 6, - 40, 10, 0, 3, 2, 76, 6, 41, - 10, 0, 3, 2, 76, 6, 42, 10, - 0, 3, 2, 76, 6, 43, 10, 0, - 3, 2, 76, 6, 44, 10, 0, 3, - 2, 76, 6, 45, 10, 0, 3, 2, - 76, 6, 46, 10, 0, 3, 2, 76, - 6, 47, 10, 0, 3, 2, 76, 6, - 48, 10, 0, 3, 2, 76, 6, 49, - 10, 0, 3, 2, 76, 6, 50, 10, - 0, 3, 2, 76, 6, 51, 10, 0, - 3, 2, 76, 6, 52, 10, 0, 3, - 2, 76, 6, 53, 10, 0, 3, 2, - 76, 6, 54, 10, 0, 3, 2, 76, - 6, 55, 10, 0, 3, 2, 76, 6, - 56, 10, 0, 3, 2, 76, 6, 57, - 10, 0, 3, 2, 76, 6, 58, 10, - 0, 3, 2, 76, 6, 59, 10, 0, - 3, 2, 76, 6, 60, 10, 0, 3, - 2, 76, 6, 61, 10, 0, 3, 2, - 76, 6, 62, 10, 0, 3, 2, 76, - 6, 63, 10, 0, 3, 2, 76, 6, - 64, 10, 0, 3, 2, 76, 6, 65, - 10, 0, 3, 2, 76, 6, 66, 10, - 0, 3, 2, 76 + 2, 2, 80, 2, 3, 0, 2, 4, + 77, 2, 4, 82, 2, 5, 0, 2, + 9, 83, 2, 11, 79, 2, 13, 79, + 2, 14, 79, 2, 15, 79, 2, 16, + 79, 2, 17, 79, 2, 18, 79, 2, + 19, 79, 2, 20, 79, 2, 21, 79, + 2, 22, 79, 2, 23, 79, 2, 24, + 79, 2, 25, 79, 2, 26, 79, 2, + 27, 79, 2, 28, 79, 2, 29, 79, + 2, 30, 79, 2, 31, 79, 2, 32, + 79, 2, 33, 79, 2, 34, 79, 2, + 35, 79, 2, 36, 79, 2, 37, 79, + 2, 71, 12, 2, 72, 12, 2, 73, + 12, 2, 76, 0, 2, 76, 3, 2, + 76, 10, 2, 76, 12, 2, 76, 13, + 2, 76, 14, 2, 76, 15, 2, 76, + 16, 2, 76, 17, 2, 76, 18, 2, + 76, 19, 2, 76, 20, 2, 76, 21, + 2, 76, 22, 2, 76, 23, 2, 76, + 24, 2, 76, 25, 2, 76, 26, 2, + 76, 27, 2, 76, 28, 2, 76, 29, + 2, 76, 30, 2, 76, 31, 2, 76, + 32, 2, 76, 33, 2, 76, 34, 2, + 76, 35, 2, 76, 36, 2, 76, 37, + 2, 76, 38, 2, 76, 39, 2, 76, + 40, 2, 76, 41, 2, 76, 42, 2, + 76, 43, 2, 76, 44, 2, 76, 45, + 2, 76, 46, 2, 76, 47, 2, 76, + 48, 2, 76, 49, 2, 76, 50, 2, + 76, 51, 2, 76, 52, 2, 76, 53, + 2, 76, 54, 2, 76, 55, 2, 76, + 56, 2, 76, 57, 2, 76, 58, 2, + 76, 59, 2, 76, 60, 2, 76, 61, + 2, 76, 62, 2, 76, 63, 2, 76, + 64, 2, 76, 65, 2, 76, 66, 2, + 76, 67, 2, 76, 68, 2, 76, 69, + 2, 76, 70, 2, 76, 71, 2, 76, + 72, 2, 76, 73, 3, 0, 4, 77, + 3, 0, 4, 82, 3, 0, 9, 83, + 3, 0, 11, 79, 3, 3, 2, 80, + 3, 5, 0, 8, 3, 7, 6, 81, + 3, 10, 0, 3, 3, 12, 2, 80, + 3, 13, 11, 79, 3, 14, 11, 79, + 3, 15, 11, 79, 3, 16, 11, 79, + 3, 17, 11, 79, 3, 18, 11, 79, + 3, 19, 11, 79, 3, 20, 11, 79, + 3, 21, 11, 79, 3, 22, 11, 79, + 3, 23, 11, 79, 3, 24, 11, 79, + 3, 25, 11, 79, 3, 26, 11, 79, + 3, 27, 11, 79, 3, 28, 11, 79, + 3, 29, 11, 79, 3, 30, 11, 79, + 3, 31, 11, 79, 3, 32, 11, 79, + 3, 33, 11, 79, 3, 34, 11, 79, + 3, 35, 11, 79, 3, 36, 11, 79, + 3, 37, 11, 79, 3, 38, 0, 3, + 3, 39, 0, 3, 3, 40, 0, 3, + 3, 41, 0, 3, 3, 42, 0, 3, + 3, 43, 0, 3, 3, 44, 0, 3, + 3, 45, 0, 3, 3, 46, 0, 3, + 3, 47, 0, 3, 3, 48, 0, 3, + 3, 49, 0, 3, 3, 50, 0, 3, + 3, 51, 0, 3, 3, 52, 0, 3, + 3, 53, 0, 3, 3, 54, 0, 3, + 3, 55, 0, 3, 3, 56, 0, 3, + 3, 57, 0, 3, 3, 58, 0, 3, + 3, 59, 0, 3, 3, 60, 0, 3, + 3, 61, 0, 3, 3, 62, 0, 3, + 3, 63, 0, 3, 3, 64, 0, 3, + 3, 65, 0, 3, 3, 66, 0, 3, + 3, 67, 0, 3, 3, 68, 0, 3, + 3, 69, 0, 3, 3, 70, 0, 3, + 3, 71, 2, 80, 3, 72, 2, 80, + 3, 73, 2, 80, 3, 76, 0, 12, + 3, 76, 1, 0, 3, 76, 10, 0, + 3, 76, 38, 0, 3, 76, 38, 10, + 3, 76, 39, 0, 3, 76, 39, 10, + 3, 76, 40, 0, 3, 76, 40, 10, + 3, 76, 41, 0, 3, 76, 41, 10, + 3, 76, 42, 0, 3, 76, 42, 10, + 3, 76, 43, 0, 3, 76, 43, 10, + 3, 76, 44, 0, 3, 76, 44, 10, + 3, 76, 45, 0, 3, 76, 45, 10, + 3, 76, 46, 0, 3, 76, 46, 10, + 3, 76, 47, 0, 3, 76, 47, 10, + 3, 76, 48, 0, 3, 76, 48, 10, + 3, 76, 49, 0, 3, 76, 49, 10, + 3, 76, 50, 0, 3, 76, 50, 10, + 3, 76, 51, 0, 3, 76, 51, 10, + 3, 76, 52, 0, 3, 76, 52, 10, + 3, 76, 53, 0, 3, 76, 53, 10, + 3, 76, 54, 0, 3, 76, 54, 10, + 3, 76, 55, 0, 3, 76, 55, 10, + 3, 76, 56, 0, 3, 76, 56, 10, + 3, 76, 57, 0, 3, 76, 57, 10, + 3, 76, 58, 0, 3, 76, 58, 10, + 3, 76, 59, 0, 3, 76, 59, 10, + 3, 76, 60, 0, 3, 76, 60, 10, + 3, 76, 61, 0, 3, 76, 61, 10, + 3, 76, 62, 0, 3, 76, 62, 10, + 3, 76, 63, 0, 3, 76, 63, 10, + 3, 76, 64, 0, 3, 76, 64, 10, + 3, 76, 65, 0, 3, 76, 65, 10, + 3, 76, 66, 0, 3, 76, 66, 10, + 3, 76, 67, 0, 3, 76, 67, 10, + 3, 76, 68, 0, 3, 76, 68, 10, + 3, 76, 69, 0, 3, 76, 69, 10, + 3, 76, 70, 0, 3, 76, 70, 10, + 3, 76, 71, 12, 3, 76, 72, 12, + 3, 76, 73, 12, 4, 0, 3, 2, + 80, 4, 0, 7, 6, 81, 4, 0, + 12, 2, 80, 4, 1, 0, 10, 3, + 4, 3, 12, 2, 80, 4, 3, 71, + 2, 80, 4, 3, 72, 2, 80, 4, + 3, 73, 2, 80, 4, 38, 10, 0, + 3, 4, 39, 10, 0, 3, 4, 40, + 10, 0, 3, 4, 41, 10, 0, 3, + 4, 42, 10, 0, 3, 4, 43, 10, + 0, 3, 4, 44, 10, 0, 3, 4, + 45, 10, 0, 3, 4, 46, 10, 0, + 3, 4, 47, 10, 0, 3, 4, 48, + 10, 0, 3, 4, 49, 10, 0, 3, + 4, 50, 10, 0, 3, 4, 51, 10, + 0, 3, 4, 52, 10, 0, 3, 4, + 53, 10, 0, 3, 4, 54, 10, 0, + 3, 4, 55, 10, 0, 3, 4, 56, + 10, 0, 3, 4, 57, 10, 0, 3, + 4, 58, 10, 0, 3, 4, 59, 10, + 0, 3, 4, 60, 10, 0, 3, 4, + 61, 10, 0, 3, 4, 62, 10, 0, + 3, 4, 63, 10, 0, 3, 4, 64, + 10, 0, 3, 4, 65, 10, 0, 3, + 4, 66, 10, 0, 3, 4, 67, 10, + 0, 3, 4, 68, 10, 0, 3, 4, + 69, 10, 0, 3, 4, 70, 10, 0, + 3, 4, 71, 12, 2, 80, 4, 72, + 12, 2, 80, 4, 73, 12, 2, 80, + 4, 76, 1, 0, 10, 4, 76, 38, + 10, 0, 4, 76, 39, 10, 0, 4, + 76, 40, 10, 0, 4, 76, 41, 10, + 0, 4, 76, 42, 10, 0, 4, 76, + 43, 10, 0, 4, 76, 44, 10, 0, + 4, 76, 45, 10, 0, 4, 76, 46, + 10, 0, 4, 76, 47, 10, 0, 4, + 76, 48, 10, 0, 4, 76, 49, 10, + 0, 4, 76, 50, 10, 0, 4, 76, + 51, 10, 0, 4, 76, 52, 10, 0, + 4, 76, 53, 10, 0, 4, 76, 54, + 10, 0, 4, 76, 55, 10, 0, 4, + 76, 56, 10, 0, 4, 76, 57, 10, + 0, 4, 76, 58, 10, 0, 4, 76, + 59, 10, 0, 4, 76, 60, 10, 0, + 4, 76, 61, 10, 0, 4, 76, 62, + 10, 0, 4, 76, 63, 10, 0, 4, + 76, 64, 10, 0, 4, 76, 65, 10, + 0, 4, 76, 66, 10, 0, 4, 76, + 67, 10, 0, 4, 76, 68, 10, 0, + 4, 76, 69, 10, 0, 4, 76, 70, + 10, 0, 5, 3, 0, 12, 2, 80, + 5, 3, 71, 12, 2, 80, 5, 3, + 72, 12, 2, 80, 5, 3, 73, 12, + 2, 80, 5, 10, 0, 3, 2, 80, + 5, 38, 0, 3, 2, 80, 5, 39, + 0, 3, 2, 80, 5, 40, 0, 3, + 2, 80, 5, 41, 0, 3, 2, 80, + 5, 42, 0, 3, 2, 80, 5, 43, + 0, 3, 2, 80, 5, 44, 0, 3, + 2, 80, 5, 45, 0, 3, 2, 80, + 5, 46, 0, 3, 2, 80, 5, 47, + 0, 3, 2, 80, 5, 48, 0, 3, + 2, 80, 5, 49, 0, 3, 2, 80, + 5, 50, 0, 3, 2, 80, 5, 51, + 0, 3, 2, 80, 5, 52, 0, 3, + 2, 80, 5, 53, 0, 3, 2, 80, + 5, 54, 0, 3, 2, 80, 5, 55, + 0, 3, 2, 80, 5, 56, 0, 3, + 2, 80, 5, 57, 0, 3, 2, 80, + 5, 58, 0, 3, 2, 80, 5, 59, + 0, 3, 2, 80, 5, 60, 0, 3, + 2, 80, 5, 61, 0, 3, 2, 80, + 5, 62, 0, 3, 2, 80, 5, 63, + 0, 3, 2, 80, 5, 64, 0, 3, + 2, 80, 5, 65, 0, 3, 2, 80, + 5, 66, 0, 3, 2, 80, 5, 67, + 0, 3, 2, 80, 5, 68, 0, 3, + 2, 80, 5, 69, 0, 3, 2, 80, + 5, 70, 0, 3, 2, 80, 6, 1, + 0, 10, 3, 2, 80, 6, 38, 10, + 0, 3, 2, 80, 6, 39, 10, 0, + 3, 2, 80, 6, 40, 10, 0, 3, + 2, 80, 6, 41, 10, 0, 3, 2, + 80, 6, 42, 10, 0, 3, 2, 80, + 6, 43, 10, 0, 3, 2, 80, 6, + 44, 10, 0, 3, 2, 80, 6, 45, + 10, 0, 3, 2, 80, 6, 46, 10, + 0, 3, 2, 80, 6, 47, 10, 0, + 3, 2, 80, 6, 48, 10, 0, 3, + 2, 80, 6, 49, 10, 0, 3, 2, + 80, 6, 50, 10, 0, 3, 2, 80, + 6, 51, 10, 0, 3, 2, 80, 6, + 52, 10, 0, 3, 2, 80, 6, 53, + 10, 0, 3, 2, 80, 6, 54, 10, + 0, 3, 2, 80, 6, 55, 10, 0, + 3, 2, 80, 6, 56, 10, 0, 3, + 2, 80, 6, 57, 10, 0, 3, 2, + 80, 6, 58, 10, 0, 3, 2, 80, + 6, 59, 10, 0, 3, 2, 80, 6, + 60, 10, 0, 3, 2, 80, 6, 61, + 10, 0, 3, 2, 80, 6, 62, 10, + 0, 3, 2, 80, 6, 63, 10, 0, + 3, 2, 80, 6, 64, 10, 0, 3, + 2, 80, 6, 65, 10, 0, 3, 2, + 80, 6, 66, 10, 0, 3, 2, 80, + 6, 67, 10, 0, 3, 2, 80, 6, + 68, 10, 0, 3, 2, 80, 6, 69, + 10, 0, 3, 2, 80, 6, 70, 10, + 0, 3, 2, 80 }; static const short _demo_machine_parser_cmd_cond_offsets[] = { @@ -352,8 +372,9 @@ static const short _demo_machine_parser_cmd_cond_offsets[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 3, - 4, 5, 6, 6, 6, 6, 6, 6, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, @@ -375,51 +396,56 @@ static const short _demo_machine_parser_cmd_cond_offsets[] = { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 7, - 8, 9, 9, 9, 9, 9, 9, 9, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 10, 11, 12, 13, 13, - 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, - 286, 287, 288, 289, 290, 291, 292, 293, - 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325 + 9, 9, 9, 9, 9, 9, 10, 11, + 12, 13, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, + 355 }; static const char _demo_machine_parser_cmd_cond_lengths[] = { @@ -450,8 +476,9 @@ static const char _demo_machine_parser_cmd_cond_lengths[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -473,12 +500,13 @@ static const char _demo_machine_parser_cmd_cond_lengths[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 1, - 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 1, 1, 0, 1, + 0, 0, 0, 0, 0, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -517,7 +545,11 @@ static const char _demo_machine_parser_cmd_cond_lengths[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1 + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1 }; static const short _demo_machine_parser_cmd_cond_keys[] = { @@ -602,7 +634,15 @@ static const short _demo_machine_parser_cmd_cond_keys[] = { -128, 127, -128, 127, -128, 127, -128, 127, -128, 127, -128, 127, -128, 127, -128, 127, -128, 127, -128, 127, -128, 127, -128, 127, - -128, 127, -128, 127, 0 + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + 0 }; static const char _demo_machine_parser_cmd_cond_spaces[] = { @@ -646,7 +686,11 @@ static const char _demo_machine_parser_cmd_cond_spaces[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 }; static const short _demo_machine_parser_cmd_key_offsets[] = { @@ -671,80 +715,86 @@ static const short _demo_machine_parser_cmd_key_offsets[] = { 328, 330, 334, 336, 338, 340, 342, 343, 347, 349, 351, 353, 355, 361, 367, 369, 371, 373, 375, 377, 379, 381, 383, 385, - 391, 393, 395, 397, 403, 405, 407, 409, - 411, 412, 414, 416, 418, 420, 422, 424, - 426, 428, 430, 432, 434, 436, 438, 440, - 441, 447, 449, 451, 453, 455, 457, 459, - 461, 463, 465, 467, 469, 471, 472, 474, - 476, 478, 480, 482, 486, 488, 490, 491, - 493, 495, 497, 499, 501, 502, 507, 509, - 511, 521, 523, 552, 552, 581, 611, 615, - 617, 619, 621, 623, 624, 626, 630, 632, - 634, 636, 638, 640, 668, 700, 730, 732, - 760, 790, 820, 822, 824, 826, 828, 856, - 860, 862, 864, 866, 867, 869, 871, 873, - 875, 877, 879, 881, 909, 937, 939, 941, - 943, 945, 947, 975, 977, 979, 1009, 1011, - 1013, 1015, 1043, 1045, 1047, 1075, 1077, 1079, - 1081, 1109, 1139, 1169, 1173, 1203, 1205, 1207, - 1209, 1211, 1239, 1251, 1253, 1255, 1257, 1259, - 1261, 1263, 1291, 1321, 1323, 1325, 1327, 1355, - 1357, 1359, 1361, 1389, 1391, 1419, 1421, 1423, - 1451, 1453, 1481, 1483, 1485, 1487, 1489, 1491, - 1519, 1549, 1551, 1553, 1581, 1583, 1611, 1613, - 1615, 1643, 1645, 1647, 1675, 1703, 1705, 1733, - 1735, 1737, 1765, 1767, 1769, 1797, 1799, 1801, - 1829, 1831, 1833, 1835, 1863, 1867, 1869, 1871, - 1873, 1901, 1903, 1905, 1907, 1909, 1937, 1967, - 1995, 2027, 2057, 2085, 2115, 2145, 2173, 2201, - 2229, 2257, 2287, 2315, 2343, 2371, 2401, 2431, - 2461, 2489, 2517, 2547, 2575, 2603, 2631, 2659, - 2687, 2715, 2745, 2773, 2801, 2829, 2857, 2885, - 2913, 2941, 2969, 2997, 3025, 3053, 3081, 3147, - 3155, 3161, 3171, 3174, 3177, 3187, 3198, 3203, - 3208, 3213, 3218, 3227, 3238, 3243, 3248, 3253, - 3258, 3263, 3272, 3277, 3282, 3287, 3292, 3297, - 3306, 3315, 3320, 3325, 3334, 3345, 3354, 3365, - 3374, 3383, 3392, 3396, 3400, 3428, 3444, 3448, - 3460, 3476, 3504, 3536, 3556, 3576, 3596, 3616, - 3644, 3676, 3696, 3716, 3736, 3756, 3776, 3804, - 3824, 3844, 3864, 3884, 3904, 3932, 3960, 3980, - 4000, 4028, 4056, 4064, 4072, 4080, 4088, 4112, - 4140, 4148, 4156, 4164, 4172, 4180, 4196, 4204, - 4212, 4220, 4228, 4236, 4260, 4284, 4292, 4300, - 4324, 4388, 4398, 4408, 4444, 4454, 4464, 4474, - 4510, 4522, 4532, 4542, 4552, 4562, 4598, 4610, - 4620, 4630, 4640, 4676, 4686, 4696, 4706, 4742, - 4752, 4762, 4772, 4782, 4792, 4828, 4840, 4850, - 4862, 4898, 4908, 4918, 4928, 4938, 4947, 4959, - 4969, 5005, 5015, 5025, 5035, 5071, 5085, 5099, - 5109, 5119, 5129, 5139, 5149, 5185, 5195, 5205, - 5215, 5225, 5261, 5275, 5285, 5321, 5331, 5367, - 5377, 5413, 5427, 5463, 5473, 5483, 5493, 5503, - 5512, 5522, 5532, 5568, 5578, 5588, 5598, 5634, - 5644, 5654, 5690, 5700, 5736, 5774, 5784, 5794, - 5804, 5840, 5850, 5860, 5870, 5879, 5893, 5903, - 5939, 5949, 5959, 5969, 6005, 6015, 6025, 6035, - 6045, 6081, 6091, 6101, 6111, 6147, 6183, 6193, - 6202, 6238, 6248, 6258, 6268, 6278, 6288, 6324, - 6336, 6346, 6356, 6392, 6401, 6411, 6421, 6431, - 6441, 6451, 6487, 6553, 6587, 6621, 6655, 6689, - 6723, 6757, 6791, 6825, 6859, 6893, 6927, 6961, - 6995, 7029, 7063, 7097, 7131, 7165, 7199, 7235, - 7269, 7303, 7337, 7371, 7405, 7439, 7473, 7507, - 7541, 7575, 7583, 7591, 7599, 7607, 7615, 7627, - 7635, 7643, 7651, 7659, 7671, 7679, 7687, 7693, - 7701, 7709, 7717, 7725, 7733, 7745, 7753, 7761, - 7769, 7777, 7785, 7793, 7801, 7809, 7817, 7825, - 7833, 7841, 7849, 7857, 7865, 7873, 7885, 7893, - 7905, 7913, 7919, 7927, 7935, 7943, 7951, 7957, - 7969, 7977, 7985, 7993, 8001, 8009, 8017, 8025, - 8041, 8057, 8065, 8073, 8081, 8089, 8097, 8105, - 8141, 8149, 8157, 8165, 8173, 8181, 8189, 8195, + 393, 395, 397, 399, 405, 407, 409, 411, + 413, 414, 416, 418, 420, 422, 424, 426, + 428, 430, 432, 433, 439, 441, 445, 447, + 449, 451, 453, 455, 457, 459, 461, 463, + 465, 467, 469, 470, 476, 478, 480, 482, + 484, 486, 488, 490, 492, 494, 496, 498, + 500, 501, 503, 505, 507, 509, 511, 515, + 517, 519, 520, 522, 524, 526, 528, 530, + 531, 536, 538, 540, 550, 552, 581, 581, + 610, 640, 644, 646, 648, 650, 652, 653, + 655, 659, 661, 663, 665, 667, 669, 697, + 729, 759, 761, 789, 819, 849, 851, 853, + 855, 857, 885, 889, 891, 893, 895, 896, + 898, 900, 902, 904, 906, 908, 910, 938, + 966, 968, 970, 972, 974, 976, 1004, 1006, + 1008, 1038, 1040, 1042, 1044, 1072, 1074, 1076, + 1104, 1106, 1108, 1110, 1138, 1168, 1198, 1202, + 1232, 1234, 1236, 1238, 1240, 1268, 1280, 1282, + 1284, 1286, 1288, 1290, 1292, 1320, 1350, 1352, + 1354, 1356, 1384, 1386, 1388, 1390, 1418, 1420, + 1448, 1450, 1452, 1480, 1482, 1510, 1512, 1514, + 1516, 1518, 1520, 1548, 1578, 1580, 1582, 1610, + 1612, 1640, 1642, 1644, 1672, 1674, 1676, 1704, + 1732, 1734, 1762, 1764, 1766, 1794, 1796, 1798, + 1826, 1828, 1830, 1858, 1860, 1862, 1864, 1892, + 1896, 1898, 1900, 1902, 1930, 1932, 1934, 1936, + 1938, 1966, 1996, 2024, 2056, 2086, 2114, 2144, + 2174, 2202, 2230, 2258, 2286, 2316, 2344, 2372, + 2400, 2430, 2460, 2490, 2518, 2546, 2576, 2604, + 2632, 2660, 2688, 2716, 2744, 2774, 2802, 2830, + 2858, 2886, 2914, 2942, 2970, 2998, 3026, 3054, + 3082, 3110, 3176, 3184, 3190, 3200, 3203, 3206, + 3216, 3227, 3232, 3237, 3242, 3247, 3256, 3267, + 3272, 3277, 3282, 3287, 3292, 3301, 3306, 3311, + 3316, 3321, 3326, 3335, 3344, 3349, 3354, 3363, + 3374, 3383, 3394, 3403, 3412, 3421, 3425, 3429, + 3457, 3473, 3477, 3489, 3505, 3533, 3565, 3585, + 3605, 3625, 3645, 3673, 3705, 3725, 3745, 3765, + 3785, 3805, 3833, 3853, 3873, 3893, 3913, 3933, + 3961, 3989, 4009, 4029, 4057, 4085, 4093, 4101, + 4109, 4117, 4141, 4169, 4177, 4185, 4193, 4201, + 4209, 4225, 4233, 4241, 4249, 4257, 4265, 4289, + 4313, 4321, 4329, 4353, 4417, 4427, 4437, 4473, + 4483, 4493, 4503, 4539, 4551, 4561, 4571, 4581, + 4591, 4627, 4639, 4649, 4659, 4669, 4705, 4715, + 4725, 4735, 4771, 4781, 4791, 4801, 4811, 4821, + 4857, 4869, 4879, 4891, 4927, 4937, 4947, 4957, + 4967, 4976, 4988, 4998, 5034, 5044, 5054, 5064, + 5100, 5114, 5128, 5138, 5148, 5158, 5168, 5178, + 5214, 5224, 5234, 5244, 5254, 5290, 5306, 5316, + 5352, 5362, 5398, 5408, 5444, 5458, 5494, 5504, + 5514, 5524, 5534, 5543, 5553, 5563, 5599, 5609, + 5619, 5629, 5665, 5675, 5685, 5721, 5731, 5741, + 5750, 5764, 5774, 5810, 5822, 5832, 5842, 5878, + 5888, 5924, 5934, 5944, 5980, 5990, 6026, 6064, + 6074, 6084, 6094, 6130, 6140, 6150, 6160, 6169, + 6183, 6193, 6229, 6239, 6249, 6259, 6295, 6305, + 6315, 6325, 6335, 6371, 6381, 6391, 6401, 6437, + 6473, 6483, 6492, 6528, 6538, 6548, 6558, 6568, + 6578, 6614, 6626, 6636, 6646, 6682, 6691, 6701, + 6711, 6721, 6731, 6741, 6777, 6843, 6877, 6911, + 6945, 6979, 7013, 7047, 7081, 7115, 7149, 7183, + 7217, 7251, 7285, 7319, 7353, 7387, 7421, 7455, + 7489, 7523, 7557, 7591, 7625, 7661, 7695, 7729, + 7763, 7797, 7831, 7865, 7899, 7933, 7967, 8001, + 8009, 8017, 8025, 8033, 8041, 8053, 8061, 8069, + 8077, 8085, 8097, 8105, 8113, 8119, 8127, 8135, + 8143, 8151, 8159, 8171, 8179, 8187, 8195, 8203, 8211, 8219, 8227, 8235, 8243, 8251, 8259, 8267, - 8275, 8283, 8291, 8299, 8307, 8323, 8331, 8347, - 8355, 8363, 8371, 8379, 8385, 8393, 8401, 8409, - 8417, 8425, 8433, 8441, 8449, 8457, 8465, 8469 + 8275, 8283, 8291, 8299, 8311, 8319, 8331, 8339, + 8345, 8353, 8361, 8369, 8377, 8383, 8395, 8403, + 8411, 8419, 8427, 8435, 8443, 8451, 8467, 8483, + 8491, 8499, 8507, 8515, 8523, 8531, 8567, 8575, + 8583, 8591, 8599, 8607, 8615, 8621, 8637, 8645, + 8653, 8661, 8669, 8677, 8685, 8693, 8701, 8709, + 8717, 8725, 8733, 8753, 8761, 8777, 8785, 8793, + 8801, 8809, 8815, 8823, 8831, 8839, 8847, 8855, + 8863, 8871, 8879, 8887, 8893, 8909, 8917, 8929, + 8937, 8945, 8953, 8961, 8969, 8977, 8985, 8993, + 8997 }; static const short _demo_machine_parser_cmd_trans_keys[] = { @@ -796,546 +846,605 @@ static const short _demo_machine_parser_cmd_trans_keys[] = { 119, 83, 84, 89, 115, 116, 121, 83, 115, 87, 119, 79, 111, 82, 114, 68, 100, 69, 101, 65, 97, 76, 108, 77, - 109, 69, 73, 77, 101, 105, 109, 67, - 99, 79, 111, 80, 112, 68, 71, 76, - 100, 103, 108, 67, 99, 79, 111, 77, - 109, 80, 112, 45, 73, 105, 68, 100, - 69, 101, 78, 110, 84, 116, 83, 115, - 67, 99, 72, 104, 79, 111, 65, 97, - 68, 100, 83, 115, 67, 99, 70, 102, - 45, 73, 80, 84, 105, 112, 116, 80, - 112, 79, 111, 82, 114, 84, 116, 82, - 114, 65, 97, 78, 110, 83, 115, 79, - 111, 82, 114, 84, 116, 86, 118, 54, - 80, 112, 73, 105, 82, 114, 69, 101, - 83, 115, 65, 83, 97, 115, 77, 109, - 69, 101, 45, 78, 110, 65, 97, 80, - 112, 84, 116, 82, 114, 62, 35, 37, - 43, 45, 62, 896, 1151, 896, 1151, 288, - 544, 265, 269, 384, 520, 521, 525, 526, - 639, 384, 639, 43, 65, 67, 68, 69, - 70, 72, 76, 77, 79, 80, 81, 82, - 83, 86, 97, 99, 100, 101, 102, 104, - 108, 109, 111, 112, 113, 114, 115, 118, + 109, 69, 73, 77, 84, 101, 105, 109, + 116, 67, 99, 79, 111, 80, 112, 68, + 71, 76, 100, 103, 108, 67, 99, 79, + 111, 77, 109, 80, 112, 45, 73, 105, + 68, 100, 69, 101, 78, 110, 84, 116, + 83, 115, 67, 99, 85, 117, 78, 110, + 45, 73, 80, 85, 105, 112, 117, 80, + 112, 79, 87, 111, 119, 82, 114, 84, + 116, 68, 100, 83, 115, 82, 114, 72, + 104, 79, 111, 65, 97, 68, 100, 83, + 115, 67, 99, 70, 102, 45, 73, 80, + 84, 105, 112, 116, 80, 112, 79, 111, + 82, 114, 84, 116, 82, 114, 65, 97, + 78, 110, 83, 115, 79, 111, 82, 114, + 84, 116, 86, 118, 54, 80, 112, 73, + 105, 82, 114, 69, 101, 83, 115, 65, + 83, 97, 115, 77, 109, 69, 101, 45, + 78, 110, 65, 97, 80, 112, 84, 116, + 82, 114, 62, 35, 37, 43, 45, 62, + 896, 1151, 896, 1151, 288, 544, 265, 269, + 384, 520, 521, 525, 526, 639, 384, 639, 43, 65, 67, 68, 69, 70, 72, 76, 77, 79, 80, 81, 82, 83, 86, 97, 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 65, 67, 68, - 69, 70, 72, 76, 77, 79, 80, 81, - 82, 83, 85, 86, 97, 99, 100, 101, + 112, 113, 114, 115, 118, 43, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, 102, 104, 108, 109, 111, 112, 113, 114, - 115, 117, 118, 79, 83, 111, 115, 78, - 110, 70, 102, 73, 105, 71, 103, 45, - 83, 115, 69, 84, 101, 116, 83, 115, - 83, 115, 73, 105, 79, 111, 78, 110, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 85, + 86, 97, 99, 100, 101, 102, 104, 108, + 109, 111, 112, 113, 114, 115, 117, 118, + 79, 83, 111, 115, 78, 110, 70, 102, + 73, 105, 71, 103, 45, 83, 115, 69, + 84, 101, 116, 83, 115, 83, 115, 73, + 105, 79, 111, 78, 110, 65, 67, 68, + 69, 70, 72, 76, 77, 79, 80, 81, + 82, 83, 86, 97, 99, 100, 101, 102, + 104, 108, 109, 111, 112, 113, 114, 115, + 118, 65, 67, 68, 69, 70, 72, 76, + 77, 79, 80, 81, 82, 83, 84, 85, + 86, 97, 99, 100, 101, 102, 104, 108, + 109, 111, 112, 113, 114, 115, 116, 117, + 118, 65, 67, 68, 69, 70, 72, 76, + 77, 79, 80, 81, 82, 83, 86, 88, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 120, 84, + 116, 65, 67, 68, 69, 70, 72, 76, + 77, 79, 80, 81, 82, 83, 86, 97, + 99, 100, 101, 102, 104, 108, 109, 111, + 112, 113, 114, 115, 118, 65, 67, 68, + 69, 70, 72, 73, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 105, 108, 109, 111, 112, 113, + 114, 115, 118, 65, 67, 68, 69, 70, + 72, 76, 77, 79, 80, 81, 82, 83, + 85, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 117, + 118, 78, 110, 71, 103, 85, 117, 80, + 112, 65, 67, 68, 69, 70, 72, 76, + 77, 79, 80, 81, 82, 83, 86, 97, + 99, 100, 101, 102, 104, 108, 109, 111, + 112, 113, 114, 115, 118, 65, 77, 97, + 109, 82, 114, 71, 103, 69, 101, 45, + 77, 109, 69, 101, 83, 115, 83, 115, + 65, 97, 71, 103, 69, 101, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 83, 115, + 83, 115, 65, 97, 71, 103, 69, 101, 65, 67, 68, 69, 70, 72, 76, 77, 79, 80, 81, 82, 83, 86, 97, 99, 100, 101, 102, 104, 108, 109, 111, 112, - 113, 114, 115, 118, 65, 67, 68, 69, + 113, 114, 115, 118, 80, 112, 84, 116, + 65, 67, 68, 69, 70, 72, 73, 76, + 77, 79, 80, 81, 82, 83, 86, 97, + 99, 100, 101, 102, 104, 105, 108, 109, + 111, 112, 113, 114, 115, 118, 79, 111, + 78, 110, 83, 115, 65, 67, 68, 69, 70, 72, 76, 77, 79, 80, 81, 82, - 83, 84, 85, 86, 97, 99, 100, 101, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 85, 117, 66, 98, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 73, 105, 83, 115, 72, 104, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, 102, 104, 108, 109, 111, 112, 113, 114, - 115, 116, 117, 118, 65, 67, 68, 69, - 70, 72, 76, 77, 79, 80, 81, 82, - 83, 86, 88, 97, 99, 100, 101, 102, - 104, 108, 109, 111, 112, 113, 114, 115, - 118, 120, 84, 116, 65, 67, 68, 69, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 85, + 86, 97, 99, 100, 101, 102, 104, 108, + 109, 111, 112, 113, 114, 115, 117, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 85, 86, 97, + 99, 100, 101, 102, 104, 108, 109, 111, + 112, 113, 114, 115, 117, 118, 71, 83, + 103, 115, 65, 67, 68, 69, 70, 72, + 73, 76, 77, 79, 80, 81, 82, 83, + 86, 97, 99, 100, 101, 102, 104, 105, + 108, 109, 111, 112, 113, 114, 115, 118, + 83, 115, 84, 116, 69, 101, 82, 114, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 67, 76, 77, 78, + 84, 85, 99, 108, 109, 110, 116, 117, + 69, 101, 78, 110, 65, 97, 82, 114, + 73, 105, 79, 111, 65, 67, 68, 69, 70, 72, 76, 77, 79, 80, 81, 82, 83, 86, 97, 99, 100, 101, 102, 104, 108, 109, 111, 112, 113, 114, 115, 118, 65, 67, 68, 69, 70, 72, 73, 76, 77, 79, 80, 81, 82, 83, 86, 97, 99, 100, 101, 102, 104, 105, 108, 109, + 111, 112, 113, 114, 115, 118, 68, 100, + 69, 101, 79, 111, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 69, 101, 69, 101, 80, 112, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 83, 115, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 79, 111, 80, 112, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 66, 98, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 67, 99, + 82, 114, 73, 105, 66, 98, 69, 101, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 85, 86, 97, 99, 100, 101, 102, + 104, 108, 109, 111, 112, 113, 114, 115, + 117, 118, 77, 109, 69, 101, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 78, 110, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 73, 105, 84, 116, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 76, 108, 80, 112, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 68, 100, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 76, 108, 69, 101, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 77, 109, 70, 102, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 77, 109, 80, 112, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 97, 67, 99, 75, 107, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 83, 84, 115, 116, + 68, 100, 73, 105, 79, 111, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 73, 105, 68, 100, 69, 101, + 79, 111, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, 111, 112, 113, 114, 115, 118, 65, 67, 68, 69, 70, 72, 76, 77, 79, 80, 81, 82, 83, 85, 86, 97, 99, 100, 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 117, 118, 78, 110, 71, 103, - 85, 117, 80, 112, 65, 67, 68, 69, + 114, 115, 117, 118, 65, 67, 68, 69, 70, 72, 76, 77, 79, 80, 81, 82, 83, 86, 97, 99, 100, 101, 102, 104, 108, 109, 111, 112, 113, 114, 115, 118, - 65, 77, 97, 109, 82, 114, 71, 103, - 69, 101, 45, 77, 109, 69, 101, 83, - 115, 83, 115, 65, 97, 71, 103, 69, - 101, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 84, 85, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 116, 117, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 88, 97, 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 65, 67, 68, - 69, 70, 72, 76, 77, 79, 80, 81, - 82, 83, 86, 97, 99, 100, 101, 102, - 104, 108, 109, 111, 112, 113, 114, 115, - 118, 83, 115, 83, 115, 65, 97, 71, - 103, 69, 101, 65, 67, 68, 69, 70, - 72, 76, 77, 79, 80, 81, 82, 83, - 86, 97, 99, 100, 101, 102, 104, 108, - 109, 111, 112, 113, 114, 115, 118, 80, - 112, 84, 116, 65, 67, 68, 69, 70, - 72, 73, 76, 77, 79, 80, 81, 82, - 83, 86, 97, 99, 100, 101, 102, 104, - 105, 108, 109, 111, 112, 113, 114, 115, - 118, 79, 111, 78, 110, 83, 115, 65, - 67, 68, 69, 70, 72, 76, 77, 79, - 80, 81, 82, 83, 86, 97, 99, 100, - 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 118, 85, 117, 66, 98, 65, - 67, 68, 69, 70, 72, 76, 77, 79, - 80, 81, 82, 83, 86, 97, 99, 100, - 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 118, 73, 105, 83, 115, 72, - 104, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 65, 67, 68, - 69, 70, 72, 76, 77, 79, 80, 81, - 82, 83, 85, 86, 97, 99, 100, 101, + 112, 113, 114, 115, 118, 120, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, 102, 104, 108, 109, 111, 112, 113, 114, - 115, 117, 118, 65, 67, 68, 69, 70, - 72, 76, 77, 79, 80, 81, 82, 83, - 85, 86, 97, 99, 100, 101, 102, 104, - 108, 109, 111, 112, 113, 114, 115, 117, - 118, 71, 83, 103, 115, 65, 67, 68, - 69, 70, 72, 73, 76, 77, 79, 80, - 81, 82, 83, 86, 97, 99, 100, 101, - 102, 104, 105, 108, 109, 111, 112, 113, - 114, 115, 118, 83, 115, 84, 116, 69, - 101, 82, 114, 65, 67, 68, 69, 70, - 72, 76, 77, 79, 80, 81, 82, 83, - 86, 97, 99, 100, 101, 102, 104, 108, - 109, 111, 112, 113, 114, 115, 118, 67, - 76, 77, 78, 84, 85, 99, 108, 109, - 110, 116, 117, 69, 101, 78, 110, 65, - 97, 82, 114, 73, 105, 79, 111, 65, - 67, 68, 69, 70, 72, 76, 77, 79, - 80, 81, 82, 83, 86, 97, 99, 100, - 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 118, 65, 67, 68, 69, 70, - 72, 73, 76, 77, 79, 80, 81, 82, - 83, 86, 97, 99, 100, 101, 102, 104, - 105, 108, 109, 111, 112, 113, 114, 115, - 118, 68, 100, 69, 101, 79, 111, 65, - 67, 68, 69, 70, 72, 76, 77, 79, - 80, 81, 82, 83, 86, 97, 99, 100, - 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 118, 69, 101, 69, 101, 80, - 112, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 83, 115, 65, - 67, 68, 69, 70, 72, 76, 77, 79, - 80, 81, 82, 83, 86, 97, 99, 100, - 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 118, 79, 111, 80, 112, 65, - 67, 68, 69, 70, 72, 76, 77, 79, - 80, 81, 82, 83, 86, 97, 99, 100, - 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 118, 66, 98, 65, 67, 68, - 69, 70, 72, 76, 77, 79, 80, 81, - 82, 83, 86, 97, 99, 100, 101, 102, - 104, 108, 109, 111, 112, 113, 114, 115, - 118, 67, 99, 82, 114, 73, 105, 66, - 98, 69, 101, 65, 67, 68, 69, 70, - 72, 76, 77, 79, 80, 81, 82, 83, - 86, 97, 99, 100, 101, 102, 104, 108, - 109, 111, 112, 113, 114, 115, 118, 65, - 67, 68, 69, 70, 72, 76, 77, 79, - 80, 81, 82, 83, 85, 86, 97, 99, - 100, 101, 102, 104, 108, 109, 111, 112, - 113, 114, 115, 117, 118, 77, 109, 69, - 101, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 78, 110, 65, - 67, 68, 69, 70, 72, 76, 77, 79, - 80, 81, 82, 83, 86, 97, 99, 100, - 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 118, 73, 105, 84, 116, 65, - 67, 68, 69, 70, 72, 76, 77, 79, - 80, 81, 82, 83, 86, 97, 99, 100, - 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 118, 76, 108, 80, 112, 65, - 67, 68, 69, 70, 72, 76, 77, 79, - 80, 81, 82, 83, 86, 97, 99, 100, - 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 118, 65, 67, 68, 69, 70, - 72, 76, 77, 79, 80, 81, 82, 83, - 86, 97, 99, 100, 101, 102, 104, 108, - 109, 111, 112, 113, 114, 115, 118, 68, - 100, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 76, 108, 69, - 101, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 77, 109, 70, - 102, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 77, 109, 80, - 112, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 65, 97, 67, - 99, 75, 107, 65, 67, 68, 69, 70, - 72, 76, 77, 79, 80, 81, 82, 83, - 86, 97, 99, 100, 101, 102, 104, 108, - 109, 111, 112, 113, 114, 115, 118, 83, - 84, 115, 116, 68, 100, 73, 105, 79, - 111, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 73, 105, 68, - 100, 69, 101, 79, 111, 65, 67, 68, - 69, 70, 72, 76, 77, 79, 80, 81, - 82, 83, 86, 97, 99, 100, 101, 102, - 104, 108, 109, 111, 112, 113, 114, 115, - 118, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 85, 86, - 97, 99, 100, 101, 102, 104, 108, 109, - 111, 112, 113, 114, 115, 117, 118, 65, - 67, 68, 69, 70, 72, 76, 77, 79, - 80, 81, 82, 83, 86, 97, 99, 100, - 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 118, 65, 67, 68, 69, 70, - 72, 76, 77, 79, 80, 81, 82, 83, - 84, 85, 86, 97, 99, 100, 101, 102, - 104, 108, 109, 111, 112, 113, 114, 115, - 116, 117, 118, 65, 67, 68, 69, 70, - 72, 76, 77, 79, 80, 81, 82, 83, - 86, 88, 97, 99, 100, 101, 102, 104, + 115, 118, 65, 67, 68, 69, 70, 72, + 73, 76, 77, 79, 80, 81, 82, 83, + 86, 97, 99, 100, 101, 102, 104, 105, 108, 109, 111, 112, 113, 114, 115, 118, - 120, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 85, 86, 97, 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 65, 67, 68, - 69, 70, 72, 73, 76, 77, 79, 80, + 112, 113, 114, 115, 117, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, 81, 82, 83, 86, 97, 99, 100, 101, - 102, 104, 105, 108, 109, 111, 112, 113, - 114, 115, 118, 65, 67, 68, 69, 70, - 72, 76, 77, 79, 80, 81, 82, 83, - 85, 86, 97, 99, 100, 101, 102, 104, - 108, 109, 111, 112, 113, 114, 115, 117, - 118, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 65, 67, 68, - 69, 70, 72, 76, 77, 79, 80, 81, - 82, 83, 86, 97, 99, 100, 101, 102, - 104, 108, 109, 111, 112, 113, 114, 115, - 118, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 65, 67, 68, - 69, 70, 72, 76, 77, 79, 80, 81, - 82, 83, 86, 97, 99, 100, 101, 102, - 104, 108, 109, 111, 112, 113, 114, 115, - 118, 65, 67, 68, 69, 70, 72, 73, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, 76, 77, 79, 80, 81, 82, 83, 86, - 97, 99, 100, 101, 102, 104, 105, 108, - 109, 111, 112, 113, 114, 115, 118, 65, - 67, 68, 69, 70, 72, 76, 77, 79, - 80, 81, 82, 83, 86, 97, 99, 100, - 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 118, 65, 67, 68, 69, 70, - 72, 76, 77, 79, 80, 81, 82, 83, - 86, 97, 99, 100, 101, 102, 104, 108, - 109, 111, 112, 113, 114, 115, 118, 65, - 67, 68, 69, 70, 72, 76, 77, 79, - 80, 81, 82, 83, 86, 97, 99, 100, - 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 118, 65, 67, 68, 69, 70, - 72, 76, 77, 79, 80, 81, 82, 83, - 85, 86, 97, 99, 100, 101, 102, 104, - 108, 109, 111, 112, 113, 114, 115, 117, - 118, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 85, 86, 97, 99, 100, 101, 102, 104, 108, 109, - 111, 112, 113, 114, 115, 117, 118, 65, - 67, 68, 69, 70, 72, 73, 76, 77, - 79, 80, 81, 82, 83, 86, 97, 99, - 100, 101, 102, 104, 105, 108, 109, 111, - 112, 113, 114, 115, 118, 65, 67, 68, - 69, 70, 72, 76, 77, 79, 80, 81, - 82, 83, 86, 97, 99, 100, 101, 102, - 104, 108, 109, 111, 112, 113, 114, 115, - 118, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 65, 67, 68, - 69, 70, 72, 73, 76, 77, 79, 80, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, 81, 82, 83, 86, 97, 99, 100, 101, - 102, 104, 105, 108, 109, 111, 112, 113, - 114, 115, 118, 65, 67, 68, 69, 70, - 72, 76, 77, 79, 80, 81, 82, 83, - 86, 97, 99, 100, 101, 102, 104, 108, - 109, 111, 112, 113, 114, 115, 118, 65, - 67, 68, 69, 70, 72, 76, 77, 79, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 73, 76, 77, 79, 80, 81, 82, 83, 86, 97, 99, 100, + 101, 102, 104, 105, 108, 109, 111, 112, + 113, 114, 115, 118, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 85, 86, 97, + 99, 100, 101, 102, 104, 108, 109, 111, + 112, 113, 114, 115, 117, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 85, 86, 97, 99, 100, 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 118, 65, 67, 68, 69, 70, - 72, 76, 77, 79, 80, 81, 82, 83, - 86, 97, 99, 100, 101, 102, 104, 108, - 109, 111, 112, 113, 114, 115, 118, 65, - 67, 68, 69, 70, 72, 76, 77, 79, - 80, 81, 82, 83, 86, 97, 99, 100, - 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 118, 65, 67, 68, 69, 70, - 72, 76, 77, 79, 80, 81, 82, 83, - 86, 97, 99, 100, 101, 102, 104, 108, - 109, 111, 112, 113, 114, 115, 118, 65, - 67, 68, 69, 70, 72, 76, 77, 79, - 80, 81, 82, 83, 86, 97, 99, 100, - 101, 102, 104, 108, 109, 111, 112, 113, - 114, 115, 118, 65, 67, 68, 69, 70, - 72, 76, 77, 79, 80, 81, 82, 83, - 85, 86, 97, 99, 100, 101, 102, 104, - 108, 109, 111, 112, 113, 114, 115, 117, - 118, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 65, 67, 68, - 69, 70, 72, 76, 77, 79, 80, 81, + 114, 115, 117, 118, 65, 67, 68, 69, + 70, 72, 73, 76, 77, 79, 80, 81, 82, 83, 86, 97, 99, 100, 101, 102, - 104, 108, 109, 111, 112, 113, 114, 115, - 118, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, + 104, 105, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 73, 76, 77, 79, 80, 81, 82, 83, + 86, 97, 99, 100, 101, 102, 104, 105, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 85, 86, 97, 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 65, 67, 68, - 69, 70, 72, 76, 77, 79, 80, 81, - 82, 83, 86, 97, 99, 100, 101, 102, - 104, 108, 109, 111, 112, 113, 114, 115, - 118, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 65, 67, 68, - 69, 70, 72, 76, 77, 79, 80, 81, - 82, 83, 86, 97, 99, 100, 101, 102, - 104, 108, 109, 111, 112, 113, 114, 115, - 118, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 65, 67, 68, - 69, 70, 72, 76, 77, 79, 80, 81, - 82, 83, 86, 97, 99, 100, 101, 102, - 104, 108, 109, 111, 112, 113, 114, 115, - 118, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 65, 67, 68, - 69, 70, 72, 76, 77, 79, 80, 81, - 82, 83, 86, 97, 99, 100, 101, 102, - 104, 108, 109, 111, 112, 113, 114, 115, - 118, 65, 67, 68, 69, 70, 72, 76, - 77, 79, 80, 81, 82, 83, 86, 97, - 99, 100, 101, 102, 104, 108, 109, 111, - 112, 113, 114, 115, 118, 65, 67, 68, - 69, 70, 72, 76, 77, 79, 80, 81, - 82, 83, 86, 97, 99, 100, 101, 102, - 104, 108, 109, 111, 112, 113, 114, 115, - 118, 288, 301, 320, 321, 323, 324, 325, + 112, 113, 114, 115, 117, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 288, 301, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 557, 576, + 577, 579, 580, 581, 582, 584, 585, 588, + 591, 592, 594, 595, 596, 600, 609, 611, + 612, 613, 614, 616, 617, 620, 623, 624, + 626, 627, 628, 632, 128, 383, 384, 639, + 288, 320, 544, 576, 128, 383, 384, 639, + 288, 320, 544, 576, 384, 639, 32, 64, + 65, 82, 83, 97, 114, 115, 9, 13, + 32, 9, 13, 32, 9, 13, 32, 64, + 65, 82, 83, 97, 114, 115, 9, 13, + 32, 65, 67, 82, 83, 97, 99, 114, + 115, 9, 13, 32, 84, 116, 9, 13, + 32, 73, 105, 9, 13, 32, 79, 111, + 9, 13, 32, 78, 110, 9, 13, 32, + 65, 82, 83, 97, 114, 115, 9, 13, + 32, 65, 69, 82, 83, 97, 101, 114, + 115, 9, 13, 32, 81, 113, 9, 13, + 32, 85, 117, 9, 13, 32, 69, 101, + 9, 13, 32, 83, 115, 9, 13, 32, + 84, 116, 9, 13, 32, 69, 83, 84, + 101, 115, 116, 9, 13, 32, 83, 115, + 9, 13, 32, 83, 115, 9, 13, 32, + 73, 105, 9, 13, 32, 79, 111, 9, + 13, 32, 78, 110, 9, 13, 32, 65, + 82, 83, 97, 114, 115, 9, 13, 32, + 65, 82, 83, 97, 114, 115, 9, 13, + 32, 67, 99, 9, 13, 32, 75, 107, + 9, 13, 32, 65, 82, 83, 97, 114, + 115, 9, 13, 32, 65, 67, 82, 83, + 97, 99, 114, 115, 9, 13, 32, 65, + 82, 83, 97, 114, 115, 9, 13, 32, + 65, 69, 82, 83, 97, 101, 114, 115, + 9, 13, 32, 65, 82, 83, 97, 114, + 115, 9, 13, 32, 65, 82, 83, 97, + 114, 115, 9, 13, 32, 65, 82, 83, + 97, 114, 115, 9, 13, 320, 576, 384, + 639, 320, 576, 384, 639, 288, 320, 321, + 338, 339, 353, 370, 371, 544, 576, 577, + 594, 595, 609, 626, 627, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 544, 576, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 32, 64, 9, 13, 288, 320, 544, + 576, 265, 269, 384, 520, 521, 525, 526, + 639, 288, 320, 544, 576, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 321, 338, 339, 353, 370, + 371, 544, 576, 577, 594, 595, 609, 626, + 627, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 321, + 323, 338, 339, 353, 355, 370, 371, 544, + 576, 577, 579, 594, 595, 609, 611, 626, + 627, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 340, + 372, 544, 576, 596, 628, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 329, 361, 544, 576, 585, + 617, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 335, + 367, 544, 576, 591, 623, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 334, 366, 544, 576, 590, + 622, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 321, + 338, 339, 353, 370, 371, 544, 576, 577, + 594, 595, 609, 626, 627, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 321, 325, 338, 339, 353, + 357, 370, 371, 544, 576, 577, 581, 594, + 595, 609, 613, 626, 627, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 337, 369, 544, 576, 593, + 625, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 341, + 373, 544, 576, 597, 629, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 325, 357, 544, 576, 581, + 613, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 339, + 371, 544, 576, 595, 627, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 340, 372, 544, 576, 596, + 628, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 325, + 339, 340, 357, 371, 372, 544, 576, 581, + 595, 596, 613, 627, 628, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 339, 371, 544, 576, 595, + 627, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 339, + 371, 544, 576, 595, 627, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 329, 361, 544, 576, 585, + 617, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 335, + 367, 544, 576, 591, 623, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 334, 366, 544, 576, 590, + 622, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 321, + 338, 339, 353, 370, 371, 544, 576, 577, + 594, 595, 609, 626, 627, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 321, 338, 339, 353, 370, + 371, 544, 576, 577, 594, 595, 609, 626, + 627, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 323, + 355, 544, 576, 579, 611, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 331, 363, 544, 576, 587, + 619, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 321, + 338, 339, 353, 370, 371, 544, 576, 577, + 594, 595, 609, 626, 627, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 321, 323, 338, 339, 353, + 355, 370, 371, 544, 576, 577, 579, 594, + 595, 609, 611, 626, 627, 265, 269, 384, + 520, 521, 525, 526, 639, 320, 340, 372, + 576, 596, 628, 384, 639, 320, 329, 361, + 576, 585, 617, 384, 639, 320, 335, 367, + 576, 591, 623, 384, 639, 320, 334, 366, + 576, 590, 622, 384, 639, 288, 320, 321, + 338, 339, 353, 370, 371, 544, 576, 577, + 594, 595, 609, 626, 627, 265, 269, 384, + 520, 521, 525, 526, 639, 288, 320, 321, + 325, 338, 339, 353, 357, 370, 371, 544, + 576, 577, 581, 594, 595, 609, 613, 626, + 627, 265, 269, 384, 520, 521, 525, 526, + 639, 320, 337, 369, 576, 593, 625, 384, + 639, 320, 341, 373, 576, 597, 629, 384, + 639, 320, 325, 357, 576, 581, 613, 384, + 639, 320, 339, 371, 576, 595, 627, 384, + 639, 320, 340, 372, 576, 596, 628, 384, + 639, 320, 325, 339, 340, 357, 371, 372, + 576, 581, 595, 596, 613, 627, 628, 384, + 639, 320, 339, 371, 576, 595, 627, 384, + 639, 320, 339, 371, 576, 595, 627, 384, + 639, 320, 329, 361, 576, 585, 617, 384, + 639, 320, 335, 367, 576, 591, 623, 384, + 639, 320, 334, 366, 576, 590, 622, 384, + 639, 288, 320, 321, 338, 339, 353, 370, + 371, 544, 576, 577, 594, 595, 609, 626, + 627, 265, 269, 384, 520, 521, 525, 526, + 639, 288, 320, 321, 338, 339, 353, 370, + 371, 544, 576, 577, 594, 595, 609, 626, + 627, 265, 269, 384, 520, 521, 525, 526, + 639, 320, 323, 355, 576, 579, 611, 384, + 639, 320, 331, 363, 576, 587, 619, 384, + 639, 288, 320, 321, 338, 339, 353, 370, + 371, 544, 576, 577, 594, 595, 609, 626, + 627, 265, 269, 384, 520, 521, 525, 526, + 639, 288, 301, 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, 368, 370, 371, 372, 376, - 544, 557, 576, 577, 579, 580, 581, 582, - 584, 585, 588, 591, 592, 594, 595, 596, - 600, 609, 611, 612, 613, 614, 616, 617, - 620, 623, 624, 626, 627, 628, 632, 128, - 383, 384, 639, 288, 320, 544, 576, 128, - 383, 384, 639, 288, 320, 544, 576, 384, - 639, 32, 64, 65, 82, 83, 97, 114, - 115, 9, 13, 32, 9, 13, 32, 9, - 13, 32, 64, 65, 82, 83, 97, 114, - 115, 9, 13, 32, 65, 67, 82, 83, - 97, 99, 114, 115, 9, 13, 32, 84, - 116, 9, 13, 32, 73, 105, 9, 13, - 32, 79, 111, 9, 13, 32, 78, 110, - 9, 13, 32, 65, 82, 83, 97, 114, - 115, 9, 13, 32, 65, 69, 82, 83, - 97, 101, 114, 115, 9, 13, 32, 81, - 113, 9, 13, 32, 85, 117, 9, 13, - 32, 69, 101, 9, 13, 32, 83, 115, - 9, 13, 32, 84, 116, 9, 13, 32, - 69, 83, 84, 101, 115, 116, 9, 13, - 32, 83, 115, 9, 13, 32, 83, 115, - 9, 13, 32, 73, 105, 9, 13, 32, - 79, 111, 9, 13, 32, 78, 110, 9, - 13, 32, 65, 82, 83, 97, 114, 115, - 9, 13, 32, 65, 82, 83, 97, 114, - 115, 9, 13, 32, 67, 99, 9, 13, - 32, 75, 107, 9, 13, 32, 65, 82, - 83, 97, 114, 115, 9, 13, 32, 65, - 67, 82, 83, 97, 99, 114, 115, 9, - 13, 32, 65, 82, 83, 97, 114, 115, - 9, 13, 32, 65, 69, 82, 83, 97, - 101, 114, 115, 9, 13, 32, 65, 82, - 83, 97, 114, 115, 9, 13, 32, 65, - 82, 83, 97, 114, 115, 9, 13, 32, - 65, 82, 83, 97, 114, 115, 9, 13, - 320, 576, 384, 639, 320, 576, 384, 639, - 288, 320, 321, 338, 339, 353, 370, 371, - 544, 576, 577, 594, 595, 609, 626, 627, - 128, 264, 265, 269, 270, 383, 384, 520, - 521, 525, 526, 639, 288, 320, 544, 576, - 128, 264, 265, 269, 270, 383, 384, 520, - 521, 525, 526, 639, 32, 64, 9, 13, - 288, 320, 544, 576, 265, 269, 384, 520, - 521, 525, 526, 639, 288, 320, 544, 576, - 128, 264, 265, 269, 270, 383, 384, 520, - 521, 525, 526, 639, 288, 320, 321, 338, - 339, 353, 370, 371, 544, 576, 577, 594, - 595, 609, 626, 627, 128, 264, 265, 269, - 270, 383, 384, 520, 521, 525, 526, 639, - 288, 320, 321, 323, 338, 339, 353, 355, - 370, 371, 544, 576, 577, 579, 594, 595, - 609, 611, 626, 627, 128, 264, 265, 269, - 270, 383, 384, 520, 521, 525, 526, 639, - 288, 320, 340, 372, 544, 576, 596, 628, - 128, 264, 265, 269, 270, 383, 384, 520, - 521, 525, 526, 639, 288, 320, 329, 361, - 544, 576, 585, 617, 128, 264, 265, 269, - 270, 383, 384, 520, 521, 525, 526, 639, - 288, 320, 335, 367, 544, 576, 591, 623, - 128, 264, 265, 269, 270, 383, 384, 520, - 521, 525, 526, 639, 288, 320, 334, 366, - 544, 576, 590, 622, 128, 264, 265, 269, - 270, 383, 384, 520, 521, 525, 526, 639, - 288, 320, 321, 338, 339, 353, 370, 371, - 544, 576, 577, 594, 595, 609, 626, 627, - 128, 264, 265, 269, 270, 383, 384, 520, - 521, 525, 526, 639, 288, 320, 321, 325, - 338, 339, 353, 357, 370, 371, 544, 576, - 577, 581, 594, 595, 609, 613, 626, 627, - 128, 264, 265, 269, 270, 383, 384, 520, - 521, 525, 526, 639, 288, 320, 337, 369, - 544, 576, 593, 625, 128, 264, 265, 269, - 270, 383, 384, 520, 521, 525, 526, 639, - 288, 320, 341, 373, 544, 576, 597, 629, - 128, 264, 265, 269, 270, 383, 384, 520, - 521, 525, 526, 639, 288, 320, 325, 357, - 544, 576, 581, 613, 128, 264, 265, 269, - 270, 383, 384, 520, 521, 525, 526, 639, - 288, 320, 339, 371, 544, 576, 595, 627, - 128, 264, 265, 269, 270, 383, 384, 520, - 521, 525, 526, 639, 288, 320, 340, 372, - 544, 576, 596, 628, 128, 264, 265, 269, - 270, 383, 384, 520, 521, 525, 526, 639, - 288, 320, 325, 339, 340, 357, 371, 372, - 544, 576, 581, 595, 596, 613, 627, 628, - 128, 264, 265, 269, 270, 383, 384, 520, - 521, 525, 526, 639, 288, 320, 339, 371, - 544, 576, 595, 627, 128, 264, 265, 269, - 270, 383, 384, 520, 521, 525, 526, 639, - 288, 320, 339, 371, 544, 576, 595, 627, - 128, 264, 265, 269, 270, 383, 384, 520, - 521, 525, 526, 639, 288, 320, 329, 361, - 544, 576, 585, 617, 128, 264, 265, 269, - 270, 383, 384, 520, 521, 525, 526, 639, - 288, 320, 335, 367, 544, 576, 591, 623, - 128, 264, 265, 269, 270, 383, 384, 520, - 521, 525, 526, 639, 288, 320, 334, 366, - 544, 576, 590, 622, 128, 264, 265, 269, - 270, 383, 384, 520, 521, 525, 526, 639, - 288, 320, 321, 338, 339, 353, 370, 371, - 544, 576, 577, 594, 595, 609, 626, 627, - 128, 264, 265, 269, 270, 383, 384, 520, - 521, 525, 526, 639, 288, 320, 321, 338, - 339, 353, 370, 371, 544, 576, 577, 594, - 595, 609, 626, 627, 128, 264, 265, 269, - 270, 383, 384, 520, 521, 525, 526, 639, - 288, 320, 323, 355, 544, 576, 579, 611, - 128, 264, 265, 269, 270, 383, 384, 520, - 521, 525, 526, 639, 288, 320, 331, 363, - 544, 576, 587, 619, 128, 264, 265, 269, - 270, 383, 384, 520, 521, 525, 526, 639, - 288, 320, 321, 338, 339, 353, 370, 371, - 544, 576, 577, 594, 595, 609, 626, 627, - 128, 264, 265, 269, 270, 383, 384, 520, - 521, 525, 526, 639, 288, 320, 321, 323, - 338, 339, 353, 355, 370, 371, 544, 576, - 577, 579, 594, 595, 609, 611, 626, 627, - 265, 269, 384, 520, 521, 525, 526, 639, - 320, 340, 372, 576, 596, 628, 384, 639, - 320, 329, 361, 576, 585, 617, 384, 639, - 320, 335, 367, 576, 591, 623, 384, 639, - 320, 334, 366, 576, 590, 622, 384, 639, - 288, 320, 321, 338, 339, 353, 370, 371, - 544, 576, 577, 594, 595, 609, 626, 627, - 265, 269, 384, 520, 521, 525, 526, 639, - 288, 320, 321, 325, 338, 339, 353, 357, - 370, 371, 544, 576, 577, 581, 594, 595, - 609, 613, 626, 627, 265, 269, 384, 520, - 521, 525, 526, 639, 320, 337, 369, 576, - 593, 625, 384, 639, 320, 341, 373, 576, - 597, 629, 384, 639, 320, 325, 357, 576, - 581, 613, 384, 639, 320, 339, 371, 576, - 595, 627, 384, 639, 320, 340, 372, 576, - 596, 628, 384, 639, 320, 325, 339, 340, - 357, 371, 372, 576, 581, 595, 596, 613, - 627, 628, 384, 639, 320, 339, 371, 576, - 595, 627, 384, 639, 320, 339, 371, 576, - 595, 627, 384, 639, 320, 329, 361, 576, - 585, 617, 384, 639, 320, 335, 367, 576, - 591, 623, 384, 639, 320, 334, 366, 576, - 590, 622, 384, 639, 288, 320, 321, 338, - 339, 353, 370, 371, 544, 576, 577, 594, - 595, 609, 626, 627, 265, 269, 384, 520, - 521, 525, 526, 639, 288, 320, 321, 338, - 339, 353, 370, 371, 544, 576, 577, 594, - 595, 609, 626, 627, 265, 269, 384, 520, - 521, 525, 526, 639, 320, 323, 355, 576, - 579, 611, 384, 639, 320, 331, 363, 576, - 587, 619, 384, 639, 288, 320, 321, 338, - 339, 353, 370, 371, 544, 576, 577, 594, - 595, 609, 626, 627, 265, 269, 384, 520, - 521, 525, 526, 639, 288, 301, 320, 321, + 544, 557, 576, 577, 583, 588, 593, 600, + 609, 615, 620, 625, 632, 128, 383, 384, + 578, 579, 585, 586, 590, 591, 596, 597, + 610, 611, 617, 618, 622, 623, 628, 629, + 639, 288, 320, 333, 365, 544, 576, 128, + 383, 384, 639, 288, 320, 326, 358, 544, + 576, 128, 383, 384, 639, 288, 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, 368, 370, - 371, 372, 376, 544, 557, 576, 577, 583, - 588, 593, 600, 609, 615, 620, 625, 632, - 128, 383, 384, 578, 579, 585, 586, 590, - 591, 596, 597, 610, 611, 617, 618, 622, - 623, 628, 629, 639, 288, 320, 333, 365, - 544, 576, 128, 383, 384, 639, 288, 320, - 326, 358, 544, 576, 128, 383, 384, 639, - 288, 320, 321, 323, 324, 325, 326, 328, - 329, 332, 335, 336, 338, 339, 340, 344, - 353, 355, 356, 357, 358, 360, 361, 364, - 367, 368, 370, 371, 372, 376, 544, 576, - 128, 383, 384, 639, 288, 320, 321, 353, - 544, 576, 128, 383, 384, 639, 288, 320, - 336, 368, 544, 576, 128, 383, 384, 639, - 288, 320, 339, 371, 544, 576, 128, 383, - 384, 639, 288, 320, 321, 323, 324, 325, - 326, 328, 329, 332, 335, 336, 338, 339, - 340, 344, 353, 355, 356, 357, 358, 360, - 361, 364, 367, 368, 370, 371, 372, 376, - 544, 576, 128, 383, 384, 639, 288, 320, - 328, 334, 360, 366, 544, 576, 128, 383, - 384, 639, 288, 320, 323, 355, 544, 576, + 371, 372, 376, 544, 576, 128, 383, 384, + 639, 288, 320, 321, 353, 544, 576, 128, + 383, 384, 639, 288, 320, 336, 368, 544, + 576, 128, 383, 384, 639, 288, 320, 339, + 371, 544, 576, 128, 383, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 128, + 383, 384, 639, 288, 320, 328, 334, 360, + 366, 544, 576, 128, 383, 384, 639, 288, + 320, 323, 355, 544, 576, 128, 383, 384, + 639, 288, 320, 336, 368, 544, 576, 128, + 383, 384, 639, 288, 320, 342, 374, 544, + 576, 128, 383, 384, 639, 288, 308, 310, + 320, 544, 576, 128, 383, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 128, + 383, 384, 639, 288, 320, 342, 344, 374, + 376, 544, 576, 128, 383, 384, 639, 288, + 320, 325, 357, 544, 576, 128, 383, 384, + 639, 288, 320, 334, 366, 544, 576, 128, + 383, 384, 639, 288, 320, 340, 372, 544, + 576, 128, 383, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 128, 383, 384, + 639, 288, 320, 338, 370, 544, 576, 128, + 383, 384, 639, 288, 320, 335, 367, 544, + 576, 128, 383, 384, 639, 288, 320, 333, + 365, 544, 576, 128, 383, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 128, + 383, 384, 639, 288, 320, 325, 357, 544, + 576, 128, 383, 384, 639, 288, 320, 321, + 353, 544, 576, 128, 383, 384, 639, 288, + 320, 324, 356, 544, 576, 128, 383, 384, + 639, 288, 320, 325, 357, 544, 576, 128, + 383, 384, 639, 288, 320, 338, 370, 544, + 576, 128, 383, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 128, 383, 384, + 639, 288, 320, 333, 336, 365, 368, 544, + 576, 128, 383, 384, 639, 288, 320, 336, + 368, 544, 576, 128, 383, 384, 639, 288, + 320, 329, 341, 361, 373, 544, 576, 128, + 383, 384, 639, 288, 320, 321, 323, 324, + 325, 326, 328, 329, 332, 335, 336, 338, + 339, 340, 344, 353, 355, 356, 357, 358, + 360, 361, 364, 367, 368, 370, 371, 372, + 376, 544, 576, 128, 383, 384, 639, 288, + 320, 335, 367, 544, 576, 128, 383, 384, + 639, 288, 320, 323, 355, 544, 576, 128, + 383, 384, 639, 288, 320, 321, 353, 544, + 576, 128, 383, 384, 639, 288, 320, 332, + 364, 544, 576, 128, 383, 384, 639, 288, + 301, 320, 544, 576, 128, 383, 384, 639, + 288, 320, 329, 336, 361, 368, 544, 576, 128, 383, 384, 639, 288, 320, 336, 368, 544, 576, 128, 383, 384, 639, 288, 320, - 342, 374, 544, 576, 128, 383, 384, 639, - 288, 308, 310, 320, 544, 576, 128, 383, - 384, 639, 288, 320, 321, 323, 324, 325, - 326, 328, 329, 332, 335, 336, 338, 339, - 340, 344, 353, 355, 356, 357, 358, 360, - 361, 364, 367, 368, 370, 371, 372, 376, + 321, 323, 324, 325, 326, 328, 329, 332, + 335, 336, 338, 339, 340, 344, 353, 355, + 356, 357, 358, 360, 361, 364, 367, 368, + 370, 371, 372, 376, 544, 576, 128, 383, + 384, 639, 288, 320, 336, 368, 544, 576, + 128, 383, 384, 639, 288, 320, 329, 361, 544, 576, 128, 383, 384, 639, 288, 320, - 342, 344, 374, 376, 544, 576, 128, 383, - 384, 639, 288, 320, 325, 357, 544, 576, - 128, 383, 384, 639, 288, 320, 334, 366, - 544, 576, 128, 383, 384, 639, 288, 320, - 340, 372, 544, 576, 128, 383, 384, 639, + 324, 356, 544, 576, 128, 383, 384, 639, 288, 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, 368, 370, 371, 372, 376, 544, 576, - 128, 383, 384, 639, 288, 320, 338, 370, + 128, 383, 384, 639, 288, 320, 321, 323, + 343, 353, 355, 375, 544, 576, 128, 383, + 384, 639, 288, 320, 339, 340, 345, 371, + 372, 377, 544, 576, 128, 383, 384, 639, + 288, 320, 339, 371, 544, 576, 128, 383, + 384, 639, 288, 320, 343, 375, 544, 576, + 128, 383, 384, 639, 288, 320, 335, 367, 544, 576, 128, 383, 384, 639, 288, 320, - 335, 367, 544, 576, 128, 383, 384, 639, - 288, 320, 333, 365, 544, 576, 128, 383, + 338, 370, 544, 576, 128, 383, 384, 639, + 288, 320, 324, 356, 544, 576, 128, 383, 384, 639, 288, 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, @@ -1343,38 +1452,45 @@ static const short _demo_machine_parser_cmd_trans_keys[] = { 544, 576, 128, 383, 384, 639, 288, 320, 325, 357, 544, 576, 128, 383, 384, 639, 288, 320, 321, 353, 544, 576, 128, 383, - 384, 639, 288, 320, 324, 356, 544, 576, - 128, 383, 384, 639, 288, 320, 325, 357, - 544, 576, 128, 383, 384, 639, 288, 320, - 338, 370, 544, 576, 128, 383, 384, 639, - 288, 320, 321, 323, 324, 325, 326, 328, - 329, 332, 335, 336, 338, 339, 340, 344, - 353, 355, 356, 357, 358, 360, 361, 364, - 367, 368, 370, 371, 372, 376, 544, 576, - 128, 383, 384, 639, 288, 320, 333, 336, - 365, 368, 544, 576, 128, 383, 384, 639, - 288, 320, 336, 368, 544, 576, 128, 383, - 384, 639, 288, 320, 329, 341, 361, 373, + 384, 639, 288, 320, 332, 364, 544, 576, + 128, 383, 384, 639, 288, 320, 333, 365, 544, 576, 128, 383, 384, 639, 288, 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, 368, 370, 371, 372, 376, 544, 576, 128, 383, - 384, 639, 288, 320, 335, 367, 544, 576, - 128, 383, 384, 639, 288, 320, 323, 355, + 384, 639, 288, 320, 325, 329, 333, 340, + 357, 361, 365, 372, 544, 576, 128, 383, + 384, 639, 288, 320, 323, 355, 544, 576, + 128, 383, 384, 639, 288, 320, 321, 323, + 324, 325, 326, 328, 329, 332, 335, 336, + 338, 339, 340, 344, 353, 355, 356, 357, + 358, 360, 361, 364, 367, 368, 370, 371, + 372, 376, 544, 576, 128, 383, 384, 639, + 288, 320, 335, 367, 544, 576, 128, 383, + 384, 639, 288, 320, 321, 323, 324, 325, + 326, 328, 329, 332, 335, 336, 338, 339, + 340, 344, 353, 355, 356, 357, 358, 360, + 361, 364, 367, 368, 370, 371, 372, 376, 544, 576, 128, 383, 384, 639, 288, 320, - 321, 353, 544, 576, 128, 383, 384, 639, - 288, 320, 332, 364, 544, 576, 128, 383, - 384, 639, 288, 301, 320, 544, 576, 128, - 383, 384, 639, 288, 320, 329, 336, 361, - 368, 544, 576, 128, 383, 384, 639, 288, - 320, 336, 368, 544, 576, 128, 383, 384, - 639, 288, 320, 321, 323, 324, 325, 326, - 328, 329, 332, 335, 336, 338, 339, 340, - 344, 353, 355, 356, 357, 358, 360, 361, - 364, 367, 368, 370, 371, 372, 376, 544, - 576, 128, 383, 384, 639, 288, 320, 336, - 368, 544, 576, 128, 383, 384, 639, 288, + 336, 368, 544, 576, 128, 383, 384, 639, + 288, 320, 321, 323, 324, 325, 326, 328, + 329, 332, 335, 336, 338, 339, 340, 344, + 353, 355, 356, 357, 358, 360, 361, 364, + 367, 368, 370, 371, 372, 376, 544, 576, + 128, 383, 384, 639, 288, 320, 324, 327, + 332, 356, 359, 364, 544, 576, 128, 383, + 384, 639, 288, 320, 321, 323, 324, 325, + 326, 328, 329, 332, 335, 336, 338, 339, + 340, 344, 353, 355, 356, 357, 358, 360, + 361, 364, 367, 368, 370, 371, 372, 376, + 544, 576, 128, 383, 384, 639, 288, 320, + 323, 355, 544, 576, 128, 383, 384, 639, + 288, 320, 335, 367, 544, 576, 128, 383, + 384, 639, 288, 320, 333, 365, 544, 576, + 128, 383, 384, 639, 288, 320, 336, 368, + 544, 576, 128, 383, 384, 639, 288, 301, + 320, 544, 576, 128, 383, 384, 639, 288, 320, 329, 361, 544, 576, 128, 383, 384, 639, 288, 320, 324, 356, 544, 576, 128, 383, 384, 639, 288, 320, 321, 323, 324, @@ -1382,71 +1498,67 @@ static const short _demo_machine_parser_cmd_trans_keys[] = { 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, 368, 370, 371, 372, 376, 544, 576, 128, 383, 384, 639, 288, - 320, 321, 323, 343, 353, 355, 375, 544, - 576, 128, 383, 384, 639, 288, 320, 339, - 340, 345, 371, 372, 377, 544, 576, 128, - 383, 384, 639, 288, 320, 339, 371, 544, - 576, 128, 383, 384, 639, 288, 320, 343, - 375, 544, 576, 128, 383, 384, 639, 288, - 320, 335, 367, 544, 576, 128, 383, 384, - 639, 288, 320, 338, 370, 544, 576, 128, - 383, 384, 639, 288, 320, 324, 356, 544, + 320, 325, 357, 544, 576, 128, 383, 384, + 639, 288, 320, 334, 366, 544, 576, 128, + 383, 384, 639, 288, 320, 340, 372, 544, 576, 128, 383, 384, 639, 288, 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, 368, 370, 371, 372, 376, 544, 576, 128, 383, 384, - 639, 288, 320, 325, 357, 544, 576, 128, - 383, 384, 639, 288, 320, 321, 353, 544, - 576, 128, 383, 384, 639, 288, 320, 332, - 364, 544, 576, 128, 383, 384, 639, 288, - 320, 333, 365, 544, 576, 128, 383, 384, - 639, 288, 320, 321, 323, 324, 325, 326, - 328, 329, 332, 335, 336, 338, 339, 340, - 344, 353, 355, 356, 357, 358, 360, 361, - 364, 367, 368, 370, 371, 372, 376, 544, - 576, 128, 383, 384, 639, 288, 320, 325, - 329, 333, 357, 361, 365, 544, 576, 128, + 639, 288, 320, 339, 371, 544, 576, 128, 383, 384, 639, 288, 320, 323, 355, 544, 576, 128, 383, 384, 639, 288, 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, 368, 370, 371, 372, 376, 544, 576, 128, 383, 384, - 639, 288, 320, 335, 367, 544, 576, 128, - 383, 384, 639, 288, 320, 321, 323, 324, - 325, 326, 328, 329, 332, 335, 336, 338, - 339, 340, 344, 353, 355, 356, 357, 358, - 360, 361, 364, 367, 368, 370, 371, 372, - 376, 544, 576, 128, 383, 384, 639, 288, - 320, 336, 368, 544, 576, 128, 383, 384, - 639, 288, 320, 321, 323, 324, 325, 326, - 328, 329, 332, 335, 336, 338, 339, 340, - 344, 353, 355, 356, 357, 358, 360, 361, - 364, 367, 368, 370, 371, 372, 376, 544, - 576, 128, 383, 384, 639, 288, 320, 324, - 327, 332, 356, 359, 364, 544, 576, 128, - 383, 384, 639, 288, 320, 321, 323, 324, - 325, 326, 328, 329, 332, 335, 336, 338, - 339, 340, 344, 353, 355, 356, 357, 358, - 360, 361, 364, 367, 368, 370, 371, 372, - 376, 544, 576, 128, 383, 384, 639, 288, - 320, 323, 355, 544, 576, 128, 383, 384, - 639, 288, 320, 335, 367, 544, 576, 128, - 383, 384, 639, 288, 320, 333, 365, 544, - 576, 128, 383, 384, 639, 288, 320, 336, - 368, 544, 576, 128, 383, 384, 639, 288, - 301, 320, 544, 576, 128, 383, 384, 639, - 288, 320, 329, 361, 544, 576, 128, 383, - 384, 639, 288, 320, 324, 356, 544, 576, - 128, 383, 384, 639, 288, 320, 321, 323, - 324, 325, 326, 328, 329, 332, 335, 336, - 338, 339, 340, 344, 353, 355, 356, 357, - 358, 360, 361, 364, 367, 368, 370, 371, - 372, 376, 544, 576, 128, 383, 384, 639, - 288, 320, 325, 357, 544, 576, 128, 383, - 384, 639, 288, 320, 334, 366, 544, 576, - 128, 383, 384, 639, 288, 320, 340, 372, + 639, 288, 320, 341, 373, 544, 576, 128, + 383, 384, 639, 288, 320, 334, 366, 544, + 576, 128, 383, 384, 639, 288, 301, 320, + 544, 576, 128, 383, 384, 639, 288, 320, + 329, 336, 341, 361, 368, 373, 544, 576, + 128, 383, 384, 639, 288, 320, 336, 368, + 544, 576, 128, 383, 384, 639, 288, 320, + 321, 323, 324, 325, 326, 328, 329, 332, + 335, 336, 338, 339, 340, 344, 353, 355, + 356, 357, 358, 360, 361, 364, 367, 368, + 370, 371, 372, 376, 544, 576, 128, 383, + 384, 639, 288, 320, 335, 343, 367, 375, + 544, 576, 128, 383, 384, 639, 288, 320, + 338, 370, 544, 576, 128, 383, 384, 639, + 288, 320, 340, 372, 544, 576, 128, 383, + 384, 639, 288, 320, 321, 323, 324, 325, + 326, 328, 329, 332, 335, 336, 338, 339, + 340, 344, 353, 355, 356, 357, 358, 360, + 361, 364, 367, 368, 370, 371, 372, 376, + 544, 576, 128, 383, 384, 639, 288, 320, + 324, 356, 544, 576, 128, 383, 384, 639, + 288, 320, 321, 323, 324, 325, 326, 328, + 329, 332, 335, 336, 338, 339, 340, 344, + 353, 355, 356, 357, 358, 360, 361, 364, + 367, 368, 370, 371, 372, 376, 544, 576, + 128, 383, 384, 639, 288, 320, 339, 371, + 544, 576, 128, 383, 384, 639, 288, 320, + 338, 370, 544, 576, 128, 383, 384, 639, + 288, 320, 321, 323, 324, 325, 326, 328, + 329, 332, 335, 336, 338, 339, 340, 344, + 353, 355, 356, 357, 358, 360, 361, 364, + 367, 368, 370, 371, 372, 376, 544, 576, + 128, 383, 384, 639, 288, 320, 328, 360, + 544, 576, 128, 383, 384, 639, 288, 320, + 321, 323, 324, 325, 326, 328, 329, 332, + 335, 336, 338, 339, 340, 344, 353, 355, + 356, 357, 358, 360, 361, 364, 367, 368, + 370, 371, 372, 376, 544, 576, 128, 383, + 384, 639, 288, 320, 321, 323, 324, 325, + 326, 328, 329, 332, 335, 336, 338, 339, + 340, 344, 353, 355, 356, 357, 358, 360, + 361, 364, 367, 368, 370, 371, 372, 376, + 544, 576, 588, 620, 128, 383, 384, 639, + 288, 320, 335, 367, 544, 576, 128, 383, + 384, 639, 288, 320, 321, 353, 544, 576, + 128, 383, 384, 639, 288, 320, 324, 356, 544, 576, 128, 383, 384, 639, 288, 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, @@ -1455,37 +1567,29 @@ static const short _demo_machine_parser_cmd_trans_keys[] = { 384, 639, 288, 320, 339, 371, 544, 576, 128, 383, 384, 639, 288, 320, 323, 355, 544, 576, 128, 383, 384, 639, 288, 320, - 321, 323, 324, 325, 326, 328, 329, 332, - 335, 336, 338, 339, 340, 344, 353, 355, - 356, 357, 358, 360, 361, 364, 367, 368, - 370, 371, 372, 376, 544, 576, 128, 383, - 384, 639, 288, 320, 328, 360, 544, 576, - 128, 383, 384, 639, 288, 320, 321, 323, - 324, 325, 326, 328, 329, 332, 335, 336, - 338, 339, 340, 344, 353, 355, 356, 357, - 358, 360, 361, 364, 367, 368, 370, 371, - 372, 376, 544, 576, 128, 383, 384, 639, - 288, 320, 321, 323, 324, 325, 326, 328, - 329, 332, 335, 336, 338, 339, 340, 344, - 353, 355, 356, 357, 358, 360, 361, 364, - 367, 368, 370, 371, 372, 376, 544, 576, - 588, 620, 128, 383, 384, 639, 288, 320, - 335, 367, 544, 576, 128, 383, 384, 639, - 288, 320, 321, 353, 544, 576, 128, 383, - 384, 639, 288, 320, 324, 356, 544, 576, - 128, 383, 384, 639, 288, 320, 321, 323, - 324, 325, 326, 328, 329, 332, 335, 336, - 338, 339, 340, 344, 353, 355, 356, 357, - 358, 360, 361, 364, 367, 368, 370, 371, - 372, 376, 544, 576, 128, 383, 384, 639, - 288, 320, 339, 371, 544, 576, 128, 383, - 384, 639, 288, 320, 323, 355, 544, 576, - 128, 383, 384, 639, 288, 320, 326, 358, - 544, 576, 128, 383, 384, 639, 288, 301, - 320, 544, 576, 128, 383, 384, 639, 288, - 320, 329, 336, 340, 361, 368, 372, 544, - 576, 128, 383, 384, 639, 288, 320, 336, - 368, 544, 576, 128, 383, 384, 639, 288, + 326, 358, 544, 576, 128, 383, 384, 639, + 288, 301, 320, 544, 576, 128, 383, 384, + 639, 288, 320, 329, 336, 340, 361, 368, + 372, 544, 576, 128, 383, 384, 639, 288, + 320, 336, 368, 544, 576, 128, 383, 384, + 639, 288, 320, 321, 323, 324, 325, 326, + 328, 329, 332, 335, 336, 338, 339, 340, + 344, 353, 355, 356, 357, 358, 360, 361, + 364, 367, 368, 370, 371, 372, 376, 544, + 576, 128, 383, 384, 639, 288, 320, 335, + 367, 544, 576, 128, 383, 384, 639, 288, + 320, 338, 370, 544, 576, 128, 383, 384, + 639, 288, 320, 340, 372, 544, 576, 128, + 383, 384, 639, 288, 320, 321, 323, 324, + 325, 326, 328, 329, 332, 335, 336, 338, + 339, 340, 344, 353, 355, 356, 357, 358, + 360, 361, 364, 367, 368, 370, 371, 372, + 376, 544, 576, 128, 383, 384, 639, 288, + 320, 338, 370, 544, 576, 128, 383, 384, + 639, 288, 320, 321, 353, 544, 576, 128, + 383, 384, 639, 288, 320, 334, 366, 544, + 576, 128, 383, 384, 639, 288, 320, 339, + 371, 544, 576, 128, 383, 384, 639, 288, 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, @@ -1498,83 +1602,61 @@ static const short _demo_machine_parser_cmd_trans_keys[] = { 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, 368, 370, 371, 372, 376, 544, - 576, 128, 383, 384, 639, 288, 320, 338, - 370, 544, 576, 128, 383, 384, 639, 288, - 320, 321, 353, 544, 576, 128, 383, 384, - 639, 288, 320, 334, 366, 544, 576, 128, - 383, 384, 639, 288, 320, 339, 371, 544, 576, 128, 383, 384, 639, 288, 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, 368, 370, 371, 372, 376, 544, 576, 128, 383, 384, - 639, 288, 320, 335, 367, 544, 576, 128, - 383, 384, 639, 288, 320, 338, 370, 544, - 576, 128, 383, 384, 639, 288, 320, 340, - 372, 544, 576, 128, 383, 384, 639, 288, - 320, 321, 323, 324, 325, 326, 328, 329, - 332, 335, 336, 338, 339, 340, 344, 353, - 355, 356, 357, 358, 360, 361, 364, 367, - 368, 370, 371, 372, 376, 544, 576, 128, - 383, 384, 639, 288, 320, 321, 323, 324, - 325, 326, 328, 329, 332, 335, 336, 338, - 339, 340, 344, 353, 355, 356, 357, 358, - 360, 361, 364, 367, 368, 370, 371, 372, - 376, 544, 576, 128, 383, 384, 639, 288, - 320, 342, 374, 544, 576, 128, 383, 384, - 639, 288, 310, 320, 544, 576, 128, 383, - 384, 639, 288, 320, 321, 323, 324, 325, - 326, 328, 329, 332, 335, 336, 338, 339, - 340, 344, 353, 355, 356, 357, 358, 360, - 361, 364, 367, 368, 370, 371, 372, 376, - 544, 576, 128, 383, 384, 639, 288, 320, - 336, 368, 544, 576, 128, 383, 384, 639, - 288, 320, 329, 361, 544, 576, 128, 383, - 384, 639, 288, 320, 338, 370, 544, 576, - 128, 383, 384, 639, 288, 320, 325, 357, - 544, 576, 128, 383, 384, 639, 288, 320, - 339, 371, 544, 576, 128, 383, 384, 639, - 288, 320, 321, 323, 324, 325, 326, 328, - 329, 332, 335, 336, 338, 339, 340, 344, - 353, 355, 356, 357, 358, 360, 361, 364, - 367, 368, 370, 371, 372, 376, 544, 576, - 128, 383, 384, 639, 288, 320, 321, 339, - 353, 371, 544, 576, 128, 383, 384, 639, - 288, 320, 333, 365, 544, 576, 128, 383, - 384, 639, 288, 320, 325, 357, 544, 576, + 639, 288, 320, 342, 374, 544, 576, 128, + 383, 384, 639, 288, 310, 320, 544, 576, 128, 383, 384, 639, 288, 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, 368, 370, 371, 372, 376, 544, 576, 128, 383, 384, 639, - 288, 301, 320, 544, 576, 128, 383, 384, - 639, 288, 320, 334, 366, 544, 576, 128, - 383, 384, 639, 288, 320, 321, 353, 544, - 576, 128, 383, 384, 639, 288, 320, 336, - 368, 544, 576, 128, 383, 384, 639, 288, - 320, 340, 372, 544, 576, 128, 383, 384, - 639, 288, 320, 338, 370, 544, 576, 128, + 288, 320, 336, 368, 544, 576, 128, 383, + 384, 639, 288, 320, 329, 361, 544, 576, + 128, 383, 384, 639, 288, 320, 338, 370, + 544, 576, 128, 383, 384, 639, 288, 320, + 325, 357, 544, 576, 128, 383, 384, 639, + 288, 320, 339, 371, 544, 576, 128, 383, + 384, 639, 288, 320, 321, 323, 324, 325, + 326, 328, 329, 332, 335, 336, 338, 339, + 340, 344, 353, 355, 356, 357, 358, 360, + 361, 364, 367, 368, 370, 371, 372, 376, + 544, 576, 128, 383, 384, 639, 288, 320, + 321, 339, 353, 371, 544, 576, 128, 383, + 384, 639, 288, 320, 333, 365, 544, 576, + 128, 383, 384, 639, 288, 320, 325, 357, + 544, 576, 128, 383, 384, 639, 288, 320, + 321, 323, 324, 325, 326, 328, 329, 332, + 335, 336, 338, 339, 340, 344, 353, 355, + 356, 357, 358, 360, 361, 364, 367, 368, + 370, 371, 372, 376, 544, 576, 128, 383, + 384, 639, 288, 301, 320, 544, 576, 128, + 383, 384, 639, 288, 320, 334, 366, 544, + 576, 128, 383, 384, 639, 288, 320, 321, + 353, 544, 576, 128, 383, 384, 639, 288, + 320, 336, 368, 544, 576, 128, 383, 384, + 639, 288, 320, 340, 372, 544, 576, 128, + 383, 384, 639, 288, 320, 338, 370, 544, + 576, 128, 383, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 128, 383, 384, + 639, 288, 301, 320, 321, 323, 324, 325, + 326, 328, 329, 332, 335, 336, 338, 339, + 340, 344, 353, 355, 356, 357, 358, 360, + 361, 364, 367, 368, 370, 371, 372, 376, + 544, 557, 576, 577, 579, 580, 581, 582, + 584, 585, 588, 591, 592, 594, 595, 596, + 600, 609, 611, 612, 613, 614, 616, 617, + 620, 623, 624, 626, 627, 628, 632, 128, 383, 384, 639, 288, 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, 368, 370, 371, 372, - 376, 544, 576, 128, 383, 384, 639, 288, - 301, 320, 321, 323, 324, 325, 326, 328, - 329, 332, 335, 336, 338, 339, 340, 344, - 353, 355, 356, 357, 358, 360, 361, 364, - 367, 368, 370, 371, 372, 376, 544, 557, - 576, 577, 579, 580, 581, 582, 584, 585, - 588, 591, 592, 594, 595, 596, 600, 609, - 611, 612, 613, 614, 616, 617, 620, 623, - 624, 626, 627, 628, 632, 128, 383, 384, - 639, 288, 320, 321, 323, 324, 325, 326, - 328, 329, 332, 335, 336, 338, 339, 340, - 344, 353, 355, 356, 357, 358, 360, 361, - 364, 367, 368, 370, 371, 372, 376, 544, - 576, 384, 639, 288, 320, 321, 323, 324, - 325, 326, 328, 329, 332, 335, 336, 338, - 339, 340, 344, 353, 355, 356, 357, 358, - 360, 361, 364, 367, 368, 370, 371, 372, 376, 544, 576, 384, 639, 288, 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, @@ -1651,8 +1733,12 @@ static const short _demo_machine_parser_cmd_trans_keys[] = { 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, - 368, 370, 371, 372, 376, 544, 576, 588, - 620, 384, 639, 288, 320, 321, 323, 324, + 368, 370, 371, 372, 376, 544, 576, 384, + 639, 288, 320, 321, 323, 324, 325, 326, + 328, 329, 332, 335, 336, 338, 339, 340, + 344, 353, 355, 356, 357, 358, 360, 361, + 364, 367, 368, 370, 371, 372, 376, 544, + 576, 384, 639, 288, 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, 368, 370, 371, 372, @@ -1669,6 +1755,19 @@ static const short _demo_machine_parser_cmd_trans_keys[] = { 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, 368, 370, 371, 372, 376, 544, + 576, 588, 620, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 384, + 639, 288, 320, 321, 323, 324, 325, 326, + 328, 329, 332, 335, 336, 338, 339, 340, + 344, 353, 355, 356, 357, 358, 360, 361, + 364, 367, 368, 370, 371, 372, 376, 544, 576, 384, 639, 288, 320, 321, 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, @@ -1694,115 +1793,132 @@ static const short _demo_machine_parser_cmd_trans_keys[] = { 323, 324, 325, 326, 328, 329, 332, 335, 336, 338, 339, 340, 344, 353, 355, 356, 357, 358, 360, 361, 364, 367, 368, 370, - 371, 372, 376, 544, 576, 384, 639, 320, - 333, 365, 576, 589, 621, 384, 639, 320, - 326, 358, 576, 582, 614, 384, 639, 320, - 321, 353, 576, 577, 609, 384, 639, 320, - 336, 368, 576, 592, 624, 384, 639, 320, - 339, 371, 576, 595, 627, 384, 639, 320, - 328, 334, 360, 366, 576, 584, 590, 616, - 622, 384, 639, 320, 323, 355, 576, 579, - 611, 384, 639, 320, 336, 368, 576, 592, - 624, 384, 639, 320, 342, 374, 576, 598, - 630, 384, 639, 308, 310, 320, 564, 566, - 576, 384, 639, 320, 321, 339, 353, 371, - 576, 577, 595, 609, 627, 384, 639, 320, - 333, 365, 576, 589, 621, 384, 639, 320, - 325, 357, 576, 581, 613, 384, 639, 301, - 320, 557, 576, 384, 639, 320, 334, 366, - 576, 590, 622, 384, 639, 320, 321, 353, - 576, 577, 609, 384, 639, 320, 336, 368, - 576, 592, 624, 384, 639, 320, 340, 372, - 576, 596, 628, 384, 639, 320, 338, 370, - 576, 594, 626, 384, 639, 320, 342, 344, - 374, 376, 576, 598, 600, 630, 632, 384, - 639, 320, 325, 357, 576, 581, 613, 384, - 639, 320, 334, 366, 576, 590, 622, 384, - 639, 320, 340, 372, 576, 596, 628, 384, + 371, 372, 376, 544, 576, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 384, + 639, 320, 333, 365, 576, 589, 621, 384, + 639, 320, 326, 358, 576, 582, 614, 384, + 639, 320, 321, 353, 576, 577, 609, 384, 639, 320, 336, 368, 576, 592, 624, 384, - 639, 320, 329, 361, 576, 585, 617, 384, - 639, 320, 338, 370, 576, 594, 626, 384, - 639, 320, 325, 357, 576, 581, 613, 384, 639, 320, 339, 371, 576, 595, 627, 384, - 639, 320, 338, 370, 576, 594, 626, 384, - 639, 320, 335, 367, 576, 591, 623, 384, + 639, 320, 328, 334, 360, 366, 576, 584, + 590, 616, 622, 384, 639, 320, 323, 355, + 576, 579, 611, 384, 639, 320, 336, 368, + 576, 592, 624, 384, 639, 320, 342, 374, + 576, 598, 630, 384, 639, 308, 310, 320, + 564, 566, 576, 384, 639, 320, 321, 339, + 353, 371, 576, 577, 595, 609, 627, 384, 639, 320, 333, 365, 576, 589, 621, 384, 639, 320, 325, 357, 576, 581, 613, 384, - 639, 320, 321, 353, 576, 577, 609, 384, - 639, 320, 324, 356, 576, 580, 612, 384, - 639, 320, 325, 357, 576, 581, 613, 384, - 639, 320, 338, 370, 576, 594, 626, 384, - 639, 320, 333, 336, 365, 368, 576, 589, - 592, 621, 624, 384, 639, 320, 336, 368, - 576, 592, 624, 384, 639, 320, 329, 341, - 361, 373, 576, 585, 597, 617, 629, 384, - 639, 320, 342, 374, 576, 598, 630, 384, - 639, 310, 320, 566, 576, 384, 639, 320, - 335, 367, 576, 591, 623, 384, 639, 320, - 323, 355, 576, 579, 611, 384, 639, 320, + 639, 301, 320, 557, 576, 384, 639, 320, + 334, 366, 576, 590, 622, 384, 639, 320, 321, 353, 576, 577, 609, 384, 639, 320, - 332, 364, 576, 588, 620, 384, 639, 301, - 320, 557, 576, 384, 639, 320, 329, 336, - 361, 368, 576, 585, 592, 617, 624, 384, - 639, 320, 336, 368, 576, 592, 624, 384, - 639, 320, 335, 367, 576, 591, 623, 384, - 639, 320, 338, 370, 576, 594, 626, 384, - 639, 320, 340, 372, 576, 596, 628, 384, - 639, 320, 336, 368, 576, 592, 624, 384, - 639, 320, 329, 361, 576, 585, 617, 384, - 639, 320, 324, 356, 576, 580, 612, 384, - 639, 320, 321, 323, 343, 353, 355, 375, - 576, 577, 579, 599, 609, 611, 631, 384, - 639, 320, 339, 340, 345, 371, 372, 377, - 576, 595, 596, 601, 627, 628, 633, 384, - 639, 320, 339, 371, 576, 595, 627, 384, - 639, 320, 343, 375, 576, 599, 631, 384, - 639, 320, 335, 367, 576, 591, 623, 384, - 639, 320, 338, 370, 576, 594, 626, 384, - 639, 320, 324, 356, 576, 580, 612, 384, - 639, 320, 328, 360, 576, 584, 616, 384, - 639, 288, 320, 321, 323, 324, 325, 326, - 328, 329, 332, 335, 336, 338, 339, 340, - 344, 353, 355, 356, 357, 358, 360, 361, - 364, 367, 368, 370, 371, 372, 376, 544, - 576, 588, 620, 384, 639, 320, 335, 367, - 576, 591, 623, 384, 639, 320, 321, 353, - 576, 577, 609, 384, 639, 320, 324, 356, - 576, 580, 612, 384, 639, 320, 339, 371, - 576, 595, 627, 384, 639, 320, 323, 355, - 576, 579, 611, 384, 639, 320, 326, 358, - 576, 582, 614, 384, 639, 301, 320, 557, - 576, 384, 639, 320, 329, 336, 340, 361, - 368, 372, 576, 585, 592, 596, 617, 624, + 336, 368, 576, 592, 624, 384, 639, 320, + 340, 372, 576, 596, 628, 384, 639, 320, + 338, 370, 576, 594, 626, 384, 639, 320, + 342, 344, 374, 376, 576, 598, 600, 630, + 632, 384, 639, 320, 325, 357, 576, 581, + 613, 384, 639, 320, 334, 366, 576, 590, + 622, 384, 639, 320, 340, 372, 576, 596, 628, 384, 639, 320, 336, 368, 576, 592, + 624, 384, 639, 320, 329, 361, 576, 585, + 617, 384, 639, 320, 338, 370, 576, 594, + 626, 384, 639, 320, 325, 357, 576, 581, + 613, 384, 639, 320, 339, 371, 576, 595, + 627, 384, 639, 320, 338, 370, 576, 594, + 626, 384, 639, 320, 335, 367, 576, 591, + 623, 384, 639, 320, 333, 365, 576, 589, + 621, 384, 639, 320, 325, 357, 576, 581, + 613, 384, 639, 320, 321, 353, 576, 577, + 609, 384, 639, 320, 324, 356, 576, 580, + 612, 384, 639, 320, 325, 357, 576, 581, + 613, 384, 639, 320, 338, 370, 576, 594, + 626, 384, 639, 320, 333, 336, 365, 368, + 576, 589, 592, 621, 624, 384, 639, 320, + 336, 368, 576, 592, 624, 384, 639, 320, + 329, 341, 361, 373, 576, 585, 597, 617, + 629, 384, 639, 320, 342, 374, 576, 598, + 630, 384, 639, 310, 320, 566, 576, 384, + 639, 320, 335, 367, 576, 591, 623, 384, + 639, 320, 323, 355, 576, 579, 611, 384, + 639, 320, 321, 353, 576, 577, 609, 384, + 639, 320, 332, 364, 576, 588, 620, 384, + 639, 301, 320, 557, 576, 384, 639, 320, + 329, 336, 361, 368, 576, 585, 592, 617, + 624, 384, 639, 320, 336, 368, 576, 592, 624, 384, 639, 320, 335, 367, 576, 591, 623, 384, 639, 320, 338, 370, 576, 594, 626, 384, 639, 320, 340, 372, 576, 596, - 628, 384, 639, 320, 338, 370, 576, 594, - 626, 384, 639, 320, 321, 353, 576, 577, - 609, 384, 639, 320, 334, 366, 576, 590, - 622, 384, 639, 320, 339, 371, 576, 595, - 627, 384, 639, 320, 325, 357, 576, 581, - 613, 384, 639, 320, 321, 353, 576, 577, - 609, 384, 639, 320, 332, 364, 576, 588, - 620, 384, 639, 320, 333, 365, 576, 589, - 621, 384, 639, 320, 325, 329, 333, 357, - 361, 365, 576, 581, 585, 589, 613, 617, - 621, 384, 639, 320, 323, 355, 576, 579, - 611, 384, 639, 320, 324, 327, 332, 356, - 359, 364, 576, 580, 583, 588, 612, 615, - 620, 384, 639, 320, 323, 355, 576, 579, - 611, 384, 639, 320, 335, 367, 576, 591, - 623, 384, 639, 320, 333, 365, 576, 589, - 621, 384, 639, 320, 336, 368, 576, 592, - 624, 384, 639, 301, 320, 557, 576, 384, - 639, 320, 329, 361, 576, 585, 617, 384, - 639, 320, 324, 356, 576, 580, 612, 384, - 639, 320, 325, 357, 576, 581, 613, 384, - 639, 320, 334, 366, 576, 590, 622, 384, - 639, 320, 340, 372, 576, 596, 628, 384, - 639, 320, 339, 371, 576, 595, 627, 384, + 628, 384, 639, 320, 336, 368, 576, 592, + 624, 384, 639, 320, 329, 361, 576, 585, + 617, 384, 639, 320, 324, 356, 576, 580, + 612, 384, 639, 320, 321, 323, 343, 353, + 355, 375, 576, 577, 579, 599, 609, 611, + 631, 384, 639, 320, 339, 340, 345, 371, + 372, 377, 576, 595, 596, 601, 627, 628, + 633, 384, 639, 320, 339, 371, 576, 595, + 627, 384, 639, 320, 343, 375, 576, 599, + 631, 384, 639, 320, 335, 367, 576, 591, + 623, 384, 639, 320, 338, 370, 576, 594, + 626, 384, 639, 320, 324, 356, 576, 580, + 612, 384, 639, 320, 328, 360, 576, 584, + 616, 384, 639, 288, 320, 321, 323, 324, + 325, 326, 328, 329, 332, 335, 336, 338, + 339, 340, 344, 353, 355, 356, 357, 358, + 360, 361, 364, 367, 368, 370, 371, 372, + 376, 544, 576, 588, 620, 384, 639, 320, + 335, 367, 576, 591, 623, 384, 639, 320, + 321, 353, 576, 577, 609, 384, 639, 320, + 324, 356, 576, 580, 612, 384, 639, 320, + 339, 371, 576, 595, 627, 384, 639, 320, + 323, 355, 576, 579, 611, 384, 639, 320, + 326, 358, 576, 582, 614, 384, 639, 301, + 320, 557, 576, 384, 639, 320, 329, 336, + 340, 361, 368, 372, 576, 585, 592, 596, + 617, 624, 628, 384, 639, 320, 336, 368, + 576, 592, 624, 384, 639, 320, 335, 367, + 576, 591, 623, 384, 639, 320, 338, 370, + 576, 594, 626, 384, 639, 320, 340, 372, + 576, 596, 628, 384, 639, 320, 338, 370, + 576, 594, 626, 384, 639, 320, 321, 353, + 576, 577, 609, 384, 639, 320, 334, 366, + 576, 590, 622, 384, 639, 320, 339, 371, + 576, 595, 627, 384, 639, 320, 325, 357, + 576, 581, 613, 384, 639, 320, 321, 353, + 576, 577, 609, 384, 639, 320, 332, 364, + 576, 588, 620, 384, 639, 320, 333, 365, + 576, 589, 621, 384, 639, 320, 325, 329, + 333, 340, 357, 361, 365, 372, 576, 581, + 585, 589, 596, 613, 617, 621, 628, 384, 639, 320, 323, 355, 576, 579, 611, 384, + 639, 320, 324, 327, 332, 356, 359, 364, + 576, 580, 583, 588, 612, 615, 620, 384, + 639, 320, 323, 355, 576, 579, 611, 384, + 639, 320, 335, 367, 576, 591, 623, 384, + 639, 320, 333, 365, 576, 589, 621, 384, + 639, 320, 336, 368, 576, 592, 624, 384, + 639, 301, 320, 557, 576, 384, 639, 320, + 329, 361, 576, 585, 617, 384, 639, 320, + 324, 356, 576, 580, 612, 384, 639, 320, + 325, 357, 576, 581, 613, 384, 639, 320, + 334, 366, 576, 590, 622, 384, 639, 320, + 340, 372, 576, 596, 628, 384, 639, 320, + 339, 371, 576, 595, 627, 384, 639, 320, + 323, 355, 576, 579, 611, 384, 639, 320, + 341, 373, 576, 597, 629, 384, 639, 320, + 334, 366, 576, 590, 622, 384, 639, 301, + 320, 557, 576, 384, 639, 320, 329, 336, + 341, 361, 368, 373, 576, 585, 592, 597, + 617, 624, 629, 384, 639, 320, 336, 368, + 576, 592, 624, 384, 639, 320, 335, 343, + 367, 375, 576, 591, 599, 623, 631, 384, + 639, 320, 338, 370, 576, 594, 626, 384, + 639, 320, 340, 372, 576, 596, 628, 384, + 639, 320, 324, 356, 576, 580, 612, 384, + 639, 320, 339, 371, 576, 595, 627, 384, + 639, 320, 338, 370, 576, 594, 626, 384, 639, 320, 335, 367, 576, 591, 623, 384, 639, 320, 336, 368, 576, 592, 624, 384, 639, 296, 297, 318, 552, 553, 574, 384, @@ -1831,81 +1947,87 @@ static const char _demo_machine_parser_cmd_single_lengths[] = { 2, 2, 2, 2, 2, 2, 2, 4, 2, 4, 2, 2, 2, 2, 1, 4, 2, 2, 2, 2, 6, 6, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 6, + 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 1, - 6, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 2, 2, - 2, 2, 2, 4, 2, 2, 1, 2, - 2, 2, 2, 2, 1, 5, 0, 0, - 2, 0, 29, 0, 29, 30, 4, 2, - 2, 2, 2, 1, 2, 4, 2, 2, - 2, 2, 2, 28, 32, 30, 2, 28, - 30, 30, 2, 2, 2, 2, 28, 4, - 2, 2, 2, 1, 2, 2, 2, 2, - 2, 2, 2, 28, 28, 2, 2, 2, - 2, 2, 28, 2, 2, 30, 2, 2, - 2, 28, 2, 2, 28, 2, 2, 2, - 28, 30, 30, 4, 30, 2, 2, 2, - 2, 28, 12, 2, 2, 2, 2, 2, - 2, 28, 30, 2, 2, 2, 28, 2, - 2, 2, 28, 2, 28, 2, 2, 28, - 2, 28, 2, 2, 2, 2, 2, 28, - 30, 2, 2, 28, 2, 28, 2, 2, - 28, 2, 2, 28, 28, 2, 28, 2, + 2, 2, 1, 6, 2, 4, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 1, 6, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 1, 2, 2, 2, 2, 2, 4, 2, + 2, 1, 2, 2, 2, 2, 2, 1, + 5, 0, 0, 2, 0, 29, 0, 29, + 30, 4, 2, 2, 2, 2, 1, 2, + 4, 2, 2, 2, 2, 2, 28, 32, + 30, 2, 28, 30, 30, 2, 2, 2, + 2, 28, 4, 2, 2, 2, 1, 2, + 2, 2, 2, 2, 2, 2, 28, 28, + 2, 2, 2, 2, 2, 28, 2, 2, + 30, 2, 2, 2, 28, 2, 2, 28, + 2, 2, 2, 28, 30, 30, 4, 30, + 2, 2, 2, 2, 28, 12, 2, 2, + 2, 2, 2, 2, 28, 30, 2, 2, + 2, 28, 2, 2, 2, 28, 2, 28, + 2, 2, 28, 2, 28, 2, 2, 2, + 2, 2, 28, 30, 2, 2, 28, 2, + 28, 2, 2, 28, 2, 2, 28, 28, 2, 28, 2, 2, 28, 2, 2, 28, - 2, 2, 2, 28, 4, 2, 2, 2, - 28, 2, 2, 2, 2, 28, 30, 28, - 32, 30, 28, 30, 30, 28, 28, 28, - 28, 30, 28, 28, 28, 30, 30, 30, - 28, 28, 30, 28, 28, 28, 28, 28, - 28, 30, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 62, 4, - 4, 8, 1, 1, 8, 9, 3, 3, - 3, 3, 7, 9, 3, 3, 3, 3, - 3, 7, 3, 3, 3, 3, 3, 7, - 7, 3, 3, 7, 9, 7, 9, 7, - 7, 7, 2, 2, 16, 4, 2, 4, - 4, 16, 20, 8, 8, 8, 8, 16, - 20, 8, 8, 8, 8, 8, 16, 8, - 8, 8, 8, 8, 16, 16, 8, 8, - 16, 20, 6, 6, 6, 6, 16, 20, - 6, 6, 6, 6, 6, 14, 6, 6, - 6, 6, 6, 16, 16, 6, 6, 16, - 44, 6, 6, 32, 6, 6, 6, 32, - 8, 6, 6, 6, 6, 32, 8, 6, - 6, 6, 32, 6, 6, 6, 32, 6, - 6, 6, 6, 6, 32, 8, 6, 8, - 32, 6, 6, 6, 6, 5, 8, 6, - 32, 6, 6, 6, 32, 10, 10, 6, - 6, 6, 6, 6, 32, 6, 6, 6, - 6, 32, 10, 6, 32, 6, 32, 6, - 32, 10, 32, 6, 6, 6, 6, 5, - 6, 6, 32, 6, 6, 6, 32, 6, - 6, 32, 6, 32, 34, 6, 6, 6, - 32, 6, 6, 6, 5, 10, 6, 32, - 6, 6, 6, 32, 6, 6, 6, 6, - 32, 6, 6, 6, 32, 32, 6, 5, - 32, 6, 6, 6, 6, 6, 32, 8, - 6, 6, 32, 5, 6, 6, 6, 6, - 6, 32, 62, 32, 32, 32, 32, 32, + 2, 2, 28, 2, 2, 2, 28, 4, + 2, 2, 2, 28, 2, 2, 2, 2, + 28, 30, 28, 32, 30, 28, 30, 30, + 28, 28, 28, 28, 30, 28, 28, 28, + 30, 30, 30, 28, 28, 30, 28, 28, + 28, 28, 28, 28, 30, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 28, 62, 4, 4, 8, 1, 1, 8, + 9, 3, 3, 3, 3, 7, 9, 3, + 3, 3, 3, 3, 7, 3, 3, 3, + 3, 3, 7, 7, 3, 3, 7, 9, + 7, 9, 7, 7, 7, 2, 2, 16, + 4, 2, 4, 4, 16, 20, 8, 8, + 8, 8, 16, 20, 8, 8, 8, 8, + 8, 16, 8, 8, 8, 8, 8, 16, + 16, 8, 8, 16, 20, 6, 6, 6, + 6, 16, 20, 6, 6, 6, 6, 6, + 14, 6, 6, 6, 6, 6, 16, 16, + 6, 6, 16, 44, 6, 6, 32, 6, + 6, 6, 32, 8, 6, 6, 6, 6, + 32, 8, 6, 6, 6, 32, 6, 6, + 6, 32, 6, 6, 6, 6, 6, 32, + 8, 6, 8, 32, 6, 6, 6, 6, + 5, 8, 6, 32, 6, 6, 6, 32, + 10, 10, 6, 6, 6, 6, 6, 32, + 6, 6, 6, 6, 32, 12, 6, 32, + 6, 32, 6, 32, 10, 32, 6, 6, + 6, 6, 5, 6, 6, 32, 6, 6, + 6, 32, 6, 6, 32, 6, 6, 5, + 10, 6, 32, 8, 6, 6, 32, 6, + 32, 6, 6, 32, 6, 32, 34, 6, + 6, 6, 32, 6, 6, 6, 5, 10, + 6, 32, 6, 6, 6, 32, 6, 6, + 6, 6, 32, 6, 6, 6, 32, 32, + 6, 5, 32, 6, 6, 6, 6, 6, + 32, 8, 6, 6, 32, 5, 6, 6, + 6, 6, 6, 32, 62, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 34, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 6, 6, 6, 6, 6, 10, 6, - 6, 6, 6, 10, 6, 6, 4, 6, + 32, 32, 32, 32, 34, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 6, 6, 6, 6, 6, 10, 6, 6, 6, + 6, 10, 6, 6, 4, 6, 6, 6, + 6, 6, 10, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 10, 6, 10, - 6, 4, 6, 6, 6, 6, 4, 10, - 6, 6, 6, 6, 6, 6, 6, 14, - 14, 6, 6, 6, 6, 6, 6, 34, - 6, 6, 6, 6, 6, 6, 4, 14, + 6, 6, 6, 10, 6, 10, 6, 4, + 6, 6, 6, 6, 4, 10, 6, 6, + 6, 6, 6, 6, 6, 14, 14, 6, + 6, 6, 6, 6, 6, 34, 6, 6, + 6, 6, 6, 6, 4, 14, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 14, 6, 14, 6, - 6, 6, 6, 4, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 2, 2 + 6, 6, 18, 6, 14, 6, 6, 6, + 6, 4, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 4, 14, 6, 10, 6, + 6, 6, 6, 6, 6, 6, 6, 2, + 2 }; static const char _demo_machine_parser_cmd_range_lengths[] = { @@ -1936,8 +2058,9 @@ static const char _demo_machine_parser_cmd_range_lengths[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 1, - 4, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1959,19 +2082,19 @@ static const char _demo_machine_parser_cmd_range_lengths[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 6, 6, 1, 4, + 1, 1, 1, 1, 1, 1, 1, 6, + 6, 1, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 4, 1, 1, 1, 1, 4, 4, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 4, 4, 1, 1, 4, - 10, 2, 2, 2, 2, 2, 2, 2, + 6, 6, 6, 6, 4, 1, 1, 1, + 1, 4, 4, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 4, 4, + 1, 1, 4, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -1987,7 +2110,9 @@ static const char _demo_machine_parser_cmd_range_lengths[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -2003,7 +2128,10 @@ static const char _demo_machine_parser_cmd_range_lengths[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1 + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1 }; static const short _demo_machine_parser_cmd_index_offsets[] = { @@ -2028,80 +2156,86 @@ static const short _demo_machine_parser_cmd_index_offsets[] = { 463, 466, 471, 474, 477, 480, 483, 485, 490, 493, 496, 499, 502, 509, 516, 519, 522, 525, 528, 531, 534, 537, 540, 543, - 550, 553, 556, 559, 566, 569, 572, 575, - 578, 580, 583, 586, 589, 592, 595, 598, - 601, 604, 607, 610, 613, 616, 619, 622, - 624, 631, 634, 637, 640, 643, 646, 649, - 652, 655, 658, 661, 664, 667, 669, 672, - 675, 678, 681, 684, 689, 692, 695, 697, - 700, 703, 706, 709, 712, 714, 720, 722, - 724, 731, 733, 763, 764, 794, 825, 830, - 833, 836, 839, 842, 844, 847, 852, 855, - 858, 861, 864, 867, 896, 929, 960, 963, - 992, 1023, 1054, 1057, 1060, 1063, 1066, 1095, - 1100, 1103, 1106, 1109, 1111, 1114, 1117, 1120, - 1123, 1126, 1129, 1132, 1161, 1190, 1193, 1196, - 1199, 1202, 1205, 1234, 1237, 1240, 1271, 1274, - 1277, 1280, 1309, 1312, 1315, 1344, 1347, 1350, - 1353, 1382, 1413, 1444, 1449, 1480, 1483, 1486, - 1489, 1492, 1521, 1534, 1537, 1540, 1543, 1546, - 1549, 1552, 1581, 1612, 1615, 1618, 1621, 1650, - 1653, 1656, 1659, 1688, 1691, 1720, 1723, 1726, - 1755, 1758, 1787, 1790, 1793, 1796, 1799, 1802, - 1831, 1862, 1865, 1868, 1897, 1900, 1929, 1932, - 1935, 1964, 1967, 1970, 1999, 2028, 2031, 2060, - 2063, 2066, 2095, 2098, 2101, 2130, 2133, 2136, - 2165, 2168, 2171, 2174, 2203, 2208, 2211, 2214, - 2217, 2246, 2249, 2252, 2255, 2258, 2287, 2318, - 2347, 2380, 2411, 2440, 2471, 2502, 2531, 2560, - 2589, 2618, 2649, 2678, 2707, 2736, 2767, 2798, - 2829, 2858, 2887, 2918, 2947, 2976, 3005, 3034, - 3063, 3092, 3123, 3152, 3181, 3210, 3239, 3268, - 3297, 3326, 3355, 3384, 3413, 3442, 3471, 3536, - 3543, 3549, 3559, 3562, 3565, 3575, 3586, 3591, - 3596, 3601, 3606, 3615, 3626, 3631, 3636, 3641, - 3646, 3651, 3660, 3665, 3670, 3675, 3680, 3685, - 3694, 3703, 3708, 3713, 3722, 3733, 3742, 3753, - 3762, 3771, 3780, 3784, 3788, 3811, 3822, 3826, - 3835, 3846, 3869, 3896, 3911, 3926, 3941, 3956, - 3979, 4006, 4021, 4036, 4051, 4066, 4081, 4104, - 4119, 4134, 4149, 4164, 4179, 4202, 4225, 4240, - 4255, 4278, 4303, 4311, 4319, 4327, 4335, 4356, - 4381, 4389, 4397, 4405, 4413, 4421, 4437, 4445, - 4453, 4461, 4469, 4477, 4498, 4519, 4527, 4535, - 4556, 4611, 4620, 4629, 4664, 4673, 4682, 4691, - 4726, 4737, 4746, 4755, 4764, 4773, 4808, 4819, - 4828, 4837, 4846, 4881, 4890, 4899, 4908, 4943, - 4952, 4961, 4970, 4979, 4988, 5023, 5034, 5043, - 5054, 5089, 5098, 5107, 5116, 5125, 5133, 5144, - 5153, 5188, 5197, 5206, 5215, 5250, 5263, 5276, - 5285, 5294, 5303, 5312, 5321, 5356, 5365, 5374, - 5383, 5392, 5427, 5440, 5449, 5484, 5493, 5528, - 5537, 5572, 5585, 5620, 5629, 5638, 5647, 5656, - 5664, 5673, 5682, 5717, 5726, 5735, 5744, 5779, - 5788, 5797, 5832, 5841, 5876, 5913, 5922, 5931, - 5940, 5975, 5984, 5993, 6002, 6010, 6023, 6032, - 6067, 6076, 6085, 6094, 6129, 6138, 6147, 6156, - 6165, 6200, 6209, 6218, 6227, 6262, 6297, 6306, - 6314, 6349, 6358, 6367, 6376, 6385, 6394, 6429, - 6440, 6449, 6458, 6493, 6501, 6510, 6519, 6528, - 6537, 6546, 6581, 6646, 6680, 6714, 6748, 6782, - 6816, 6850, 6884, 6918, 6952, 6986, 7020, 7054, - 7088, 7122, 7156, 7190, 7224, 7258, 7292, 7328, - 7362, 7396, 7430, 7464, 7498, 7532, 7566, 7600, - 7634, 7668, 7676, 7684, 7692, 7700, 7708, 7720, - 7728, 7736, 7744, 7752, 7764, 7772, 7780, 7786, - 7794, 7802, 7810, 7818, 7826, 7838, 7846, 7854, - 7862, 7870, 7878, 7886, 7894, 7902, 7910, 7918, - 7926, 7934, 7942, 7950, 7958, 7966, 7978, 7986, - 7998, 8006, 8012, 8020, 8028, 8036, 8044, 8050, - 8062, 8070, 8078, 8086, 8094, 8102, 8110, 8118, - 8134, 8150, 8158, 8166, 8174, 8182, 8190, 8198, - 8234, 8242, 8250, 8258, 8266, 8274, 8282, 8288, - 8304, 8312, 8320, 8328, 8336, 8344, 8352, 8360, - 8368, 8376, 8384, 8392, 8400, 8416, 8424, 8440, - 8448, 8456, 8464, 8472, 8478, 8486, 8494, 8502, - 8510, 8518, 8526, 8534, 8542, 8550, 8558, 8562 + 552, 555, 558, 561, 568, 571, 574, 577, + 580, 582, 585, 588, 591, 594, 597, 600, + 603, 606, 609, 611, 618, 621, 626, 629, + 632, 635, 638, 641, 644, 647, 650, 653, + 656, 659, 662, 664, 671, 674, 677, 680, + 683, 686, 689, 692, 695, 698, 701, 704, + 707, 709, 712, 715, 718, 721, 724, 729, + 732, 735, 737, 740, 743, 746, 749, 752, + 754, 760, 762, 764, 771, 773, 803, 804, + 834, 865, 870, 873, 876, 879, 882, 884, + 887, 892, 895, 898, 901, 904, 907, 936, + 969, 1000, 1003, 1032, 1063, 1094, 1097, 1100, + 1103, 1106, 1135, 1140, 1143, 1146, 1149, 1151, + 1154, 1157, 1160, 1163, 1166, 1169, 1172, 1201, + 1230, 1233, 1236, 1239, 1242, 1245, 1274, 1277, + 1280, 1311, 1314, 1317, 1320, 1349, 1352, 1355, + 1384, 1387, 1390, 1393, 1422, 1453, 1484, 1489, + 1520, 1523, 1526, 1529, 1532, 1561, 1574, 1577, + 1580, 1583, 1586, 1589, 1592, 1621, 1652, 1655, + 1658, 1661, 1690, 1693, 1696, 1699, 1728, 1731, + 1760, 1763, 1766, 1795, 1798, 1827, 1830, 1833, + 1836, 1839, 1842, 1871, 1902, 1905, 1908, 1937, + 1940, 1969, 1972, 1975, 2004, 2007, 2010, 2039, + 2068, 2071, 2100, 2103, 2106, 2135, 2138, 2141, + 2170, 2173, 2176, 2205, 2208, 2211, 2214, 2243, + 2248, 2251, 2254, 2257, 2286, 2289, 2292, 2295, + 2298, 2327, 2358, 2387, 2420, 2451, 2480, 2511, + 2542, 2571, 2600, 2629, 2658, 2689, 2718, 2747, + 2776, 2807, 2838, 2869, 2898, 2927, 2958, 2987, + 3016, 3045, 3074, 3103, 3132, 3163, 3192, 3221, + 3250, 3279, 3308, 3337, 3366, 3395, 3424, 3453, + 3482, 3511, 3576, 3583, 3589, 3599, 3602, 3605, + 3615, 3626, 3631, 3636, 3641, 3646, 3655, 3666, + 3671, 3676, 3681, 3686, 3691, 3700, 3705, 3710, + 3715, 3720, 3725, 3734, 3743, 3748, 3753, 3762, + 3773, 3782, 3793, 3802, 3811, 3820, 3824, 3828, + 3851, 3862, 3866, 3875, 3886, 3909, 3936, 3951, + 3966, 3981, 3996, 4019, 4046, 4061, 4076, 4091, + 4106, 4121, 4144, 4159, 4174, 4189, 4204, 4219, + 4242, 4265, 4280, 4295, 4318, 4343, 4351, 4359, + 4367, 4375, 4396, 4421, 4429, 4437, 4445, 4453, + 4461, 4477, 4485, 4493, 4501, 4509, 4517, 4538, + 4559, 4567, 4575, 4596, 4651, 4660, 4669, 4704, + 4713, 4722, 4731, 4766, 4777, 4786, 4795, 4804, + 4813, 4848, 4859, 4868, 4877, 4886, 4921, 4930, + 4939, 4948, 4983, 4992, 5001, 5010, 5019, 5028, + 5063, 5074, 5083, 5094, 5129, 5138, 5147, 5156, + 5165, 5173, 5184, 5193, 5228, 5237, 5246, 5255, + 5290, 5303, 5316, 5325, 5334, 5343, 5352, 5361, + 5396, 5405, 5414, 5423, 5432, 5467, 5482, 5491, + 5526, 5535, 5570, 5579, 5614, 5627, 5662, 5671, + 5680, 5689, 5698, 5706, 5715, 5724, 5759, 5768, + 5777, 5786, 5821, 5830, 5839, 5874, 5883, 5892, + 5900, 5913, 5922, 5957, 5968, 5977, 5986, 6021, + 6030, 6065, 6074, 6083, 6118, 6127, 6162, 6199, + 6208, 6217, 6226, 6261, 6270, 6279, 6288, 6296, + 6309, 6318, 6353, 6362, 6371, 6380, 6415, 6424, + 6433, 6442, 6451, 6486, 6495, 6504, 6513, 6548, + 6583, 6592, 6600, 6635, 6644, 6653, 6662, 6671, + 6680, 6715, 6726, 6735, 6744, 6779, 6787, 6796, + 6805, 6814, 6823, 6832, 6867, 6932, 6966, 7000, + 7034, 7068, 7102, 7136, 7170, 7204, 7238, 7272, + 7306, 7340, 7374, 7408, 7442, 7476, 7510, 7544, + 7578, 7612, 7646, 7680, 7714, 7750, 7784, 7818, + 7852, 7886, 7920, 7954, 7988, 8022, 8056, 8090, + 8098, 8106, 8114, 8122, 8130, 8142, 8150, 8158, + 8166, 8174, 8186, 8194, 8202, 8208, 8216, 8224, + 8232, 8240, 8248, 8260, 8268, 8276, 8284, 8292, + 8300, 8308, 8316, 8324, 8332, 8340, 8348, 8356, + 8364, 8372, 8380, 8388, 8400, 8408, 8420, 8428, + 8434, 8442, 8450, 8458, 8466, 8472, 8484, 8492, + 8500, 8508, 8516, 8524, 8532, 8540, 8556, 8572, + 8580, 8588, 8596, 8604, 8612, 8620, 8656, 8664, + 8672, 8680, 8688, 8696, 8704, 8710, 8726, 8734, + 8742, 8750, 8758, 8766, 8774, 8782, 8790, 8798, + 8806, 8814, 8822, 8842, 8850, 8866, 8874, 8882, + 8890, 8898, 8904, 8912, 8920, 8928, 8936, 8944, + 8952, 8960, 8968, 8976, 8982, 8998, 9006, 9018, + 9026, 9034, 9042, 9050, 9058, 9066, 9074, 9082, + 9086 }; static const short _demo_machine_parser_cmd_indicies[] = { @@ -2173,1697 +2307,1811 @@ static const short _demo_machine_parser_cmd_indicies[] = { 180, 113, 181, 181, 113, 175, 175, 113, 182, 182, 113, 183, 183, 113, 184, 184, 113, 185, 185, 113, 186, 186, 113, 187, - 188, 189, 187, 188, 189, 113, 190, 190, - 113, 191, 191, 113, 192, 192, 113, 193, - 194, 195, 193, 194, 195, 113, 196, 196, - 113, 197, 197, 113, 198, 198, 113, 199, - 199, 113, 200, 113, 201, 201, 113, 202, - 202, 113, 203, 203, 113, 204, 204, 113, - 205, 205, 113, 206, 206, 113, 207, 207, - 113, 208, 208, 113, 209, 209, 113, 210, - 210, 113, 211, 211, 113, 212, 212, 113, - 213, 213, 113, 214, 214, 113, 215, 113, - 216, 217, 218, 216, 217, 218, 113, 219, - 219, 113, 220, 220, 113, 221, 221, 113, - 222, 222, 113, 223, 223, 113, 224, 224, - 113, 225, 225, 113, 226, 226, 113, 227, - 227, 113, 228, 228, 113, 229, 229, 113, - 230, 230, 113, 231, 113, 232, 232, 113, - 233, 233, 113, 234, 234, 113, 235, 235, - 113, 192, 192, 113, 236, 237, 236, 237, - 113, 238, 238, 113, 239, 239, 113, 240, - 113, 241, 241, 113, 242, 242, 113, 243, - 243, 113, 244, 244, 113, 245, 245, 113, - 246, 1, 248, 249, 250, 251, 252, 247, - 254, 253, 256, 255, 258, 258, 258, 259, - 258, 259, 257, 261, 260, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 263, 280, 264, 281, 282, 283, + 188, 189, 190, 187, 188, 189, 190, 113, + 191, 191, 113, 192, 192, 113, 193, 193, + 113, 194, 195, 196, 194, 195, 196, 113, + 197, 197, 113, 198, 198, 113, 199, 199, + 113, 200, 200, 113, 201, 113, 202, 202, + 113, 203, 203, 113, 204, 204, 113, 205, + 205, 113, 206, 206, 113, 207, 207, 113, + 208, 208, 113, 209, 209, 113, 210, 210, + 113, 211, 113, 212, 213, 214, 212, 213, + 214, 113, 215, 215, 113, 216, 217, 216, + 217, 113, 218, 218, 113, 219, 219, 113, + 220, 220, 113, 221, 221, 113, 222, 222, + 113, 223, 223, 113, 224, 224, 113, 225, + 225, 113, 226, 226, 113, 227, 227, 113, + 228, 228, 113, 229, 229, 113, 230, 113, + 231, 232, 233, 231, 232, 233, 113, 234, + 234, 113, 235, 235, 113, 236, 236, 113, + 237, 237, 113, 238, 238, 113, 239, 239, + 113, 240, 240, 113, 241, 241, 113, 242, + 242, 113, 243, 243, 113, 244, 244, 113, + 245, 245, 113, 246, 113, 247, 247, 113, + 248, 248, 113, 249, 249, 113, 250, 250, + 113, 193, 193, 113, 251, 252, 251, 252, + 113, 253, 253, 113, 254, 254, 113, 255, + 113, 256, 256, 113, 257, 257, 113, 258, + 258, 113, 259, 259, 113, 260, 260, 113, + 261, 1, 263, 264, 265, 266, 267, 262, + 269, 268, 271, 270, 273, 273, 273, 274, + 273, 274, 272, 276, 275, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 281, 282, 283, 284, 285, - 286, 287, 288, 289, 290, 291, 292, 293, - 294, 263, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, - 310, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, - 280, 311, 312, 311, 312, 280, 313, 313, - 280, 314, 314, 280, 315, 315, 280, 316, - 316, 280, 317, 280, 318, 318, 280, 319, - 320, 319, 320, 280, 321, 321, 280, 322, - 322, 280, 323, 323, 280, 324, 324, 280, - 325, 325, 280, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 337, 338, 339, - 340, 327, 328, 329, 330, 331, 332, 333, - 334, 335, 336, 337, 338, 339, 340, 280, - 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, - 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, - 280, 359, 360, 361, 362, 363, 364, 365, - 366, 367, 368, 369, 370, 371, 372, 373, - 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 280, - 374, 374, 280, 376, 377, 378, 379, 380, + 292, 293, 278, 295, 279, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, + 309, 278, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, + 325, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, + 295, 326, 327, 326, 327, 295, 328, 328, + 295, 329, 329, 295, 330, 330, 295, 331, + 331, 295, 332, 295, 333, 333, 295, 334, + 335, 334, 335, 295, 336, 336, 295, 337, + 337, 295, 338, 338, 295, 339, 339, 295, + 340, 340, 295, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, + 355, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 295, + 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, + 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, + 295, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, - 389, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 385, 386, 387, 388, 389, 280, - 391, 392, 393, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 391, - 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 280, 407, - 408, 409, 410, 411, 412, 413, 414, 415, - 416, 417, 418, 419, 420, 421, 407, 408, - 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 280, 422, 422, - 280, 423, 423, 280, 424, 424, 280, 420, - 420, 280, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, - 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 280, 440, - 441, 440, 441, 280, 442, 442, 280, 443, - 443, 280, 444, 444, 280, 445, 280, 446, - 446, 280, 447, 447, 280, 448, 448, 280, - 449, 449, 280, 450, 450, 280, 451, 451, - 280, 441, 441, 280, 453, 454, 455, 456, - 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 466, - 280, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 468, - 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 280, 482, 482, - 280, 483, 483, 280, 484, 484, 280, 485, - 485, 280, 486, 486, 280, 468, 469, 470, - 487, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, 468, 469, 470, 487, 472, - 473, 474, 475, 476, 477, 478, 479, 480, - 481, 280, 488, 488, 280, 489, 489, 280, - 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 491, - 492, 493, 494, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 280, 506, - 506, 280, 507, 507, 280, 508, 508, 280, - 491, 492, 493, 494, 495, 496, 498, 499, - 500, 501, 502, 503, 504, 505, 491, 492, - 493, 494, 495, 496, 498, 499, 500, 501, - 502, 503, 504, 505, 280, 509, 509, 280, - 510, 510, 280, 512, 513, 514, 515, 516, - 517, 518, 519, 520, 521, 522, 523, 524, - 525, 512, 513, 514, 515, 516, 517, 518, - 519, 520, 521, 522, 523, 524, 525, 280, - 526, 526, 280, 527, 527, 280, 528, 528, - 280, 512, 513, 514, 515, 516, 517, 529, - 519, 520, 521, 522, 523, 524, 525, 512, - 513, 514, 515, 516, 517, 529, 519, 520, - 521, 522, 523, 524, 525, 280, 359, 530, - 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 373, 372, 359, 530, 361, - 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 373, 372, 280, 532, 533, 534, - 535, 536, 537, 538, 539, 540, 541, 542, - 543, 544, 545, 546, 532, 533, 534, 535, - 536, 537, 538, 539, 540, 541, 542, 543, - 544, 545, 546, 280, 547, 548, 547, 548, - 280, 550, 551, 552, 553, 554, 555, 556, - 557, 558, 559, 560, 561, 562, 563, 564, + 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 295, + 389, 389, 295, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, + 404, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 295, + 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 406, + 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 295, 422, + 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 295, 437, 437, + 295, 438, 438, 295, 439, 439, 295, 435, + 435, 295, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, + 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 295, 455, + 456, 455, 456, 295, 457, 457, 295, 458, + 458, 295, 459, 459, 295, 460, 295, 461, + 461, 295, 462, 462, 295, 463, 463, 295, + 464, 464, 295, 465, 465, 295, 466, 466, + 295, 456, 456, 295, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, + 295, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 483, + 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 295, 497, 497, + 295, 498, 498, 295, 499, 499, 295, 500, + 500, 295, 501, 501, 295, 483, 484, 485, + 502, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 483, 484, 485, 502, 487, + 488, 489, 490, 491, 492, 493, 494, 495, + 496, 295, 503, 503, 295, 504, 504, 295, + 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 506, + 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 295, 521, + 521, 295, 522, 522, 295, 523, 523, 295, + 506, 507, 508, 509, 510, 511, 513, 514, + 515, 516, 517, 518, 519, 520, 506, 507, + 508, 509, 510, 511, 513, 514, 515, 516, + 517, 518, 519, 520, 295, 524, 524, 295, + 525, 525, 295, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 536, 537, 538, 539, + 540, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 536, 537, 538, 539, 540, 295, + 541, 541, 295, 542, 542, 295, 543, 543, + 295, 527, 528, 529, 530, 531, 532, 544, + 534, 535, 536, 537, 538, 539, 540, 527, + 528, 529, 530, 531, 532, 544, 534, 535, + 536, 537, 538, 539, 540, 295, 374, 545, + 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 388, 387, 374, 545, 376, + 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 388, 387, 295, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, - 558, 559, 560, 561, 562, 563, 564, 280, - 565, 565, 280, 566, 566, 280, 567, 567, - 280, 568, 568, 280, 550, 551, 552, 553, - 554, 555, 557, 558, 559, 560, 561, 562, - 563, 564, 550, 551, 552, 553, 554, 555, - 557, 558, 559, 560, 561, 562, 563, 564, - 280, 569, 570, 571, 572, 573, 574, 569, - 570, 571, 572, 573, 574, 280, 575, 575, - 280, 576, 576, 280, 577, 577, 280, 578, - 578, 280, 579, 579, 280, 572, 572, 280, - 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, 593, 594, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, - 591, 592, 593, 594, 280, 596, 597, 598, - 599, 600, 601, 602, 603, 604, 605, 606, - 607, 608, 609, 610, 596, 597, 598, 599, - 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 280, 611, 611, 280, 612, - 612, 280, 613, 613, 280, 596, 597, 598, - 599, 600, 601, 603, 604, 605, 606, 607, - 608, 609, 610, 596, 597, 598, 599, 600, - 601, 603, 604, 605, 606, 607, 608, 609, - 610, 280, 614, 614, 280, 615, 615, 280, - 616, 616, 280, 618, 619, 620, 621, 622, - 623, 624, 625, 626, 627, 628, 629, 630, - 631, 618, 619, 620, 621, 622, 623, 624, - 625, 626, 627, 628, 629, 630, 631, 280, - 632, 632, 280, 634, 635, 636, 637, 638, - 639, 640, 641, 642, 643, 644, 645, 646, - 647, 634, 635, 636, 637, 638, 639, 640, - 641, 642, 643, 644, 645, 646, 647, 280, - 648, 648, 280, 649, 649, 280, 651, 652, - 653, 654, 655, 656, 657, 658, 659, 660, - 661, 662, 663, 664, 651, 652, 653, 654, - 655, 656, 657, 658, 659, 660, 661, 662, - 663, 664, 280, 665, 665, 280, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, - 677, 678, 679, 680, 667, 668, 669, 670, - 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 280, 681, 681, 280, 682, 682, - 280, 683, 683, 280, 684, 684, 280, 685, - 685, 280, 667, 668, 669, 670, 671, 672, - 673, 674, 675, 676, 677, 678, 686, 680, - 667, 668, 669, 670, 671, 672, 673, 674, - 675, 676, 677, 678, 686, 680, 280, 688, - 689, 690, 691, 692, 693, 694, 695, 696, - 697, 698, 699, 700, 701, 702, 688, 689, - 690, 691, 692, 693, 694, 695, 696, 697, - 698, 699, 700, 701, 702, 280, 703, 703, - 280, 704, 704, 280, 688, 689, 690, 691, - 692, 693, 694, 695, 696, 697, 698, 699, - 700, 702, 688, 689, 690, 691, 692, 693, - 694, 695, 696, 697, 698, 699, 700, 702, - 280, 705, 705, 280, 532, 533, 534, 706, - 536, 537, 538, 539, 540, 541, 542, 543, - 544, 546, 532, 533, 534, 706, 536, 537, - 538, 539, 540, 541, 542, 543, 544, 546, - 280, 707, 707, 280, 708, 708, 280, 359, - 530, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 359, 530, 361, - 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 280, 709, 709, 280, 710, - 710, 280, 711, 408, 409, 712, 411, 412, - 413, 414, 713, 416, 417, 418, 419, 421, - 711, 408, 409, 712, 411, 412, 413, 414, - 713, 416, 417, 418, 419, 421, 280, 715, - 716, 717, 718, 719, 720, 721, 722, 723, - 724, 725, 726, 727, 728, 715, 716, 717, - 718, 719, 720, 721, 722, 723, 724, 725, - 726, 727, 728, 280, 729, 729, 280, 715, - 716, 717, 718, 719, 720, 730, 722, 723, - 724, 725, 726, 727, 728, 715, 716, 717, - 718, 719, 720, 730, 722, 723, 724, 725, - 726, 727, 728, 280, 731, 731, 280, 732, - 732, 280, 391, 392, 393, 394, 395, 396, - 398, 399, 400, 401, 402, 403, 404, 405, - 391, 392, 393, 394, 395, 396, 398, 399, - 400, 401, 402, 403, 404, 405, 280, 733, - 733, 280, 734, 734, 280, 736, 737, 738, - 739, 740, 741, 742, 743, 744, 745, 746, - 747, 748, 749, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, - 749, 280, 750, 750, 280, 751, 751, 280, - 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 357, 342, 343, - 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 357, 280, 752, 752, 280, - 753, 753, 280, 754, 754, 280, 756, 757, - 758, 759, 760, 761, 762, 763, 764, 765, - 766, 767, 768, 769, 756, 757, 758, 759, - 760, 761, 762, 763, 764, 765, 766, 767, - 768, 769, 280, 325, 754, 325, 754, 280, - 770, 770, 280, 771, 771, 280, 772, 772, - 280, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 773, 296, - 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 773, 280, 774, 774, - 280, 775, 775, 280, 776, 776, 280, 310, - 310, 280, 778, 779, 780, 781, 782, 783, - 784, 785, 786, 787, 788, 789, 790, 791, - 778, 779, 780, 781, 782, 783, 784, 785, - 786, 787, 788, 789, 790, 791, 280, 793, - 794, 795, 796, 797, 798, 799, 800, 801, - 802, 803, 804, 805, 806, 111, 793, 794, - 795, 796, 797, 798, 799, 800, 801, 802, - 803, 804, 805, 806, 111, 792, 808, 809, + 558, 559, 560, 561, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 295, 562, 563, 562, 563, + 295, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, + 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 295, + 580, 580, 295, 581, 581, 295, 582, 582, + 295, 583, 583, 295, 565, 566, 567, 568, + 569, 570, 572, 573, 574, 575, 576, 577, + 578, 579, 565, 566, 567, 568, 569, 570, + 572, 573, 574, 575, 576, 577, 578, 579, + 295, 584, 585, 586, 587, 588, 589, 584, + 585, 586, 587, 588, 589, 295, 590, 590, + 295, 591, 591, 295, 592, 592, 295, 593, + 593, 295, 594, 594, 295, 587, 587, 295, + 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 295, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 295, 626, 626, 295, 627, + 627, 295, 628, 628, 295, 611, 612, 613, + 614, 615, 616, 618, 619, 620, 621, 622, + 623, 624, 625, 611, 612, 613, 614, 615, + 616, 618, 619, 620, 621, 622, 623, 624, + 625, 295, 629, 629, 295, 630, 630, 295, + 631, 631, 295, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, + 646, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 295, + 647, 647, 295, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, + 662, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 295, + 663, 663, 295, 664, 664, 295, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 295, 680, 680, 295, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 295, 696, 696, 295, 697, 697, + 295, 698, 698, 295, 699, 699, 295, 700, + 700, 295, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 701, 695, + 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 701, 695, 295, 703, + 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 295, 718, 718, + 295, 719, 719, 295, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, + 715, 717, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 717, + 295, 720, 720, 295, 547, 548, 549, 721, + 551, 552, 553, 554, 555, 556, 557, 558, + 559, 561, 547, 548, 549, 721, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 561, + 295, 722, 722, 295, 723, 723, 295, 374, + 545, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 374, 545, 376, + 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 295, 724, 724, 295, 725, + 725, 295, 726, 423, 424, 727, 426, 427, + 428, 429, 728, 431, 432, 433, 434, 436, + 726, 423, 424, 727, 426, 427, 428, 429, + 728, 431, 432, 433, 434, 436, 295, 730, + 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 295, 744, 744, 295, 730, + 731, 732, 733, 734, 735, 745, 737, 738, + 739, 740, 741, 742, 743, 730, 731, 732, + 733, 734, 735, 745, 737, 738, 739, 740, + 741, 742, 743, 295, 746, 746, 295, 747, + 747, 295, 406, 407, 408, 409, 410, 411, + 413, 414, 415, 416, 417, 418, 419, 420, + 406, 407, 408, 409, 410, 411, 413, 414, + 415, 416, 417, 418, 419, 420, 295, 748, + 748, 295, 749, 749, 295, 751, 752, 753, + 754, 755, 756, 757, 758, 759, 760, 761, + 762, 763, 764, 751, 752, 753, 754, 755, + 756, 757, 758, 759, 760, 761, 762, 763, + 764, 295, 765, 765, 295, 766, 766, 295, + 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 372, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 372, 295, 767, 767, 295, + 768, 768, 295, 769, 769, 295, 771, 772, + 773, 774, 775, 776, 777, 778, 779, 780, + 781, 782, 783, 784, 771, 772, 773, 774, + 775, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 295, 340, 769, 340, 769, 295, + 785, 785, 295, 786, 786, 295, 787, 787, + 295, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 788, 311, + 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 788, 295, 789, 789, + 295, 790, 790, 295, 791, 791, 295, 325, + 325, 295, 793, 794, 795, 796, 797, 798, + 799, 800, 801, 802, 803, 804, 805, 806, + 793, 794, 795, 796, 797, 798, 799, 800, + 801, 802, 803, 804, 805, 806, 295, 808, + 809, 810, 811, 812, 813, 814, 815, 816, + 817, 818, 819, 820, 821, 111, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, - 818, 819, 820, 821, 808, 809, 810, 811, - 812, 813, 814, 815, 816, 817, 818, 819, - 820, 821, 807, 823, 824, 825, 826, 827, - 828, 829, 830, 831, 832, 833, 834, 835, - 836, 837, 838, 823, 824, 825, 826, 827, - 828, 829, 830, 831, 832, 833, 834, 835, - 836, 837, 838, 822, 840, 841, 842, 843, - 844, 845, 846, 847, 848, 849, 850, 851, - 852, 853, 854, 840, 841, 842, 843, 844, - 845, 846, 847, 848, 849, 850, 851, 852, - 853, 854, 839, 856, 857, 858, 859, 860, - 861, 862, 863, 864, 865, 866, 867, 868, - 869, 856, 857, 858, 859, 860, 861, 862, - 863, 864, 865, 866, 867, 868, 869, 855, - 871, 872, 873, 874, 875, 876, 877, 878, - 879, 880, 881, 882, 883, 884, 885, 871, - 872, 873, 874, 875, 876, 877, 878, 879, - 880, 881, 882, 883, 884, 885, 870, 887, - 888, 889, 890, 891, 892, 893, 894, 895, - 896, 897, 898, 899, 28, 900, 887, 888, - 889, 890, 891, 892, 893, 894, 895, 896, - 897, 898, 899, 28, 900, 886, 902, 903, - 904, 905, 906, 907, 908, 909, 910, 911, - 912, 913, 914, 915, 902, 903, 904, 905, - 906, 907, 908, 909, 910, 911, 912, 913, - 914, 915, 901, 917, 918, 919, 920, 921, - 922, 923, 924, 925, 926, 927, 928, 929, - 930, 917, 918, 919, 920, 921, 922, 923, - 924, 925, 926, 927, 928, 929, 930, 916, - 932, 933, 934, 935, 936, 937, 938, 939, - 940, 941, 942, 943, 944, 945, 932, 933, - 934, 935, 936, 937, 938, 939, 940, 941, - 942, 943, 944, 945, 931, 932, 933, 934, - 946, 936, 937, 938, 939, 940, 941, 942, - 943, 944, 945, 932, 933, 934, 946, 936, - 937, 938, 939, 940, 941, 942, 943, 944, - 945, 931, 948, 949, 950, 951, 952, 953, - 954, 955, 956, 957, 958, 959, 960, 961, - 962, 948, 949, 950, 951, 952, 953, 954, - 955, 956, 957, 958, 959, 960, 961, 962, - 947, 948, 949, 950, 951, 952, 953, 955, - 956, 957, 958, 959, 960, 961, 962, 948, - 949, 950, 951, 952, 953, 955, 956, 957, - 958, 959, 960, 961, 962, 947, 964, 965, - 966, 967, 968, 969, 970, 971, 972, 973, - 974, 975, 976, 977, 964, 965, 966, 967, - 968, 969, 970, 971, 972, 973, 974, 975, - 976, 977, 963, 964, 965, 966, 967, 968, - 969, 978, 971, 972, 973, 974, 975, 976, - 977, 964, 965, 966, 967, 968, 969, 978, - 971, 972, 973, 974, 975, 976, 977, 963, - 840, 979, 842, 843, 844, 845, 846, 847, - 848, 849, 850, 851, 852, 854, 853, 840, - 979, 842, 843, 844, 845, 846, 847, 848, - 849, 850, 851, 852, 854, 853, 839, 981, - 982, 983, 984, 985, 986, 987, 988, 989, - 990, 991, 992, 993, 994, 995, 981, 982, - 983, 984, 985, 986, 987, 988, 989, 990, - 991, 992, 993, 994, 995, 980, 997, 998, - 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, - 1007, 1008, 1009, 1010, 1011, 997, 998, 999, - 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, - 1008, 1009, 1010, 1011, 996, 997, 998, 999, - 1000, 1001, 1002, 1004, 1005, 1006, 1007, 1008, - 1009, 1010, 1011, 997, 998, 999, 1000, 1001, - 1002, 1004, 1005, 1006, 1007, 1008, 1009, 1010, - 1011, 996, 1013, 1014, 1015, 1016, 1017, 1018, - 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, - 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, - 1021, 1022, 1023, 1024, 1025, 1026, 1012, 1028, - 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, - 1037, 1038, 1039, 1040, 1041, 1042, 1028, 1029, - 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, - 1038, 1039, 1040, 1041, 1042, 1027, 1028, 1029, - 1030, 1031, 1032, 1033, 1035, 1036, 1037, 1038, - 1039, 1040, 1041, 1042, 1028, 1029, 1030, 1031, - 1032, 1033, 1035, 1036, 1037, 1038, 1039, 1040, - 1041, 1042, 1027, 1044, 1045, 1046, 1047, 1048, - 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, - 1057, 1044, 1045, 1046, 1047, 1048, 1049, 1050, - 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1043, - 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, - 1067, 1068, 1069, 1070, 1071, 1072, 1059, 1060, - 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, - 1069, 1070, 1071, 1072, 1058, 1074, 1075, 1076, - 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, - 1085, 1086, 1087, 1074, 1075, 1076, 1077, 1078, - 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, - 1087, 1073, 1089, 1090, 1091, 1092, 1093, 1094, - 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, - 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, - 1097, 1098, 1099, 1100, 1101, 1102, 1088, 1089, - 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, - 1098, 1099, 1100, 1103, 1102, 1089, 1090, 1091, - 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, - 1100, 1103, 1102, 1088, 1105, 1106, 1107, 1108, - 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, - 1117, 1118, 1119, 1105, 1106, 1107, 1108, 1109, - 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, - 1118, 1119, 1104, 1105, 1106, 1107, 1108, 1109, - 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, - 1119, 1105, 1106, 1107, 1108, 1109, 1110, 1111, - 1112, 1113, 1114, 1115, 1116, 1117, 1119, 1104, - 981, 982, 983, 1120, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 995, 981, 982, - 983, 1120, 985, 986, 987, 988, 989, 990, - 991, 992, 993, 995, 980, 840, 979, 842, + 818, 819, 820, 821, 111, 807, 823, 824, + 825, 826, 827, 828, 829, 830, 831, 832, + 833, 834, 835, 836, 823, 824, 825, 826, + 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 822, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, - 851, 852, 853, 840, 979, 842, 843, 844, - 845, 846, 847, 848, 849, 850, 851, 852, - 853, 839, 1121, 888, 889, 1122, 891, 892, - 893, 894, 1123, 896, 897, 898, 899, 900, - 1121, 888, 889, 1122, 891, 892, 893, 894, - 1123, 896, 897, 898, 899, 900, 886, 1125, - 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, - 1134, 1135, 1136, 1137, 1138, 1125, 1126, 1127, - 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, - 1136, 1137, 1138, 1124, 1125, 1126, 1127, 1128, - 1129, 1130, 1139, 1132, 1133, 1134, 1135, 1136, - 1137, 1138, 1125, 1126, 1127, 1128, 1129, 1130, - 1139, 1132, 1133, 1134, 1135, 1136, 1137, 1138, - 1124, 871, 872, 873, 874, 875, 876, 878, - 879, 880, 881, 882, 883, 884, 885, 871, - 872, 873, 874, 875, 876, 878, 879, 880, - 881, 882, 883, 884, 885, 870, 1141, 1142, + 851, 852, 853, 838, 839, 840, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, + 851, 852, 853, 837, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, + 867, 868, 869, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 865, 866, 867, + 868, 869, 854, 871, 872, 873, 874, 875, + 876, 877, 878, 879, 880, 881, 882, 883, + 884, 871, 872, 873, 874, 875, 876, 877, + 878, 879, 880, 881, 882, 883, 884, 870, + 886, 887, 888, 889, 890, 891, 892, 893, + 894, 895, 896, 897, 898, 899, 900, 886, + 887, 888, 889, 890, 891, 892, 893, 894, + 895, 896, 897, 898, 899, 900, 885, 902, + 903, 904, 905, 906, 907, 908, 909, 910, + 911, 912, 913, 914, 28, 915, 902, 903, + 904, 905, 906, 907, 908, 909, 910, 911, + 912, 913, 914, 28, 915, 901, 917, 918, + 919, 920, 921, 922, 923, 924, 925, 926, + 927, 928, 929, 930, 917, 918, 919, 920, + 921, 922, 923, 924, 925, 926, 927, 928, + 929, 930, 916, 932, 933, 934, 935, 936, + 937, 938, 939, 940, 941, 942, 943, 944, + 945, 932, 933, 934, 935, 936, 937, 938, + 939, 940, 941, 942, 943, 944, 945, 931, + 947, 948, 949, 950, 951, 952, 953, 954, + 955, 956, 957, 958, 959, 960, 947, 948, + 949, 950, 951, 952, 953, 954, 955, 956, + 957, 958, 959, 960, 946, 947, 948, 949, + 961, 951, 952, 953, 954, 955, 956, 957, + 958, 959, 960, 947, 948, 949, 961, 951, + 952, 953, 954, 955, 956, 957, 958, 959, + 960, 946, 963, 964, 965, 966, 967, 968, + 969, 970, 971, 972, 973, 974, 975, 976, + 977, 963, 964, 965, 966, 967, 968, 969, + 970, 971, 972, 973, 974, 975, 976, 977, + 962, 963, 964, 965, 966, 967, 968, 970, + 971, 972, 973, 974, 975, 976, 977, 963, + 964, 965, 966, 967, 968, 970, 971, 972, + 973, 974, 975, 976, 977, 962, 979, 980, + 981, 982, 983, 984, 985, 986, 987, 988, + 989, 990, 991, 992, 979, 980, 981, 982, + 983, 984, 985, 986, 987, 988, 989, 990, + 991, 992, 978, 979, 980, 981, 982, 983, + 984, 993, 986, 987, 988, 989, 990, 991, + 992, 979, 980, 981, 982, 983, 984, 993, + 986, 987, 988, 989, 990, 991, 992, 978, + 855, 994, 857, 858, 859, 860, 861, 862, + 863, 864, 865, 866, 867, 869, 868, 855, + 994, 857, 858, 859, 860, 861, 862, 863, + 864, 865, 866, 867, 869, 868, 854, 996, + 997, 998, 999, 1000, 1001, 1002, 1003, 1004, + 1005, 1006, 1007, 1008, 1009, 1010, 996, 997, + 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, + 1006, 1007, 1008, 1009, 1010, 995, 1012, 1013, + 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, + 1022, 1023, 1024, 1025, 1026, 1012, 1013, 1014, + 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, + 1023, 1024, 1025, 1026, 1011, 1012, 1013, 1014, + 1015, 1016, 1017, 1019, 1020, 1021, 1022, 1023, + 1024, 1025, 1026, 1012, 1013, 1014, 1015, 1016, + 1017, 1019, 1020, 1021, 1022, 1023, 1024, 1025, + 1026, 1011, 1028, 1029, 1030, 1031, 1032, 1033, + 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, + 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, + 1036, 1037, 1038, 1039, 1040, 1041, 1027, 1043, + 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, + 1052, 1053, 1054, 1055, 1056, 1057, 1043, 1044, + 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1056, 1057, 1042, 1043, 1044, + 1045, 1046, 1047, 1048, 1050, 1051, 1052, 1053, + 1054, 1055, 1056, 1057, 1043, 1044, 1045, 1046, + 1047, 1048, 1050, 1051, 1052, 1053, 1054, 1055, + 1056, 1057, 1042, 1059, 1060, 1061, 1062, 1063, + 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, + 1072, 1059, 1060, 1061, 1062, 1063, 1064, 1065, + 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1058, + 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, + 1082, 1083, 1084, 1085, 1086, 1087, 1074, 1075, + 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, + 1084, 1085, 1086, 1087, 1073, 1089, 1090, 1091, + 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, + 1100, 1101, 1102, 1089, 1090, 1091, 1092, 1093, + 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, + 1102, 1088, 1104, 1105, 1106, 1107, 1108, 1109, + 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, + 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, + 1112, 1113, 1114, 1115, 1116, 1117, 1103, 1104, + 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, + 1113, 1114, 1115, 1118, 1117, 1104, 1105, 1106, + 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, + 1115, 1118, 1117, 1103, 1120, 1121, 1122, 1123, + 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, + 1132, 1133, 1134, 1120, 1121, 1122, 1123, 1124, + 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, + 1133, 1134, 1119, 1120, 1121, 1122, 1123, 1124, + 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, + 1134, 1120, 1121, 1122, 1123, 1124, 1125, 1126, + 1127, 1128, 1129, 1130, 1131, 1132, 1134, 1119, + 996, 997, 998, 1135, 1000, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1010, 996, 997, + 998, 1135, 1000, 1001, 1002, 1003, 1004, 1005, + 1006, 1007, 1008, 1010, 995, 855, 994, 857, + 858, 859, 860, 861, 862, 863, 864, 865, + 866, 867, 868, 855, 994, 857, 858, 859, + 860, 861, 862, 863, 864, 865, 866, 867, + 868, 854, 1136, 903, 904, 1137, 906, 907, + 908, 909, 1138, 911, 912, 913, 914, 915, + 1136, 903, 904, 1137, 906, 907, 908, 909, + 1138, 911, 912, 913, 914, 915, 901, 1140, + 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, + 1149, 1150, 1151, 1152, 1153, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, - 1151, 1152, 1153, 1154, 1141, 1142, 1143, 1144, - 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, - 1153, 1154, 1140, 823, 824, 825, 826, 827, - 828, 829, 830, 831, 832, 833, 834, 835, - 838, 823, 824, 825, 826, 827, 828, 829, - 830, 831, 832, 833, 834, 835, 838, 822, - 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, - 1164, 1165, 1166, 1167, 1168, 1169, 1156, 1157, + 1151, 1152, 1153, 1139, 1140, 1141, 1142, 1143, + 1144, 1145, 1154, 1147, 1148, 1149, 1150, 1151, + 1152, 1153, 1140, 1141, 1142, 1143, 1144, 1145, + 1154, 1147, 1148, 1149, 1150, 1151, 1152, 1153, + 1139, 886, 887, 888, 889, 890, 891, 893, + 894, 895, 896, 897, 898, 899, 900, 886, + 887, 888, 889, 890, 891, 893, 894, 895, + 896, 897, 898, 899, 900, 885, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, - 1166, 1167, 1168, 1169, 1155, 793, 794, 795, - 796, 797, 798, 799, 800, 801, 802, 803, - 804, 805, 1170, 793, 794, 795, 796, 797, - 798, 799, 800, 801, 802, 803, 804, 805, - 1170, 792, 1172, 1173, 1174, 1175, 1176, 1177, - 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, - 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, - 1180, 1181, 1182, 1183, 1184, 1185, 1171, 1188, - 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, - 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, - 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, - 1199, 1200, 1201, 1202, 1203, 1204, 1188, 1206, - 1207, 1191, 1192, 1193, 1194, 1195, 1196, 1197, - 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1191, - 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, - 1200, 1201, 1202, 1203, 1204, 1187, 1205, 1186, - 1210, 1211, 1210, 1213, 1209, 1212, 1208, 1215, - 1216, 1215, 1218, 1217, 1214, 1221, 1222, 1223, - 1224, 1225, 1223, 1224, 1225, 1221, 1220, 1228, - 1228, 1227, 1230, 1230, 1229, 1221, 1222, 1231, - 1232, 1233, 1231, 1232, 1233, 1221, 1220, 1235, - 1236, 1237, 1238, 1239, 1236, 1237, 1238, 1239, - 1235, 1227, 1228, 1240, 1240, 1228, 1227, 1228, - 1241, 1241, 1228, 1227, 1228, 1242, 1242, 1228, - 1227, 1228, 1243, 1243, 1228, 1227, 1235, 1236, - 1238, 1239, 1236, 1238, 1239, 1235, 1227, 1235, - 1236, 1244, 1238, 1239, 1236, 1244, 1238, 1239, - 1235, 1227, 1228, 1245, 1245, 1228, 1227, 1228, - 1246, 1246, 1228, 1227, 1228, 1247, 1247, 1228, - 1227, 1228, 1248, 1248, 1228, 1227, 1228, 1243, - 1243, 1228, 1227, 1228, 1249, 1250, 1251, 1249, - 1250, 1251, 1228, 1227, 1228, 1252, 1252, 1228, - 1227, 1228, 1253, 1253, 1228, 1227, 1228, 1254, - 1254, 1228, 1227, 1228, 1255, 1255, 1228, 1227, - 1228, 1250, 1250, 1228, 1227, 1257, 1258, 1259, - 1260, 1258, 1259, 1260, 1257, 1227, 1262, 1263, - 1264, 1265, 1263, 1264, 1265, 1262, 1227, 1228, - 1266, 1266, 1228, 1227, 1228, 1267, 1267, 1228, - 1227, 1262, 1268, 1264, 1265, 1268, 1264, 1265, - 1262, 1227, 1270, 1271, 1272, 1273, 1274, 1271, - 1272, 1273, 1274, 1270, 1269, 1270, 1271, 1273, - 1274, 1271, 1273, 1274, 1270, 1269, 1270, 1271, - 1275, 1273, 1274, 1271, 1275, 1273, 1274, 1270, - 1269, 1277, 1278, 1279, 1280, 1278, 1279, 1280, - 1277, 1276, 1282, 1283, 1284, 1285, 1283, 1284, - 1285, 1282, 1281, 1282, 1286, 1284, 1285, 1286, - 1284, 1285, 1282, 1281, 1288, 1290, 1289, 1287, - 1291, 1292, 1289, 1287, 1221, 1294, 1223, 1224, - 1225, 1223, 1224, 1225, 1296, 1297, 1298, 1299, - 1300, 1298, 1299, 1300, 1220, 1221, 1220, 1295, - 1296, 1295, 1293, 1228, 1302, 1304, 1305, 1227, - 1228, 1227, 1303, 1304, 1303, 1301, 1228, 1306, - 1228, 1227, 1230, 1288, 1307, 1290, 1230, 1289, - 1307, 1289, 1287, 1228, 1308, 1304, 1309, 1227, - 1228, 1227, 1303, 1304, 1303, 1301, 1221, 1294, - 1231, 1232, 1233, 1231, 1232, 1233, 1296, 1297, - 1310, 1311, 1312, 1310, 1311, 1312, 1220, 1221, - 1220, 1295, 1296, 1295, 1293, 1235, 1302, 1236, - 1237, 1238, 1239, 1236, 1237, 1238, 1239, 1314, - 1305, 1315, 1316, 1317, 1318, 1315, 1316, 1317, - 1318, 1227, 1235, 1227, 1303, 1314, 1303, 1313, - 1228, 1302, 1240, 1240, 1304, 1305, 1319, 1319, - 1227, 1228, 1227, 1303, 1304, 1303, 1301, 1228, - 1302, 1241, 1241, 1304, 1305, 1320, 1320, 1227, - 1228, 1227, 1303, 1304, 1303, 1301, 1228, 1302, - 1242, 1242, 1304, 1305, 1321, 1321, 1227, 1228, - 1227, 1303, 1304, 1303, 1301, 1228, 1302, 1243, - 1243, 1304, 1305, 1322, 1322, 1227, 1228, 1227, - 1303, 1304, 1303, 1301, 1235, 1302, 1236, 1238, - 1239, 1236, 1238, 1239, 1314, 1305, 1315, 1317, - 1318, 1315, 1317, 1318, 1227, 1235, 1227, 1303, - 1314, 1303, 1313, 1235, 1302, 1236, 1244, 1238, - 1239, 1236, 1244, 1238, 1239, 1314, 1305, 1315, - 1323, 1317, 1318, 1315, 1323, 1317, 1318, 1227, - 1235, 1227, 1303, 1314, 1303, 1313, 1228, 1302, - 1245, 1245, 1304, 1305, 1324, 1324, 1227, 1228, - 1227, 1303, 1304, 1303, 1301, 1228, 1302, 1246, - 1246, 1304, 1305, 1325, 1325, 1227, 1228, 1227, - 1303, 1304, 1303, 1301, 1228, 1302, 1247, 1247, - 1304, 1305, 1326, 1326, 1227, 1228, 1227, 1303, - 1304, 1303, 1301, 1228, 1302, 1248, 1248, 1304, - 1305, 1327, 1327, 1227, 1228, 1227, 1303, 1304, - 1303, 1301, 1228, 1302, 1243, 1243, 1304, 1305, - 1322, 1322, 1227, 1228, 1227, 1303, 1304, 1303, - 1301, 1228, 1302, 1249, 1250, 1251, 1249, 1250, - 1251, 1304, 1305, 1328, 1329, 1330, 1328, 1329, - 1330, 1227, 1228, 1227, 1303, 1304, 1303, 1301, - 1228, 1302, 1252, 1252, 1304, 1305, 1331, 1331, - 1227, 1228, 1227, 1303, 1304, 1303, 1301, 1228, - 1302, 1253, 1253, 1304, 1305, 1332, 1332, 1227, - 1228, 1227, 1303, 1304, 1303, 1301, 1228, 1302, - 1254, 1254, 1304, 1305, 1333, 1333, 1227, 1228, - 1227, 1303, 1304, 1303, 1301, 1228, 1302, 1255, - 1255, 1304, 1305, 1334, 1334, 1227, 1228, 1227, - 1303, 1304, 1303, 1301, 1228, 1302, 1250, 1250, - 1304, 1305, 1329, 1329, 1227, 1228, 1227, 1303, - 1304, 1303, 1301, 1257, 1302, 1258, 1259, 1260, - 1258, 1259, 1260, 1336, 1305, 1337, 1338, 1339, - 1337, 1338, 1339, 1227, 1257, 1227, 1303, 1336, - 1303, 1335, 1262, 1302, 1263, 1264, 1265, 1263, - 1264, 1265, 1341, 1305, 1342, 1343, 1344, 1342, - 1343, 1344, 1227, 1262, 1227, 1303, 1341, 1303, - 1340, 1228, 1302, 1266, 1266, 1304, 1305, 1345, - 1345, 1227, 1228, 1227, 1303, 1304, 1303, 1301, - 1228, 1302, 1267, 1267, 1304, 1305, 1346, 1346, - 1227, 1228, 1227, 1303, 1304, 1303, 1301, 1262, - 1302, 1268, 1264, 1265, 1268, 1264, 1265, 1341, - 1305, 1347, 1343, 1344, 1347, 1343, 1344, 1227, - 1262, 1227, 1303, 1341, 1303, 1340, 1270, 1288, - 1271, 1272, 1273, 1274, 1271, 1272, 1273, 1274, - 1349, 1290, 1350, 1351, 1352, 1353, 1350, 1351, - 1352, 1353, 1270, 1289, 1349, 1289, 1348, 1288, - 115, 115, 1290, 1354, 1354, 1289, 1287, 1288, - 116, 116, 1290, 1355, 1355, 1289, 1287, 1288, - 117, 117, 1290, 1356, 1356, 1289, 1287, 1288, - 118, 118, 1290, 1357, 1357, 1289, 1287, 1270, - 1288, 1271, 1273, 1274, 1271, 1273, 1274, 1349, - 1290, 1350, 1352, 1353, 1350, 1352, 1353, 1270, - 1289, 1349, 1289, 1348, 1270, 1288, 1271, 1275, - 1273, 1274, 1271, 1275, 1273, 1274, 1349, 1290, - 1350, 1358, 1352, 1353, 1350, 1358, 1352, 1353, - 1270, 1289, 1349, 1289, 1348, 1288, 119, 119, - 1290, 1359, 1359, 1289, 1287, 1288, 120, 120, - 1290, 1360, 1360, 1289, 1287, 1288, 121, 121, - 1290, 1361, 1361, 1289, 1287, 1288, 122, 122, - 1290, 1362, 1362, 1289, 1287, 1288, 118, 118, - 1290, 1357, 1357, 1289, 1287, 1288, 123, 124, - 125, 123, 124, 125, 1290, 1363, 1364, 1365, - 1363, 1364, 1365, 1289, 1287, 1288, 126, 126, - 1290, 1366, 1366, 1289, 1287, 1288, 127, 127, - 1290, 1367, 1367, 1289, 1287, 1288, 128, 128, - 1290, 1368, 1368, 1289, 1287, 1288, 129, 129, - 1290, 1369, 1369, 1289, 1287, 1288, 124, 124, - 1290, 1364, 1364, 1289, 1287, 1277, 1288, 1278, - 1279, 1280, 1278, 1279, 1280, 1371, 1290, 1372, - 1373, 1374, 1372, 1373, 1374, 1277, 1289, 1371, - 1289, 1370, 1282, 1288, 1283, 1284, 1285, 1283, - 1284, 1285, 1376, 1290, 1377, 1378, 1379, 1377, - 1378, 1379, 1282, 1289, 1376, 1289, 1375, 1288, - 130, 130, 1290, 1380, 1380, 1289, 1287, 1288, - 131, 131, 1290, 1381, 1381, 1289, 1287, 1282, - 1288, 1286, 1284, 1285, 1286, 1284, 1285, 1376, - 1290, 1382, 1378, 1379, 1382, 1378, 1379, 1282, - 1289, 1376, 1289, 1375, 1188, 1189, 1190, 1383, - 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, - 1392, 1393, 1394, 1395, 1396, 1383, 1384, 1385, - 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, - 1394, 1395, 1396, 1188, 1206, 1207, 1212, 1205, - 1212, 1205, 1212, 1212, 1205, 1212, 1205, 1212, - 1187, 1205, 1212, 1205, 1212, 1205, 1212, 1205, - 1212, 1205, 1186, 1210, 1211, 1397, 1397, 1210, - 1213, 1209, 1212, 1208, 1210, 1211, 1398, 1398, - 1210, 1213, 1209, 1212, 1208, 1400, 1401, 1402, - 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, - 1411, 1412, 1413, 1414, 1415, 1402, 1403, 1404, - 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, - 1413, 1414, 1415, 1400, 1417, 1209, 1416, 1399, - 1210, 1211, 1418, 1418, 1210, 1213, 1209, 1212, - 1208, 1210, 1211, 1419, 1419, 1210, 1213, 1209, - 1212, 1208, 1210, 1211, 1420, 1420, 1210, 1213, - 1209, 1212, 1208, 1422, 1423, 1424, 1425, 1426, - 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, - 1435, 1436, 1437, 1424, 1425, 1426, 1427, 1428, - 1429, 1430, 1431, 1432, 1433, 1434, 1435, 1436, - 1437, 1422, 1439, 1209, 1438, 1421, 1210, 1211, - 1440, 1441, 1440, 1441, 1210, 1213, 1209, 1212, - 1208, 1210, 1211, 1442, 1442, 1210, 1213, 1209, - 1212, 1208, 1210, 1211, 1443, 1443, 1210, 1213, - 1209, 1212, 1208, 1210, 1211, 1444, 1444, 1210, - 1213, 1209, 1212, 1208, 1210, 1445, 1446, 1211, - 1210, 1213, 1209, 1212, 1208, 1448, 1449, 1450, - 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, - 1459, 1460, 1461, 1462, 1463, 1450, 1451, 1452, - 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, - 1461, 1462, 1463, 1448, 1465, 1209, 1464, 1447, - 1210, 1211, 1466, 1467, 1466, 1467, 1210, 1213, - 1209, 1212, 1208, 1210, 1211, 1468, 1468, 1210, - 1213, 1209, 1212, 1208, 1210, 1211, 1469, 1469, - 1210, 1213, 1209, 1212, 1208, 1210, 1211, 1470, - 1470, 1210, 1213, 1209, 1212, 1208, 1472, 1473, - 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, - 1482, 1483, 1484, 1485, 1486, 1487, 1474, 1475, - 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, - 1484, 1485, 1486, 1487, 1472, 1489, 1209, 1488, - 1471, 1210, 1211, 1490, 1490, 1210, 1213, 1209, - 1212, 1208, 1210, 1211, 1491, 1491, 1210, 1213, - 1209, 1212, 1208, 1210, 1211, 1492, 1492, 1210, - 1213, 1209, 1212, 1208, 1494, 1495, 1496, 1497, - 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, - 1506, 1507, 1508, 1509, 1496, 1497, 1498, 1499, - 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, - 1508, 1509, 1494, 1511, 1209, 1510, 1493, 1210, - 1211, 1512, 1512, 1210, 1213, 1209, 1212, 1208, - 1210, 1211, 1513, 1513, 1210, 1213, 1209, 1212, - 1208, 1210, 1211, 1514, 1514, 1210, 1213, 1209, - 1212, 1208, 1210, 1211, 1515, 1515, 1210, 1213, - 1209, 1212, 1208, 1210, 1211, 1516, 1516, 1210, - 1213, 1209, 1212, 1208, 1518, 1519, 1520, 1521, - 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, - 1530, 1531, 1532, 1533, 1520, 1521, 1522, 1523, - 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, - 1532, 1533, 1518, 1535, 1209, 1534, 1517, 1210, - 1211, 1536, 1537, 1536, 1537, 1210, 1213, 1209, - 1212, 1208, 1210, 1211, 1538, 1538, 1210, 1213, - 1209, 1212, 1208, 1210, 1211, 1539, 1540, 1539, - 1540, 1210, 1213, 1209, 1212, 1208, 1542, 1543, - 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, - 1552, 1553, 1554, 1555, 1556, 1557, 1544, 1545, - 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, - 1554, 1555, 1556, 1557, 1542, 1559, 1209, 1558, - 1541, 1210, 1211, 1560, 1560, 1210, 1213, 1209, - 1212, 1208, 1210, 1211, 1561, 1561, 1210, 1213, - 1209, 1212, 1208, 1210, 1211, 1562, 1562, 1210, - 1213, 1209, 1212, 1208, 1210, 1211, 1563, 1563, - 1210, 1213, 1209, 1212, 1208, 1210, 1564, 1211, - 1210, 1213, 1209, 1212, 1208, 1210, 1211, 1565, - 1566, 1565, 1566, 1210, 1213, 1209, 1212, 1208, - 1210, 1211, 1567, 1567, 1210, 1213, 1209, 1212, - 1208, 1569, 1570, 1571, 1572, 1573, 1574, 1575, - 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, - 1584, 1571, 1572, 1573, 1574, 1575, 1576, 1577, - 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1569, - 1586, 1209, 1585, 1568, 1210, 1211, 1587, 1587, - 1210, 1213, 1209, 1212, 1208, 1210, 1211, 1588, - 1588, 1210, 1213, 1209, 1212, 1208, 1210, 1211, - 1589, 1589, 1210, 1213, 1209, 1212, 1208, 1591, - 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, - 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1593, - 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, - 1602, 1603, 1604, 1605, 1606, 1591, 1608, 1209, - 1607, 1590, 1210, 1211, 1609, 1610, 1611, 1609, - 1610, 1611, 1210, 1213, 1209, 1212, 1208, 1210, - 1211, 1612, 1613, 1614, 1612, 1613, 1614, 1210, - 1213, 1209, 1212, 1208, 1210, 1211, 1615, 1615, - 1210, 1213, 1209, 1212, 1208, 1210, 1211, 1616, - 1616, 1210, 1213, 1209, 1212, 1208, 1210, 1211, - 1617, 1617, 1210, 1213, 1209, 1212, 1208, 1210, - 1211, 1611, 1611, 1210, 1213, 1209, 1212, 1208, - 1210, 1211, 1618, 1618, 1210, 1213, 1209, 1212, - 1208, 1620, 1621, 1622, 1623, 1624, 1625, 1626, - 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, - 1635, 1622, 1623, 1624, 1625, 1626, 1627, 1628, - 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1620, - 1637, 1209, 1636, 1619, 1210, 1211, 1638, 1638, - 1210, 1213, 1209, 1212, 1208, 1210, 1211, 1639, - 1639, 1210, 1213, 1209, 1212, 1208, 1210, 1211, - 1640, 1640, 1210, 1213, 1209, 1212, 1208, 1210, - 1211, 1641, 1641, 1210, 1213, 1209, 1212, 1208, - 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, - 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, - 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, - 1653, 1654, 1655, 1656, 1657, 1658, 1643, 1660, - 1209, 1659, 1642, 1210, 1211, 1661, 1662, 1663, - 1661, 1662, 1663, 1210, 1213, 1209, 1212, 1208, - 1210, 1211, 1664, 1664, 1210, 1213, 1209, 1212, - 1208, 1666, 1667, 1668, 1669, 1670, 1671, 1672, - 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, - 1681, 1668, 1669, 1670, 1671, 1672, 1673, 1674, - 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1666, - 1683, 1209, 1682, 1665, 1210, 1211, 1684, 1684, - 1210, 1213, 1209, 1212, 1208, 1686, 1687, 1688, - 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, - 1697, 1698, 1699, 1700, 1701, 1688, 1689, 1690, - 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, - 1699, 1700, 1701, 1686, 1703, 1209, 1702, 1685, - 1210, 1211, 1704, 1704, 1210, 1213, 1209, 1212, - 1208, 1706, 1707, 1708, 1709, 1710, 1711, 1712, - 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, - 1721, 1708, 1709, 1710, 1711, 1712, 1713, 1714, - 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1706, - 1723, 1209, 1722, 1705, 1210, 1211, 1724, 1725, - 1726, 1724, 1725, 1726, 1210, 1213, 1209, 1212, - 1208, 1728, 1729, 1730, 1731, 1732, 1733, 1734, - 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, - 1743, 1730, 1731, 1732, 1733, 1734, 1735, 1736, - 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1728, - 1745, 1209, 1744, 1727, 1210, 1211, 1746, 1746, - 1210, 1213, 1209, 1212, 1208, 1210, 1211, 1747, - 1747, 1210, 1213, 1209, 1212, 1208, 1210, 1211, - 1748, 1748, 1210, 1213, 1209, 1212, 1208, 1210, - 1211, 1749, 1749, 1210, 1213, 1209, 1212, 1208, - 1210, 1750, 1211, 1210, 1213, 1209, 1212, 1208, - 1210, 1211, 1751, 1751, 1210, 1213, 1209, 1212, - 1208, 1210, 1211, 1752, 1752, 1210, 1213, 1209, - 1212, 1208, 1754, 1755, 1756, 1757, 1758, 1759, - 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, - 1768, 1769, 1756, 1757, 1758, 1759, 1760, 1761, - 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, - 1754, 1771, 1209, 1770, 1753, 1210, 1211, 1772, - 1772, 1210, 1213, 1209, 1212, 1208, 1210, 1211, - 1773, 1773, 1210, 1213, 1209, 1212, 1208, 1210, - 1211, 1774, 1774, 1210, 1213, 1209, 1212, 1208, - 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, - 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, - 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, - 1786, 1787, 1788, 1789, 1790, 1791, 1776, 1793, - 1209, 1792, 1775, 1210, 1211, 1794, 1794, 1210, - 1213, 1209, 1212, 1208, 1210, 1211, 1795, 1795, - 1210, 1213, 1209, 1212, 1208, 1797, 1798, 1799, - 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, - 1808, 1809, 1810, 1811, 1812, 1799, 1800, 1801, - 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, - 1810, 1811, 1812, 1797, 1814, 1209, 1813, 1796, - 1210, 1211, 1815, 1815, 1210, 1213, 1209, 1212, - 1208, 1817, 1818, 1819, 1820, 1821, 1822, 1823, - 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, - 1832, 1819, 1820, 1821, 1822, 1823, 1824, 1825, - 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1817, - 1834, 1209, 1833, 1816, 1836, 1837, 1838, 1839, - 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, - 1848, 1849, 1850, 1851, 1838, 1839, 1840, 1841, - 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849, - 1850, 1851, 1836, 1853, 1212, 1212, 1209, 1852, - 1835, 1210, 1211, 1854, 1854, 1210, 1213, 1209, - 1212, 1208, 1210, 1211, 1855, 1855, 1210, 1213, - 1209, 1212, 1208, 1210, 1211, 1856, 1856, 1210, - 1213, 1209, 1212, 1208, 1836, 1837, 1838, 1839, - 1840, 1841, 1842, 1843, 1844, 1857, 1846, 1847, - 1848, 1849, 1850, 1851, 1838, 1839, 1840, 1841, - 1842, 1843, 1844, 1857, 1846, 1847, 1848, 1849, - 1850, 1851, 1836, 1853, 1209, 1852, 1835, 1210, - 1211, 1858, 1858, 1210, 1213, 1209, 1212, 1208, - 1210, 1211, 1859, 1859, 1210, 1213, 1209, 1212, - 1208, 1210, 1211, 1860, 1860, 1210, 1213, 1209, - 1212, 1208, 1210, 1861, 1211, 1210, 1213, 1209, - 1212, 1208, 1210, 1211, 1862, 1863, 1864, 1862, - 1863, 1864, 1210, 1213, 1209, 1212, 1208, 1210, - 1211, 1865, 1865, 1210, 1213, 1209, 1212, 1208, - 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, - 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, - 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, - 1877, 1878, 1879, 1880, 1881, 1882, 1867, 1884, - 1209, 1883, 1866, 1210, 1211, 1885, 1885, 1210, - 1213, 1209, 1212, 1208, 1210, 1211, 1886, 1886, - 1210, 1213, 1209, 1212, 1208, 1210, 1211, 1887, - 1887, 1210, 1213, 1209, 1212, 1208, 1889, 1890, - 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, - 1899, 1900, 1901, 1902, 1903, 1904, 1891, 1892, - 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, - 1901, 1902, 1903, 1904, 1889, 1906, 1209, 1905, - 1888, 1210, 1211, 1907, 1907, 1210, 1213, 1209, - 1212, 1208, 1210, 1211, 1908, 1908, 1210, 1213, - 1209, 1212, 1208, 1210, 1211, 1909, 1909, 1210, - 1213, 1209, 1212, 1208, 1210, 1211, 1910, 1910, - 1210, 1213, 1209, 1212, 1208, 1912, 1913, 1914, - 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, - 1923, 1924, 1925, 1926, 1927, 1914, 1915, 1916, - 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, - 1925, 1926, 1927, 1912, 1929, 1209, 1928, 1911, - 1210, 1211, 1930, 1930, 1210, 1213, 1209, 1212, - 1208, 1210, 1211, 1931, 1931, 1210, 1213, 1209, - 1212, 1208, 1210, 1211, 1932, 1932, 1210, 1213, - 1209, 1212, 1208, 1934, 1935, 1936, 1937, 1938, - 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, - 1947, 1948, 1949, 1936, 1937, 1938, 1939, 1940, - 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, - 1949, 1934, 1951, 1209, 1950, 1933, 1953, 1954, - 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, - 1963, 1964, 1965, 1966, 1967, 1968, 1955, 1956, - 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, - 1965, 1966, 1967, 1968, 1953, 1970, 1209, 1969, - 1952, 1210, 1211, 1971, 1971, 1210, 1213, 1209, - 1212, 1208, 1210, 1972, 1211, 1210, 1213, 1209, - 1212, 1208, 1974, 1975, 1976, 1977, 1978, 1979, - 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, - 1988, 1989, 1976, 1977, 1978, 1979, 1980, 1981, - 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, - 1974, 1991, 1209, 1990, 1973, 1210, 1211, 1992, - 1992, 1210, 1213, 1209, 1212, 1208, 1210, 1211, - 1993, 1993, 1210, 1213, 1209, 1212, 1208, 1210, - 1211, 1994, 1994, 1210, 1213, 1209, 1212, 1208, - 1210, 1211, 1995, 1995, 1210, 1213, 1209, 1212, - 1208, 1210, 1211, 1704, 1704, 1210, 1213, 1209, - 1212, 1208, 1997, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, - 2011, 2012, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, - 1997, 2014, 1209, 2013, 1996, 1210, 1211, 2015, - 2016, 2015, 2016, 1210, 1213, 1209, 1212, 1208, - 1210, 1211, 2017, 2017, 1210, 1213, 1209, 1212, - 1208, 1210, 1211, 2018, 2018, 1210, 1213, 1209, - 1212, 1208, 2020, 2021, 2022, 2023, 2024, 2025, - 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, - 2034, 2035, 2022, 2023, 2024, 2025, 2026, 2027, - 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, - 2020, 2037, 1209, 2036, 2019, 1210, 2038, 1211, - 1210, 1213, 1209, 1212, 1208, 1210, 1211, 2039, - 2039, 1210, 1213, 1209, 1212, 1208, 1210, 1211, - 2040, 2040, 1210, 1213, 1209, 1212, 1208, 1210, - 1211, 2041, 2041, 1210, 1213, 1209, 1212, 1208, - 1210, 1211, 2042, 2042, 1210, 1213, 1209, 1212, - 1208, 1210, 1211, 2043, 2043, 1210, 1213, 1209, - 1212, 1208, 2045, 2046, 2047, 2048, 2049, 2050, - 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, - 2059, 2060, 2047, 2048, 2049, 2050, 2051, 2052, - 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, - 2045, 2062, 1209, 2061, 2044, 1188, 1189, 1190, - 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, - 1199, 1200, 1201, 1202, 1203, 1204, 1191, 1192, + 1166, 1167, 1168, 1169, 1156, 1157, 1158, 1159, + 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, + 1168, 1169, 1155, 838, 839, 840, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, + 853, 838, 839, 840, 841, 842, 843, 844, + 845, 846, 847, 848, 849, 850, 853, 837, + 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, + 1179, 1180, 1181, 1182, 1183, 1184, 1171, 1172, + 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, + 1181, 1182, 1183, 1184, 1170, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, + 819, 820, 1185, 808, 809, 810, 811, 812, + 813, 814, 815, 816, 817, 818, 819, 820, + 1185, 807, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, - 1201, 1202, 1203, 1204, 1188, 1206, 1207, 2063, - 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, - 2072, 2073, 2074, 2075, 2076, 2063, 2064, 2065, - 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, - 2074, 2075, 2076, 1187, 1205, 1186, 2078, 2079, + 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, + 1195, 1196, 1197, 1198, 1199, 1200, 1186, 1203, + 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, + 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, + 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, + 1214, 1215, 1216, 1217, 1218, 1219, 1203, 1221, + 1222, 1206, 1207, 1208, 1209, 1210, 1211, 1212, + 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1206, + 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, + 1215, 1216, 1217, 1218, 1219, 1202, 1220, 1201, + 1225, 1226, 1225, 1228, 1224, 1227, 1223, 1230, + 1231, 1230, 1233, 1232, 1229, 1236, 1237, 1238, + 1239, 1240, 1238, 1239, 1240, 1236, 1235, 1243, + 1243, 1242, 1245, 1245, 1244, 1236, 1237, 1246, + 1247, 1248, 1246, 1247, 1248, 1236, 1235, 1250, + 1251, 1252, 1253, 1254, 1251, 1252, 1253, 1254, + 1250, 1242, 1243, 1255, 1255, 1243, 1242, 1243, + 1256, 1256, 1243, 1242, 1243, 1257, 1257, 1243, + 1242, 1243, 1258, 1258, 1243, 1242, 1250, 1251, + 1253, 1254, 1251, 1253, 1254, 1250, 1242, 1250, + 1251, 1259, 1253, 1254, 1251, 1259, 1253, 1254, + 1250, 1242, 1243, 1260, 1260, 1243, 1242, 1243, + 1261, 1261, 1243, 1242, 1243, 1262, 1262, 1243, + 1242, 1243, 1263, 1263, 1243, 1242, 1243, 1258, + 1258, 1243, 1242, 1243, 1264, 1265, 1266, 1264, + 1265, 1266, 1243, 1242, 1243, 1267, 1267, 1243, + 1242, 1243, 1268, 1268, 1243, 1242, 1243, 1269, + 1269, 1243, 1242, 1243, 1270, 1270, 1243, 1242, + 1243, 1265, 1265, 1243, 1242, 1272, 1273, 1274, + 1275, 1273, 1274, 1275, 1272, 1242, 1277, 1278, + 1279, 1280, 1278, 1279, 1280, 1277, 1242, 1243, + 1281, 1281, 1243, 1242, 1243, 1282, 1282, 1243, + 1242, 1277, 1283, 1279, 1280, 1283, 1279, 1280, + 1277, 1242, 1285, 1286, 1287, 1288, 1289, 1286, + 1287, 1288, 1289, 1285, 1284, 1285, 1286, 1288, + 1289, 1286, 1288, 1289, 1285, 1284, 1285, 1286, + 1290, 1288, 1289, 1286, 1290, 1288, 1289, 1285, + 1284, 1292, 1293, 1294, 1295, 1293, 1294, 1295, + 1292, 1291, 1297, 1298, 1299, 1300, 1298, 1299, + 1300, 1297, 1296, 1297, 1301, 1299, 1300, 1301, + 1299, 1300, 1297, 1296, 1303, 1305, 1304, 1302, + 1306, 1307, 1304, 1302, 1236, 1309, 1238, 1239, + 1240, 1238, 1239, 1240, 1311, 1312, 1313, 1314, + 1315, 1313, 1314, 1315, 1235, 1236, 1235, 1310, + 1311, 1310, 1308, 1243, 1317, 1319, 1320, 1242, + 1243, 1242, 1318, 1319, 1318, 1316, 1243, 1321, + 1243, 1242, 1245, 1303, 1322, 1305, 1245, 1304, + 1322, 1304, 1302, 1243, 1323, 1319, 1324, 1242, + 1243, 1242, 1318, 1319, 1318, 1316, 1236, 1309, + 1246, 1247, 1248, 1246, 1247, 1248, 1311, 1312, + 1325, 1326, 1327, 1325, 1326, 1327, 1235, 1236, + 1235, 1310, 1311, 1310, 1308, 1250, 1317, 1251, + 1252, 1253, 1254, 1251, 1252, 1253, 1254, 1329, + 1320, 1330, 1331, 1332, 1333, 1330, 1331, 1332, + 1333, 1242, 1250, 1242, 1318, 1329, 1318, 1328, + 1243, 1317, 1255, 1255, 1319, 1320, 1334, 1334, + 1242, 1243, 1242, 1318, 1319, 1318, 1316, 1243, + 1317, 1256, 1256, 1319, 1320, 1335, 1335, 1242, + 1243, 1242, 1318, 1319, 1318, 1316, 1243, 1317, + 1257, 1257, 1319, 1320, 1336, 1336, 1242, 1243, + 1242, 1318, 1319, 1318, 1316, 1243, 1317, 1258, + 1258, 1319, 1320, 1337, 1337, 1242, 1243, 1242, + 1318, 1319, 1318, 1316, 1250, 1317, 1251, 1253, + 1254, 1251, 1253, 1254, 1329, 1320, 1330, 1332, + 1333, 1330, 1332, 1333, 1242, 1250, 1242, 1318, + 1329, 1318, 1328, 1250, 1317, 1251, 1259, 1253, + 1254, 1251, 1259, 1253, 1254, 1329, 1320, 1330, + 1338, 1332, 1333, 1330, 1338, 1332, 1333, 1242, + 1250, 1242, 1318, 1329, 1318, 1328, 1243, 1317, + 1260, 1260, 1319, 1320, 1339, 1339, 1242, 1243, + 1242, 1318, 1319, 1318, 1316, 1243, 1317, 1261, + 1261, 1319, 1320, 1340, 1340, 1242, 1243, 1242, + 1318, 1319, 1318, 1316, 1243, 1317, 1262, 1262, + 1319, 1320, 1341, 1341, 1242, 1243, 1242, 1318, + 1319, 1318, 1316, 1243, 1317, 1263, 1263, 1319, + 1320, 1342, 1342, 1242, 1243, 1242, 1318, 1319, + 1318, 1316, 1243, 1317, 1258, 1258, 1319, 1320, + 1337, 1337, 1242, 1243, 1242, 1318, 1319, 1318, + 1316, 1243, 1317, 1264, 1265, 1266, 1264, 1265, + 1266, 1319, 1320, 1343, 1344, 1345, 1343, 1344, + 1345, 1242, 1243, 1242, 1318, 1319, 1318, 1316, + 1243, 1317, 1267, 1267, 1319, 1320, 1346, 1346, + 1242, 1243, 1242, 1318, 1319, 1318, 1316, 1243, + 1317, 1268, 1268, 1319, 1320, 1347, 1347, 1242, + 1243, 1242, 1318, 1319, 1318, 1316, 1243, 1317, + 1269, 1269, 1319, 1320, 1348, 1348, 1242, 1243, + 1242, 1318, 1319, 1318, 1316, 1243, 1317, 1270, + 1270, 1319, 1320, 1349, 1349, 1242, 1243, 1242, + 1318, 1319, 1318, 1316, 1243, 1317, 1265, 1265, + 1319, 1320, 1344, 1344, 1242, 1243, 1242, 1318, + 1319, 1318, 1316, 1272, 1317, 1273, 1274, 1275, + 1273, 1274, 1275, 1351, 1320, 1352, 1353, 1354, + 1352, 1353, 1354, 1242, 1272, 1242, 1318, 1351, + 1318, 1350, 1277, 1317, 1278, 1279, 1280, 1278, + 1279, 1280, 1356, 1320, 1357, 1358, 1359, 1357, + 1358, 1359, 1242, 1277, 1242, 1318, 1356, 1318, + 1355, 1243, 1317, 1281, 1281, 1319, 1320, 1360, + 1360, 1242, 1243, 1242, 1318, 1319, 1318, 1316, + 1243, 1317, 1282, 1282, 1319, 1320, 1361, 1361, + 1242, 1243, 1242, 1318, 1319, 1318, 1316, 1277, + 1317, 1283, 1279, 1280, 1283, 1279, 1280, 1356, + 1320, 1362, 1358, 1359, 1362, 1358, 1359, 1242, + 1277, 1242, 1318, 1356, 1318, 1355, 1285, 1303, + 1286, 1287, 1288, 1289, 1286, 1287, 1288, 1289, + 1364, 1305, 1365, 1366, 1367, 1368, 1365, 1366, + 1367, 1368, 1285, 1304, 1364, 1304, 1363, 1303, + 115, 115, 1305, 1369, 1369, 1304, 1302, 1303, + 116, 116, 1305, 1370, 1370, 1304, 1302, 1303, + 117, 117, 1305, 1371, 1371, 1304, 1302, 1303, + 118, 118, 1305, 1372, 1372, 1304, 1302, 1285, + 1303, 1286, 1288, 1289, 1286, 1288, 1289, 1364, + 1305, 1365, 1367, 1368, 1365, 1367, 1368, 1285, + 1304, 1364, 1304, 1363, 1285, 1303, 1286, 1290, + 1288, 1289, 1286, 1290, 1288, 1289, 1364, 1305, + 1365, 1373, 1367, 1368, 1365, 1373, 1367, 1368, + 1285, 1304, 1364, 1304, 1363, 1303, 119, 119, + 1305, 1374, 1374, 1304, 1302, 1303, 120, 120, + 1305, 1375, 1375, 1304, 1302, 1303, 121, 121, + 1305, 1376, 1376, 1304, 1302, 1303, 122, 122, + 1305, 1377, 1377, 1304, 1302, 1303, 118, 118, + 1305, 1372, 1372, 1304, 1302, 1303, 123, 124, + 125, 123, 124, 125, 1305, 1378, 1379, 1380, + 1378, 1379, 1380, 1304, 1302, 1303, 126, 126, + 1305, 1381, 1381, 1304, 1302, 1303, 127, 127, + 1305, 1382, 1382, 1304, 1302, 1303, 128, 128, + 1305, 1383, 1383, 1304, 1302, 1303, 129, 129, + 1305, 1384, 1384, 1304, 1302, 1303, 124, 124, + 1305, 1379, 1379, 1304, 1302, 1292, 1303, 1293, + 1294, 1295, 1293, 1294, 1295, 1386, 1305, 1387, + 1388, 1389, 1387, 1388, 1389, 1292, 1304, 1386, + 1304, 1385, 1297, 1303, 1298, 1299, 1300, 1298, + 1299, 1300, 1391, 1305, 1392, 1393, 1394, 1392, + 1393, 1394, 1297, 1304, 1391, 1304, 1390, 1303, + 130, 130, 1305, 1395, 1395, 1304, 1302, 1303, + 131, 131, 1305, 1396, 1396, 1304, 1302, 1297, + 1303, 1301, 1299, 1300, 1301, 1299, 1300, 1391, + 1305, 1397, 1393, 1394, 1397, 1393, 1394, 1297, + 1304, 1391, 1304, 1390, 1203, 1204, 1205, 1398, + 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, + 1407, 1408, 1409, 1410, 1411, 1398, 1399, 1400, + 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, + 1409, 1410, 1411, 1203, 1221, 1222, 1227, 1220, + 1227, 1220, 1227, 1227, 1220, 1227, 1220, 1227, + 1202, 1220, 1227, 1220, 1227, 1220, 1227, 1220, + 1227, 1220, 1201, 1225, 1226, 1412, 1412, 1225, + 1228, 1224, 1227, 1223, 1225, 1226, 1413, 1413, + 1225, 1228, 1224, 1227, 1223, 1415, 1416, 1417, + 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, + 1426, 1427, 1428, 1429, 1430, 1417, 1418, 1419, + 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, + 1428, 1429, 1430, 1415, 1432, 1224, 1431, 1414, + 1225, 1226, 1433, 1433, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1434, 1434, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1435, 1435, 1225, 1228, + 1224, 1227, 1223, 1437, 1438, 1439, 1440, 1441, + 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, + 1450, 1451, 1452, 1439, 1440, 1441, 1442, 1443, + 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, + 1452, 1437, 1454, 1224, 1453, 1436, 1225, 1226, + 1455, 1456, 1455, 1456, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1457, 1457, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1458, 1458, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1459, 1459, 1225, + 1228, 1224, 1227, 1223, 1225, 1460, 1461, 1226, + 1225, 1228, 1224, 1227, 1223, 1463, 1464, 1465, + 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, + 1474, 1475, 1476, 1477, 1478, 1465, 1466, 1467, + 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, + 1476, 1477, 1478, 1463, 1480, 1224, 1479, 1462, + 1225, 1226, 1481, 1482, 1481, 1482, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1483, 1483, 1225, + 1228, 1224, 1227, 1223, 1225, 1226, 1484, 1484, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 1485, + 1485, 1225, 1228, 1224, 1227, 1223, 1487, 1488, + 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, + 1497, 1498, 1499, 1500, 1501, 1502, 1489, 1490, + 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, + 1499, 1500, 1501, 1502, 1487, 1504, 1224, 1503, + 1486, 1225, 1226, 1505, 1505, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1506, 1506, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1507, 1507, 1225, + 1228, 1224, 1227, 1223, 1509, 1510, 1511, 1512, + 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, + 1521, 1522, 1523, 1524, 1511, 1512, 1513, 1514, + 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, + 1523, 1524, 1509, 1526, 1224, 1525, 1508, 1225, + 1226, 1527, 1527, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1528, 1528, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1529, 1529, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1530, 1530, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1531, 1531, 1225, + 1228, 1224, 1227, 1223, 1533, 1534, 1535, 1536, + 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, + 1545, 1546, 1547, 1548, 1535, 1536, 1537, 1538, + 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, + 1547, 1548, 1533, 1550, 1224, 1549, 1532, 1225, + 1226, 1551, 1552, 1551, 1552, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1553, 1553, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1554, 1555, 1554, + 1555, 1225, 1228, 1224, 1227, 1223, 1557, 1558, + 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, + 1567, 1568, 1569, 1570, 1571, 1572, 1559, 1560, + 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, + 1569, 1570, 1571, 1572, 1557, 1574, 1224, 1573, + 1556, 1225, 1226, 1575, 1575, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1576, 1576, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1577, 1577, 1225, + 1228, 1224, 1227, 1223, 1225, 1226, 1578, 1578, + 1225, 1228, 1224, 1227, 1223, 1225, 1579, 1226, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 1580, + 1581, 1580, 1581, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1582, 1582, 1225, 1228, 1224, 1227, + 1223, 1584, 1585, 1586, 1587, 1588, 1589, 1590, + 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, + 1599, 1586, 1587, 1588, 1589, 1590, 1591, 1592, + 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1584, + 1601, 1224, 1600, 1583, 1225, 1226, 1602, 1602, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 1603, + 1603, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 1604, 1604, 1225, 1228, 1224, 1227, 1223, 1606, + 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, + 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1608, + 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 1620, 1621, 1606, 1623, 1224, + 1622, 1605, 1225, 1226, 1624, 1625, 1626, 1624, + 1625, 1626, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 1627, 1628, 1629, 1627, 1628, 1629, 1225, + 1228, 1224, 1227, 1223, 1225, 1226, 1630, 1630, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 1631, + 1631, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 1632, 1632, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 1626, 1626, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1633, 1633, 1225, 1228, 1224, 1227, + 1223, 1635, 1636, 1637, 1638, 1639, 1640, 1641, + 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, + 1650, 1637, 1638, 1639, 1640, 1641, 1642, 1643, + 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1635, + 1652, 1224, 1651, 1634, 1225, 1226, 1653, 1653, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 1654, + 1654, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 1655, 1655, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 1656, 1656, 1225, 1228, 1224, 1227, 1223, + 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, + 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, + 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, + 1668, 1669, 1670, 1671, 1672, 1673, 1658, 1675, + 1224, 1674, 1657, 1225, 1226, 1676, 1677, 1678, + 1679, 1676, 1677, 1678, 1679, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1680, 1680, 1225, 1228, + 1224, 1227, 1223, 1682, 1683, 1684, 1685, 1686, + 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, + 1695, 1696, 1697, 1684, 1685, 1686, 1687, 1688, + 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, + 1697, 1682, 1699, 1224, 1698, 1681, 1225, 1226, + 1700, 1700, 1225, 1228, 1224, 1227, 1223, 1702, + 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, + 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1704, + 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, + 1713, 1714, 1715, 1716, 1717, 1702, 1719, 1224, + 1718, 1701, 1225, 1226, 1720, 1720, 1225, 1228, + 1224, 1227, 1223, 1722, 1723, 1724, 1725, 1726, + 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, + 1735, 1736, 1737, 1724, 1725, 1726, 1727, 1728, + 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, + 1737, 1722, 1739, 1224, 1738, 1721, 1225, 1226, + 1740, 1741, 1742, 1740, 1741, 1742, 1225, 1228, + 1224, 1227, 1223, 1744, 1745, 1746, 1747, 1748, + 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, + 1757, 1758, 1759, 1746, 1747, 1748, 1749, 1750, + 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, + 1759, 1744, 1761, 1224, 1760, 1743, 1225, 1226, + 1762, 1762, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 1763, 1763, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1764, 1764, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1765, 1765, 1225, 1228, 1224, + 1227, 1223, 1225, 1766, 1226, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1767, 1767, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1768, 1768, 1225, + 1228, 1224, 1227, 1223, 1770, 1771, 1772, 1773, + 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, + 1782, 1783, 1784, 1785, 1772, 1773, 1774, 1775, + 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, + 1784, 1785, 1770, 1787, 1224, 1786, 1769, 1225, + 1226, 1788, 1788, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1789, 1789, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1790, 1790, 1225, 1228, 1224, + 1227, 1223, 1792, 1793, 1794, 1795, 1796, 1797, + 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, + 1806, 1807, 1794, 1795, 1796, 1797, 1798, 1799, + 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, + 1792, 1809, 1224, 1808, 1791, 1225, 1226, 1810, + 1810, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 1811, 1811, 1225, 1228, 1224, 1227, 1223, 1813, + 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, + 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1815, + 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, + 1824, 1825, 1826, 1827, 1828, 1813, 1830, 1224, + 1829, 1812, 1225, 1226, 1831, 1831, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1832, 1832, 1225, + 1228, 1224, 1227, 1223, 1225, 1833, 1226, 1225, + 1228, 1224, 1227, 1223, 1225, 1226, 1834, 1835, + 1836, 1834, 1835, 1836, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1837, 1837, 1225, 1228, 1224, + 1227, 1223, 1839, 1840, 1841, 1842, 1843, 1844, + 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, + 1853, 1854, 1841, 1842, 1843, 1844, 1845, 1846, + 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, + 1839, 1856, 1224, 1855, 1838, 1225, 1226, 1857, + 1858, 1857, 1858, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1859, 1859, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1860, 1860, 1225, 1228, 1224, + 1227, 1223, 1862, 1863, 1864, 1865, 1866, 1867, + 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, + 1876, 1877, 1864, 1865, 1866, 1867, 1868, 1869, + 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, + 1862, 1879, 1224, 1878, 1861, 1225, 1226, 1880, + 1880, 1225, 1228, 1224, 1227, 1223, 1882, 1883, + 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, + 1892, 1893, 1894, 1895, 1896, 1897, 1884, 1885, + 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, + 1894, 1895, 1896, 1897, 1882, 1899, 1224, 1898, + 1881, 1225, 1226, 1900, 1900, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1901, 1901, 1225, 1228, + 1224, 1227, 1223, 1903, 1904, 1905, 1906, 1907, + 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, + 1916, 1917, 1918, 1905, 1906, 1907, 1908, 1909, + 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, + 1918, 1903, 1920, 1224, 1919, 1902, 1225, 1226, + 1921, 1921, 1225, 1228, 1224, 1227, 1223, 1923, + 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, + 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1925, + 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, + 1934, 1935, 1936, 1937, 1938, 1923, 1940, 1224, + 1939, 1922, 1942, 1943, 1944, 1945, 1946, 1947, + 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, + 1956, 1957, 1944, 1945, 1946, 1947, 1948, 1949, + 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, + 1942, 1959, 1227, 1227, 1224, 1958, 1941, 1225, + 1226, 1960, 1960, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1961, 1961, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1962, 1962, 1225, 1228, 1224, + 1227, 1223, 1942, 1943, 1944, 1945, 1946, 1947, + 1948, 1949, 1950, 1963, 1952, 1953, 1954, 1955, + 1956, 1957, 1944, 1945, 1946, 1947, 1948, 1949, + 1950, 1963, 1952, 1953, 1954, 1955, 1956, 1957, + 1942, 1959, 1224, 1958, 1941, 1225, 1226, 1964, + 1964, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 1965, 1965, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 1966, 1966, 1225, 1228, 1224, 1227, 1223, + 1225, 1967, 1226, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1968, 1969, 1970, 1968, 1969, 1970, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 1971, + 1971, 1225, 1228, 1224, 1227, 1223, 1973, 1974, + 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, + 1983, 1984, 1985, 1986, 1987, 1988, 1975, 1976, + 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, + 1985, 1986, 1987, 1988, 1973, 1990, 1224, 1989, + 1972, 1225, 1226, 1991, 1991, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1992, 1992, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1993, 1993, 1225, + 1228, 1224, 1227, 1223, 1995, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, + 2007, 2008, 2009, 2010, 1997, 1998, 1999, 2000, + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, + 2009, 2010, 1995, 2012, 1224, 2011, 1994, 1225, + 1226, 2013, 2013, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 2014, 2014, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 2015, 2015, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 2016, 2016, 1225, 1228, + 1224, 1227, 1223, 2018, 2019, 2020, 2021, 2022, + 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, + 2031, 2032, 2033, 2020, 2021, 2022, 2023, 2024, + 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, + 2033, 2018, 2035, 1224, 2034, 2017, 1225, 1226, + 2036, 2036, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 2037, 2037, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 2038, 2038, 1225, 1228, 1224, 1227, + 1223, 2040, 2041, 2042, 2043, 2044, 2045, 2046, + 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, + 2055, 2042, 2043, 2044, 2045, 2046, 2047, 2048, + 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2040, + 2057, 1224, 2056, 2039, 2059, 2060, 2061, 2062, + 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, + 2071, 2072, 2073, 2074, 2061, 2062, 2063, 2064, + 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, + 2073, 2074, 2059, 2076, 1224, 2075, 2058, 1225, + 1226, 2077, 2077, 1225, 1228, 1224, 1227, 1223, + 1225, 2078, 1226, 1225, 1228, 1224, 1227, 1223, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, - 2088, 2089, 2090, 2091, 2092, 2093, 2080, 2081, + 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, - 2090, 2091, 2092, 2093, 2078, 2095, 2094, 2077, - 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, + 2090, 2091, 2092, 2093, 2094, 2095, 2080, 2097, + 1224, 2096, 2079, 1225, 1226, 2098, 2098, 1225, + 1228, 1224, 1227, 1223, 1225, 1226, 2099, 2099, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 2100, + 2100, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 2101, 2101, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 1720, 1720, 1225, 1228, 1224, 1227, 1223, + 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, + 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, - 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, - 2107, 2108, 2109, 2110, 2111, 2112, 2097, 2114, - 2113, 2096, 2116, 2117, 2118, 2119, 2120, 2121, - 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, - 2130, 2131, 2118, 2119, 2120, 2121, 2122, 2123, - 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, - 2116, 2133, 2132, 2115, 2135, 2136, 2137, 2138, - 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, - 2147, 2148, 2149, 2150, 2137, 2138, 2139, 2140, - 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, - 2149, 2150, 2135, 2152, 2151, 2134, 2154, 2155, - 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, - 2164, 2165, 2166, 2167, 2168, 2169, 2156, 2157, - 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, - 2166, 2167, 2168, 2169, 2154, 2171, 2170, 2153, - 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, - 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, - 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, - 2183, 2184, 2185, 2186, 2187, 2188, 2173, 2190, - 2189, 2172, 2192, 2193, 2194, 2195, 2196, 2197, - 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, - 2206, 2207, 2194, 2195, 2196, 2197, 2198, 2199, - 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, - 2192, 2209, 2208, 2191, 2211, 2212, 2213, 2214, - 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, - 2223, 2224, 2225, 2226, 2213, 2214, 2215, 2216, - 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, - 2225, 2226, 2211, 2228, 2227, 2210, 2230, 2231, - 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, - 2240, 2241, 2242, 2243, 2244, 2245, 2232, 2233, - 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, - 2242, 2243, 2244, 2245, 2230, 2247, 2246, 2229, + 2113, 2114, 2115, 2116, 2117, 2118, 2103, 2120, + 1224, 2119, 2102, 1225, 1226, 2121, 2122, 2121, + 2122, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 2123, 2123, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 2124, 2124, 1225, 1228, 1224, 1227, 1223, + 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, + 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, + 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, + 2136, 2137, 2138, 2139, 2140, 2141, 2126, 2143, + 1224, 2142, 2125, 1225, 2144, 1226, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 2145, 2145, 1225, + 1228, 1224, 1227, 1223, 1225, 1226, 2146, 2146, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 2147, + 2147, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 2148, 2148, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 2149, 2149, 1225, 1228, 1224, 1227, 1223, + 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, + 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, + 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, + 2161, 2162, 2163, 2164, 2165, 2166, 2151, 2168, + 1224, 2167, 2150, 1203, 1204, 1205, 1206, 1207, + 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, + 1216, 1217, 1218, 1219, 1206, 1207, 1208, 1209, + 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, + 1218, 1219, 1203, 1221, 1222, 2169, 2170, 2171, + 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, + 2180, 2181, 2182, 2169, 2170, 2171, 2172, 2173, + 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, + 2182, 1202, 1220, 1201, 2184, 2185, 2186, 2187, + 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, + 2196, 2197, 2198, 2199, 2186, 2187, 2188, 2189, + 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, + 2198, 2199, 2184, 2201, 2200, 2183, 2203, 2204, + 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, + 2213, 2214, 2215, 2216, 2217, 2218, 2205, 2206, + 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, + 2215, 2216, 2217, 2218, 2203, 2220, 2219, 2202, + 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, + 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, + 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, + 2232, 2233, 2234, 2235, 2236, 2237, 2222, 2239, + 2238, 2221, 2241, 2242, 2243, 2244, 2245, 2246, + 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, + 2255, 2256, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, - 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, - 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, - 2259, 2260, 2261, 2262, 2263, 2264, 2249, 2266, - 2265, 2248, 2268, 2269, 2270, 2271, 2272, 2273, - 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, - 2282, 2283, 2270, 2271, 2272, 2273, 2274, 2275, - 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, - 2268, 2285, 2284, 2267, 2287, 2288, 2289, 2290, - 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, - 2299, 2300, 2301, 2302, 2289, 2290, 2291, 2292, - 2293, 2294, 2295, 2296, 2297, 2298, 2299, 2300, - 2301, 2302, 2287, 2304, 2303, 2286, 2306, 2307, - 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, - 2316, 2317, 2318, 2319, 2320, 2321, 2308, 2309, - 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2317, - 2318, 2319, 2320, 2321, 2306, 2323, 2322, 2305, + 2241, 2258, 2257, 2240, 2260, 2261, 2262, 2263, + 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, + 2272, 2273, 2274, 2275, 2262, 2263, 2264, 2265, + 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, + 2274, 2275, 2260, 2277, 2276, 2259, 2279, 2280, + 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, + 2289, 2290, 2291, 2292, 2293, 2294, 2281, 2282, + 2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, + 2291, 2292, 2293, 2294, 2279, 2296, 2295, 2278, + 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, + 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, + 2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, + 2308, 2309, 2310, 2311, 2312, 2313, 2298, 2315, + 2314, 2297, 2317, 2318, 2319, 2320, 2321, 2322, + 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, + 2331, 2332, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, - 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, - 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, - 2335, 2336, 2337, 2338, 2339, 2340, 2325, 2342, - 2341, 2324, 2344, 2345, 2346, 2347, 2348, 2349, - 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, - 2358, 2359, 2346, 2347, 2348, 2349, 2350, 2351, - 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, - 2344, 2361, 2360, 2343, 2363, 2364, 2365, 2366, - 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, - 2375, 2376, 2377, 2378, 2365, 2366, 2367, 2368, - 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, - 2377, 2378, 2363, 2380, 2379, 2362, 2382, 2383, - 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, - 2392, 2393, 2394, 2395, 2396, 2397, 2384, 2385, - 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, - 2394, 2395, 2396, 2397, 2382, 2399, 2398, 2381, + 2317, 2334, 2333, 2316, 2336, 2337, 2338, 2339, + 2340, 2341, 2342, 2343, 2344, 2345, 2346, 2347, + 2348, 2349, 2350, 2351, 2338, 2339, 2340, 2341, + 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349, + 2350, 2351, 2336, 2353, 2352, 2335, 2355, 2356, + 2357, 2358, 2359, 2360, 2361, 2362, 2363, 2364, + 2365, 2366, 2367, 2368, 2369, 2370, 2357, 2358, + 2359, 2360, 2361, 2362, 2363, 2364, 2365, 2366, + 2367, 2368, 2369, 2370, 2355, 2372, 2371, 2354, + 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, + 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, + 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, + 2384, 2385, 2386, 2387, 2388, 2389, 2374, 2391, + 2390, 2373, 2393, 2394, 2395, 2396, 2397, 2398, + 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, + 2407, 2408, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, - 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, - 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, - 2411, 2412, 2413, 2414, 2415, 2416, 2401, 2418, - 2417, 2400, 2420, 2421, 2422, 2423, 2424, 2425, - 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, - 2434, 2435, 2422, 2423, 2424, 2425, 2426, 2427, - 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, - 2420, 2437, 2436, 2419, 2439, 2440, 2441, 2442, - 2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, - 2451, 2452, 2453, 2454, 2441, 2442, 2443, 2444, - 2445, 2446, 2447, 2448, 2449, 2450, 2451, 2452, - 2453, 2454, 2439, 2456, 2448, 2448, 2455, 2438, - 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, - 2447, 2457, 2449, 2450, 2451, 2452, 2453, 2454, - 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2457, - 2449, 2450, 2451, 2452, 2453, 2454, 2439, 2456, - 2455, 2438, 2459, 2460, 2461, 2462, 2463, 2464, - 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, - 2473, 2474, 2461, 2462, 2463, 2464, 2465, 2466, - 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, - 2459, 2476, 2475, 2458, 2478, 2479, 2480, 2481, - 2482, 2483, 2484, 2485, 2486, 2487, 2488, 2489, - 2490, 2491, 2492, 2493, 2480, 2481, 2482, 2483, - 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, - 2492, 2493, 2478, 2495, 2494, 2477, 2497, 2498, - 2499, 2500, 2501, 2502, 2503, 2504, 2505, 2506, - 2507, 2508, 2509, 2510, 2511, 2512, 2499, 2500, - 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, - 2509, 2510, 2511, 2512, 2497, 2514, 2513, 2496, - 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, - 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, - 2518, 2519, 2520, 2521, 2522, 2523, 2524, 2525, - 2526, 2527, 2528, 2529, 2530, 2531, 2516, 2533, - 2532, 2515, 2535, 2536, 2537, 2538, 2539, 2540, - 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, - 2549, 2550, 2537, 2538, 2539, 2540, 2541, 2542, - 2543, 2544, 2545, 2546, 2547, 2548, 2549, 2550, - 2535, 2552, 2551, 2534, 2554, 2555, 2556, 2557, - 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, - 2566, 2567, 2568, 2569, 2556, 2557, 2558, 2559, - 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, - 2568, 2569, 2554, 2571, 2570, 2553, 2573, 2574, - 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, - 2583, 2584, 2585, 2586, 2587, 2588, 2575, 2576, - 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, - 2585, 2586, 2587, 2588, 2573, 2590, 2589, 2572, - 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, - 2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, - 2594, 2595, 2596, 2597, 2598, 2599, 2600, 2601, - 2602, 2603, 2604, 2605, 2606, 2607, 2592, 2609, - 2608, 2591, 2611, 2612, 2613, 2614, 2615, 2616, - 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, - 2625, 2626, 2613, 2614, 2615, 2616, 2617, 2618, - 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626, - 2611, 2628, 2627, 2610, 1288, 132, 132, 1290, - 2629, 2629, 1289, 1287, 1288, 133, 133, 1290, - 133, 133, 1289, 1287, 1288, 134, 134, 1290, - 2630, 2630, 1289, 1287, 1288, 135, 135, 1290, - 2631, 2631, 1289, 1287, 1288, 136, 136, 1290, - 136, 136, 1289, 1287, 1288, 137, 138, 137, - 138, 1290, 2632, 2633, 2632, 2633, 1289, 1287, - 1288, 139, 139, 1290, 2634, 2634, 1289, 1287, - 1288, 140, 140, 1290, 2635, 2635, 1289, 1287, - 1288, 141, 141, 1290, 2636, 2636, 1289, 1287, - 142, 143, 1288, 142, 143, 1290, 1289, 1287, - 1288, 236, 237, 236, 237, 1290, 2637, 2638, - 2637, 2638, 1289, 1287, 1288, 238, 238, 1290, - 2639, 2639, 1289, 1287, 1288, 239, 239, 1290, - 239, 239, 1289, 1287, 240, 1288, 2640, 1290, - 1289, 1287, 1288, 241, 241, 1290, 2641, 2641, - 1289, 1287, 1288, 242, 242, 1290, 2642, 2642, - 1289, 1287, 1288, 243, 243, 1290, 2643, 2643, - 1289, 1287, 1288, 244, 244, 1290, 2644, 2644, - 1289, 1287, 1288, 245, 245, 1290, 245, 245, - 1289, 1287, 1288, 144, 145, 144, 145, 1290, - 2645, 2646, 2645, 2646, 1289, 1287, 1288, 146, - 146, 1290, 2647, 2647, 1289, 1287, 1288, 147, - 147, 1290, 2648, 2648, 1289, 1287, 1288, 148, - 148, 1290, 148, 148, 1289, 1287, 1288, 232, - 232, 1290, 2649, 2649, 1289, 1287, 1288, 233, - 233, 1290, 2650, 2650, 1289, 1287, 1288, 234, - 234, 1290, 2651, 2651, 1289, 1287, 1288, 235, - 235, 1290, 2652, 2652, 1289, 1287, 1288, 192, - 192, 1290, 192, 192, 1289, 1287, 1288, 149, - 149, 1290, 2653, 2653, 1289, 1287, 1288, 150, - 150, 1290, 2654, 2654, 1289, 1287, 1288, 151, - 151, 1290, 151, 151, 1289, 1287, 1288, 152, - 152, 1290, 2655, 2655, 1289, 1287, 1288, 153, - 153, 1290, 2656, 2656, 1289, 1287, 1288, 154, - 154, 1290, 2657, 2657, 1289, 1287, 1288, 155, - 155, 1290, 2658, 2658, 1289, 1287, 1288, 156, - 156, 1290, 156, 156, 1289, 1287, 1288, 157, - 158, 157, 158, 1290, 2659, 2660, 2659, 2660, - 1289, 1287, 1288, 159, 159, 1290, 2661, 2661, - 1289, 1287, 1288, 160, 161, 160, 161, 1290, - 160, 161, 160, 161, 1289, 1287, 1288, 230, - 230, 1290, 2662, 2662, 1289, 1287, 231, 1288, - 231, 1290, 1289, 1287, 1288, 162, 162, 1290, - 2663, 2663, 1289, 1287, 1288, 163, 163, 1290, - 2664, 2664, 1289, 1287, 1288, 164, 164, 1290, - 2665, 2665, 1289, 1287, 1288, 165, 165, 1290, - 2666, 2666, 1289, 1287, 166, 1288, 2667, 1290, - 1289, 1287, 1288, 167, 168, 167, 168, 1290, - 2668, 2669, 2668, 2669, 1289, 1287, 1288, 169, - 169, 1290, 169, 169, 1289, 1287, 1288, 227, - 227, 1290, 2670, 2670, 1289, 1287, 1288, 228, - 228, 1290, 2671, 2671, 1289, 1287, 1288, 229, - 229, 1290, 229, 229, 1289, 1287, 1288, 170, - 170, 1290, 2672, 2672, 1289, 1287, 1288, 171, - 171, 1290, 2673, 2673, 1289, 1287, 1288, 172, - 172, 1290, 172, 172, 1289, 1287, 1288, 173, - 174, 175, 173, 174, 175, 1290, 2674, 2675, - 2676, 2674, 2675, 2676, 1289, 1287, 1288, 176, - 177, 178, 176, 177, 178, 1290, 2677, 2678, - 2679, 2677, 2678, 2679, 1289, 1287, 1288, 179, - 179, 1290, 2680, 2680, 1289, 1287, 1288, 180, - 180, 1290, 2681, 2681, 1289, 1287, 1288, 181, - 181, 1290, 2682, 2682, 1289, 1287, 1288, 175, - 175, 1290, 2676, 2676, 1289, 1287, 1288, 182, - 182, 1290, 182, 182, 1289, 1287, 1288, 208, - 208, 1290, 208, 208, 1289, 1287, 2439, 2440, - 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, - 2449, 2450, 2451, 2452, 2453, 2454, 2441, 2442, - 2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, - 2451, 2452, 2453, 2454, 2439, 2456, 2683, 2683, - 2455, 2438, 1288, 209, 209, 1290, 2684, 2684, - 1289, 1287, 1288, 210, 210, 1290, 2685, 2685, - 1289, 1287, 1288, 211, 211, 1290, 211, 211, - 1289, 1287, 1288, 212, 212, 1290, 2686, 2686, - 1289, 1287, 1288, 213, 213, 1290, 2687, 2687, - 1289, 1287, 1288, 214, 214, 1290, 2688, 2688, - 1289, 1287, 215, 1288, 2689, 1290, 1289, 1287, - 1288, 216, 217, 218, 216, 217, 218, 1290, - 2690, 2691, 2692, 2690, 2691, 2692, 1289, 1287, - 1288, 219, 219, 1290, 219, 219, 1289, 1287, - 1288, 220, 220, 1290, 2693, 2693, 1289, 1287, - 1288, 221, 221, 1290, 2694, 2694, 1289, 1287, - 1288, 222, 222, 1290, 222, 222, 1289, 1287, - 1288, 223, 223, 1290, 2695, 2695, 1289, 1287, - 1288, 224, 224, 1290, 2696, 2696, 1289, 1287, - 1288, 225, 225, 1290, 2697, 2697, 1289, 1287, - 1288, 226, 226, 1290, 226, 226, 1289, 1287, - 1288, 183, 183, 1290, 2698, 2698, 1289, 1287, - 1288, 184, 184, 1290, 2699, 2699, 1289, 1287, - 1288, 185, 185, 1290, 2700, 2700, 1289, 1287, - 1288, 186, 186, 1290, 186, 186, 1289, 1287, - 1288, 187, 188, 189, 187, 188, 189, 1290, - 2701, 2702, 2703, 2701, 2702, 2703, 1289, 1287, - 1288, 190, 190, 1290, 190, 190, 1289, 1287, - 1288, 193, 194, 195, 193, 194, 195, 1290, - 193, 2704, 2705, 193, 2704, 2705, 1289, 1287, - 1288, 196, 196, 1290, 2706, 2706, 1289, 1287, - 1288, 197, 197, 1290, 2707, 2707, 1289, 1287, - 1288, 198, 198, 1290, 2708, 2708, 1289, 1287, - 1288, 199, 199, 1290, 2709, 2709, 1289, 1287, - 200, 1288, 2710, 1290, 1289, 1287, 1288, 201, - 201, 1290, 2711, 2711, 1289, 1287, 1288, 202, - 202, 1290, 202, 202, 1289, 1287, 1288, 203, - 203, 1290, 2712, 2712, 1289, 1287, 1288, 204, - 204, 1290, 2713, 2713, 1289, 1287, 1288, 205, - 205, 1290, 205, 205, 1289, 1287, 1288, 206, - 206, 1290, 2714, 2714, 1289, 1287, 1288, 207, - 207, 1290, 207, 207, 1289, 1287, 1288, 191, - 191, 1290, 191, 191, 1289, 1287, 1288, 192, - 192, 1290, 192, 192, 1289, 1287, 2716, 2717, - 246, 2716, 2717, 246, 2718, 2715, 2717, 2717, - 2718, 2715, 2720, 2720, 2721, 2719, 0 + 2393, 2410, 2409, 2392, 2412, 2413, 2414, 2415, + 2416, 2417, 2418, 2419, 2420, 2421, 2422, 2423, + 2424, 2425, 2426, 2427, 2414, 2415, 2416, 2417, + 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425, + 2426, 2427, 2412, 2429, 2428, 2411, 2431, 2432, + 2433, 2434, 2435, 2436, 2437, 2438, 2439, 2440, + 2441, 2442, 2443, 2444, 2445, 2446, 2433, 2434, + 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, + 2443, 2444, 2445, 2446, 2431, 2448, 2447, 2430, + 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, + 2458, 2459, 2460, 2461, 2462, 2463, 2464, 2465, + 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, + 2460, 2461, 2462, 2463, 2464, 2465, 2450, 2467, + 2466, 2449, 2469, 2470, 2471, 2472, 2473, 2474, + 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, + 2483, 2484, 2471, 2472, 2473, 2474, 2475, 2476, + 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484, + 2469, 2486, 2485, 2468, 2488, 2489, 2490, 2491, + 2492, 2493, 2494, 2495, 2496, 2497, 2498, 2499, + 2500, 2501, 2502, 2503, 2490, 2491, 2492, 2493, + 2494, 2495, 2496, 2497, 2498, 2499, 2500, 2501, + 2502, 2503, 2488, 2505, 2504, 2487, 2507, 2508, + 2509, 2510, 2511, 2512, 2513, 2514, 2515, 2516, + 2517, 2518, 2519, 2520, 2521, 2522, 2509, 2510, + 2511, 2512, 2513, 2514, 2515, 2516, 2517, 2518, + 2519, 2520, 2521, 2522, 2507, 2524, 2523, 2506, + 2526, 2527, 2528, 2529, 2530, 2531, 2532, 2533, + 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, + 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, + 2536, 2537, 2538, 2539, 2540, 2541, 2526, 2543, + 2542, 2525, 2545, 2546, 2547, 2548, 2549, 2550, + 2551, 2552, 2553, 2554, 2555, 2556, 2557, 2558, + 2559, 2560, 2547, 2548, 2549, 2550, 2551, 2552, + 2553, 2554, 2555, 2556, 2557, 2558, 2559, 2560, + 2545, 2562, 2561, 2544, 2564, 2565, 2566, 2567, + 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, + 2576, 2577, 2578, 2579, 2566, 2567, 2568, 2569, + 2570, 2571, 2572, 2573, 2574, 2575, 2576, 2577, + 2578, 2579, 2564, 2581, 2580, 2563, 2583, 2584, + 2585, 2586, 2587, 2588, 2589, 2590, 2591, 2592, + 2593, 2594, 2595, 2596, 2597, 2598, 2585, 2586, + 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, + 2595, 2596, 2597, 2598, 2583, 2600, 2599, 2582, + 2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, + 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2617, + 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, + 2612, 2613, 2614, 2615, 2616, 2617, 2602, 2619, + 2618, 2601, 2621, 2622, 2623, 2624, 2625, 2626, + 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, + 2635, 2636, 2623, 2624, 2625, 2626, 2627, 2628, + 2629, 2630, 2631, 2632, 2633, 2634, 2635, 2636, + 2621, 2638, 2630, 2630, 2637, 2620, 2621, 2622, + 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2639, + 2631, 2632, 2633, 2634, 2635, 2636, 2623, 2624, + 2625, 2626, 2627, 2628, 2629, 2639, 2631, 2632, + 2633, 2634, 2635, 2636, 2621, 2638, 2637, 2620, + 2641, 2642, 2643, 2644, 2645, 2646, 2647, 2648, + 2649, 2650, 2651, 2652, 2653, 2654, 2655, 2656, + 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2650, + 2651, 2652, 2653, 2654, 2655, 2656, 2641, 2658, + 2657, 2640, 2660, 2661, 2662, 2663, 2664, 2665, + 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, + 2674, 2675, 2662, 2663, 2664, 2665, 2666, 2667, + 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, + 2660, 2677, 2676, 2659, 2679, 2680, 2681, 2682, + 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, + 2691, 2692, 2693, 2694, 2681, 2682, 2683, 2684, + 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, + 2693, 2694, 2679, 2696, 2695, 2678, 2698, 2699, + 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, + 2708, 2709, 2710, 2711, 2712, 2713, 2700, 2701, + 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, + 2710, 2711, 2712, 2713, 2698, 2715, 2714, 2697, + 2717, 2718, 2719, 2720, 2721, 2722, 2723, 2724, + 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732, + 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, + 2727, 2728, 2729, 2730, 2731, 2732, 2717, 2734, + 2733, 2716, 2736, 2737, 2738, 2739, 2740, 2741, + 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749, + 2750, 2751, 2738, 2739, 2740, 2741, 2742, 2743, + 2744, 2745, 2746, 2747, 2748, 2749, 2750, 2751, + 2736, 2753, 2752, 2735, 2755, 2756, 2757, 2758, + 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766, + 2767, 2768, 2769, 2770, 2757, 2758, 2759, 2760, + 2761, 2762, 2763, 2764, 2765, 2766, 2767, 2768, + 2769, 2770, 2755, 2772, 2771, 2754, 2774, 2775, + 2776, 2777, 2778, 2779, 2780, 2781, 2782, 2783, + 2784, 2785, 2786, 2787, 2788, 2789, 2776, 2777, + 2778, 2779, 2780, 2781, 2782, 2783, 2784, 2785, + 2786, 2787, 2788, 2789, 2774, 2791, 2790, 2773, + 2793, 2794, 2795, 2796, 2797, 2798, 2799, 2800, + 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, + 2795, 2796, 2797, 2798, 2799, 2800, 2801, 2802, + 2803, 2804, 2805, 2806, 2807, 2808, 2793, 2810, + 2809, 2792, 1303, 132, 132, 1305, 2811, 2811, + 1304, 1302, 1303, 133, 133, 1305, 133, 133, + 1304, 1302, 1303, 134, 134, 1305, 2812, 2812, + 1304, 1302, 1303, 135, 135, 1305, 2813, 2813, + 1304, 1302, 1303, 136, 136, 1305, 136, 136, + 1304, 1302, 1303, 137, 138, 137, 138, 1305, + 2814, 2815, 2814, 2815, 1304, 1302, 1303, 139, + 139, 1305, 2816, 2816, 1304, 1302, 1303, 140, + 140, 1305, 2817, 2817, 1304, 1302, 1303, 141, + 141, 1305, 2818, 2818, 1304, 1302, 142, 143, + 1303, 142, 143, 1305, 1304, 1302, 1303, 251, + 252, 251, 252, 1305, 2819, 2820, 2819, 2820, + 1304, 1302, 1303, 253, 253, 1305, 2821, 2821, + 1304, 1302, 1303, 254, 254, 1305, 254, 254, + 1304, 1302, 255, 1303, 2822, 1305, 1304, 1302, + 1303, 256, 256, 1305, 2823, 2823, 1304, 1302, + 1303, 257, 257, 1305, 2824, 2824, 1304, 1302, + 1303, 258, 258, 1305, 2825, 2825, 1304, 1302, + 1303, 259, 259, 1305, 2826, 2826, 1304, 1302, + 1303, 260, 260, 1305, 260, 260, 1304, 1302, + 1303, 144, 145, 144, 145, 1305, 2827, 2828, + 2827, 2828, 1304, 1302, 1303, 146, 146, 1305, + 2829, 2829, 1304, 1302, 1303, 147, 147, 1305, + 2830, 2830, 1304, 1302, 1303, 148, 148, 1305, + 148, 148, 1304, 1302, 1303, 247, 247, 1305, + 2831, 2831, 1304, 1302, 1303, 248, 248, 1305, + 2832, 2832, 1304, 1302, 1303, 249, 249, 1305, + 2833, 2833, 1304, 1302, 1303, 250, 250, 1305, + 2834, 2834, 1304, 1302, 1303, 193, 193, 1305, + 193, 193, 1304, 1302, 1303, 149, 149, 1305, + 2835, 2835, 1304, 1302, 1303, 150, 150, 1305, + 2836, 2836, 1304, 1302, 1303, 151, 151, 1305, + 151, 151, 1304, 1302, 1303, 152, 152, 1305, + 2837, 2837, 1304, 1302, 1303, 153, 153, 1305, + 2838, 2838, 1304, 1302, 1303, 154, 154, 1305, + 2839, 2839, 1304, 1302, 1303, 155, 155, 1305, + 2840, 2840, 1304, 1302, 1303, 156, 156, 1305, + 156, 156, 1304, 1302, 1303, 157, 158, 157, + 158, 1305, 2841, 2842, 2841, 2842, 1304, 1302, + 1303, 159, 159, 1305, 2843, 2843, 1304, 1302, + 1303, 160, 161, 160, 161, 1305, 160, 161, + 160, 161, 1304, 1302, 1303, 245, 245, 1305, + 2844, 2844, 1304, 1302, 246, 1303, 246, 1305, + 1304, 1302, 1303, 162, 162, 1305, 2845, 2845, + 1304, 1302, 1303, 163, 163, 1305, 2846, 2846, + 1304, 1302, 1303, 164, 164, 1305, 2847, 2847, + 1304, 1302, 1303, 165, 165, 1305, 2848, 2848, + 1304, 1302, 166, 1303, 2849, 1305, 1304, 1302, + 1303, 167, 168, 167, 168, 1305, 2850, 2851, + 2850, 2851, 1304, 1302, 1303, 169, 169, 1305, + 169, 169, 1304, 1302, 1303, 242, 242, 1305, + 2852, 2852, 1304, 1302, 1303, 243, 243, 1305, + 2853, 2853, 1304, 1302, 1303, 244, 244, 1305, + 244, 244, 1304, 1302, 1303, 170, 170, 1305, + 2854, 2854, 1304, 1302, 1303, 171, 171, 1305, + 2855, 2855, 1304, 1302, 1303, 172, 172, 1305, + 172, 172, 1304, 1302, 1303, 173, 174, 175, + 173, 174, 175, 1305, 2856, 2857, 2858, 2856, + 2857, 2858, 1304, 1302, 1303, 176, 177, 178, + 176, 177, 178, 1305, 2859, 2860, 2861, 2859, + 2860, 2861, 1304, 1302, 1303, 179, 179, 1305, + 2862, 2862, 1304, 1302, 1303, 180, 180, 1305, + 2863, 2863, 1304, 1302, 1303, 181, 181, 1305, + 2864, 2864, 1304, 1302, 1303, 175, 175, 1305, + 2858, 2858, 1304, 1302, 1303, 182, 182, 1305, + 182, 182, 1304, 1302, 1303, 223, 223, 1305, + 223, 223, 1304, 1302, 2621, 2622, 2623, 2624, + 2625, 2626, 2627, 2628, 2629, 2630, 2631, 2632, + 2633, 2634, 2635, 2636, 2623, 2624, 2625, 2626, + 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, + 2635, 2636, 2621, 2638, 2865, 2865, 2637, 2620, + 1303, 224, 224, 1305, 2866, 2866, 1304, 1302, + 1303, 225, 225, 1305, 2867, 2867, 1304, 1302, + 1303, 226, 226, 1305, 226, 226, 1304, 1302, + 1303, 227, 227, 1305, 2868, 2868, 1304, 1302, + 1303, 228, 228, 1305, 2869, 2869, 1304, 1302, + 1303, 229, 229, 1305, 2870, 2870, 1304, 1302, + 230, 1303, 2871, 1305, 1304, 1302, 1303, 231, + 232, 233, 231, 232, 233, 1305, 2872, 2873, + 2874, 2872, 2873, 2874, 1304, 1302, 1303, 234, + 234, 1305, 234, 234, 1304, 1302, 1303, 235, + 235, 1305, 2875, 2875, 1304, 1302, 1303, 236, + 236, 1305, 2876, 2876, 1304, 1302, 1303, 237, + 237, 1305, 237, 237, 1304, 1302, 1303, 238, + 238, 1305, 2877, 2877, 1304, 1302, 1303, 239, + 239, 1305, 2878, 2878, 1304, 1302, 1303, 240, + 240, 1305, 2879, 2879, 1304, 1302, 1303, 241, + 241, 1305, 241, 241, 1304, 1302, 1303, 183, + 183, 1305, 2880, 2880, 1304, 1302, 1303, 184, + 184, 1305, 2881, 2881, 1304, 1302, 1303, 185, + 185, 1305, 2882, 2882, 1304, 1302, 1303, 186, + 186, 1305, 186, 186, 1304, 1302, 1303, 187, + 188, 189, 190, 187, 188, 189, 190, 1305, + 2883, 2884, 2885, 2886, 2883, 2884, 2885, 2886, + 1304, 1302, 1303, 191, 191, 1305, 191, 191, + 1304, 1302, 1303, 194, 195, 196, 194, 195, + 196, 1305, 194, 2887, 2888, 194, 2887, 2888, + 1304, 1302, 1303, 197, 197, 1305, 2889, 2889, + 1304, 1302, 1303, 198, 198, 1305, 2890, 2890, + 1304, 1302, 1303, 199, 199, 1305, 2891, 2891, + 1304, 1302, 1303, 200, 200, 1305, 2892, 2892, + 1304, 1302, 201, 1303, 2893, 1305, 1304, 1302, + 1303, 202, 202, 1305, 2894, 2894, 1304, 1302, + 1303, 203, 203, 1305, 203, 203, 1304, 1302, + 1303, 204, 204, 1305, 2895, 2895, 1304, 1302, + 1303, 205, 205, 1305, 2896, 2896, 1304, 1302, + 1303, 206, 206, 1305, 206, 206, 1304, 1302, + 1303, 207, 207, 1305, 2897, 2897, 1304, 1302, + 1303, 208, 208, 1305, 208, 208, 1304, 1302, + 1303, 209, 209, 1305, 2898, 2898, 1304, 1302, + 1303, 210, 210, 1305, 2899, 2899, 1304, 1302, + 211, 1303, 2900, 1305, 1304, 1302, 1303, 212, + 213, 214, 212, 213, 214, 1305, 2901, 2902, + 2903, 2901, 2902, 2903, 1304, 1302, 1303, 215, + 215, 1305, 215, 215, 1304, 1302, 1303, 216, + 217, 216, 217, 1305, 2904, 2905, 2904, 2905, + 1304, 1302, 1303, 218, 218, 1305, 2906, 2906, + 1304, 1302, 1303, 219, 219, 1305, 219, 219, + 1304, 1302, 1303, 220, 220, 1305, 220, 220, + 1304, 1302, 1303, 221, 221, 1305, 2907, 2907, + 1304, 1302, 1303, 222, 222, 1305, 222, 222, + 1304, 1302, 1303, 192, 192, 1305, 192, 192, + 1304, 1302, 1303, 193, 193, 1305, 193, 193, + 1304, 1302, 2909, 2910, 261, 2909, 2910, 261, + 2911, 2908, 2910, 2910, 2911, 2908, 2913, 2913, + 2914, 2912, 0 }; static const short _demo_machine_parser_cmd_trans_targs[] = { - 2, 0, 224, 3, 2, 224, 3, 226, - 221, 6, 94, 7, 8, 9, 10, 11, - 12, 13, 91, 14, 15, 16, 17, 367, - 370, 20, 21, 22, 373, 24, 374, 25, + 2, 0, 235, 3, 2, 235, 3, 237, + 232, 6, 94, 7, 8, 9, 10, 11, + 12, 13, 91, 14, 15, 16, 17, 378, + 381, 20, 21, 22, 384, 24, 385, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 36, 37, 38, 39, 376, 41, 377, - 43, 44, 378, 46, 379, 48, 49, 380, - 383, 393, 52, 53, 54, 384, 56, 65, - 68, 385, 69, 71, 57, 58, 59, 60, - 61, 63, 64, 387, 66, 67, 388, 389, - 70, 390, 391, 73, 74, 75, 76, 392, - 78, 394, 395, 81, 396, 83, 397, 399, - 86, 400, 88, 401, 90, 402, 92, 93, - 403, 96, 97, 404, 99, 100, 101, 405, - 406, 221, 409, 105, 106, 107, 437, 109, - 110, 111, 112, 114, 439, 440, 115, 116, - 117, 118, 120, 441, 122, 627, 124, 125, - 628, 127, 211, 128, 129, 130, 629, 654, - 132, 206, 133, 134, 630, 136, 137, 631, - 139, 140, 141, 142, 632, 144, 204, 145, - 633, 652, 147, 148, 149, 150, 151, 152, - 201, 634, 154, 155, 635, 157, 188, 162, - 158, 184, 646, 159, 160, 161, 636, 164, - 165, 166, 637, 168, 171, 182, 638, 639, - 640, 641, 172, 179, 173, 174, 175, 176, - 177, 178, 642, 180, 181, 643, 183, 644, - 645, 186, 187, 647, 189, 190, 191, 192, - 193, 194, 197, 648, 195, 196, 649, 198, - 199, 200, 650, 202, 203, 651, 205, 653, - 207, 208, 209, 210, 212, 214, 213, 655, - 215, 216, 217, 218, 219, 656, 757, 221, - 222, 1, 4, 102, 220, 221, 223, 221, - 223, 221, 224, 225, 221, 225, 221, 227, - 228, 366, 5, 368, 369, 371, 372, 23, - 375, 40, 45, 381, 382, 55, 386, 221, - 227, 229, 230, 244, 245, 248, 249, 255, - 268, 275, 282, 289, 290, 298, 306, 221, - 229, 230, 244, 245, 248, 249, 255, 268, - 275, 282, 289, 290, 298, 357, 365, 231, - 356, 232, 233, 234, 235, 236, 237, 238, - 352, 239, 240, 241, 242, 243, 221, 229, - 230, 244, 245, 248, 249, 255, 268, 275, - 282, 289, 290, 298, 306, 221, 229, 230, - 244, 245, 248, 249, 255, 268, 275, 282, - 289, 290, 298, 346, 349, 306, 221, 229, - 246, 244, 245, 248, 249, 255, 268, 275, - 282, 289, 290, 298, 306, 334, 247, 221, - 229, 230, 244, 245, 248, 249, 255, 268, - 275, 282, 289, 290, 298, 306, 221, 229, - 230, 244, 245, 248, 249, 343, 255, 268, - 275, 282, 289, 290, 298, 306, 221, 250, - 230, 244, 337, 248, 249, 255, 268, 340, - 282, 289, 290, 298, 254, 306, 251, 252, - 253, 221, 229, 230, 244, 245, 248, 249, - 255, 268, 275, 282, 289, 290, 298, 306, - 256, 267, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 221, 229, 230, 244, - 245, 248, 249, 255, 268, 275, 282, 289, - 290, 298, 306, 221, 229, 230, 244, 269, - 248, 249, 255, 268, 275, 282, 289, 290, - 298, 306, 270, 271, 272, 273, 274, 245, - 276, 277, 221, 229, 230, 244, 245, 248, - 249, 278, 255, 268, 275, 282, 289, 290, - 298, 306, 279, 280, 281, 283, 284, 221, - 229, 230, 244, 245, 248, 249, 285, 268, - 275, 282, 289, 290, 298, 306, 286, 287, - 288, 255, 230, 221, 229, 230, 244, 291, - 248, 249, 255, 268, 275, 282, 289, 290, - 298, 332, 306, 292, 328, 221, 229, 230, - 244, 245, 248, 249, 293, 255, 268, 275, - 282, 289, 290, 298, 306, 294, 295, 296, - 297, 299, 311, 315, 305, 317, 320, 300, - 301, 302, 303, 304, 221, 229, 230, 244, - 245, 248, 249, 255, 268, 275, 282, 289, - 290, 298, 306, 221, 229, 230, 244, 245, - 248, 249, 307, 255, 268, 275, 282, 289, - 290, 298, 306, 308, 309, 310, 312, 313, - 314, 221, 229, 230, 244, 245, 248, 249, - 255, 268, 275, 282, 289, 290, 298, 306, - 316, 221, 229, 230, 244, 245, 248, 249, - 255, 268, 275, 282, 289, 290, 298, 306, - 318, 319, 221, 229, 230, 244, 245, 248, - 249, 255, 268, 275, 282, 289, 290, 298, - 306, 321, 221, 229, 230, 244, 245, 248, - 249, 255, 268, 275, 282, 289, 290, 322, - 306, 323, 324, 325, 326, 327, 298, 221, - 229, 230, 244, 245, 248, 249, 255, 268, - 275, 282, 289, 290, 298, 329, 306, 330, - 331, 333, 245, 335, 336, 338, 339, 229, - 245, 275, 221, 229, 230, 244, 245, 248, - 249, 341, 268, 275, 282, 289, 290, 298, - 306, 342, 255, 344, 345, 347, 348, 221, - 229, 230, 244, 245, 248, 249, 255, 268, - 275, 282, 289, 290, 298, 306, 350, 351, - 353, 354, 355, 221, 229, 230, 244, 245, - 248, 249, 255, 268, 275, 282, 289, 290, - 298, 306, 358, 359, 360, 361, 362, 363, - 364, 221, 229, 230, 244, 245, 248, 249, - 255, 268, 275, 282, 289, 290, 298, 306, - 221, 366, 5, 368, 369, 371, 372, 23, - 375, 40, 45, 381, 382, 55, 95, 221, - 366, 5, 368, 369, 371, 372, 23, 375, - 40, 45, 381, 382, 55, 386, 221, 366, - 5, 368, 369, 371, 372, 23, 375, 40, - 45, 381, 382, 55, 87, 89, 386, 221, - 366, 18, 368, 369, 371, 372, 23, 375, - 40, 45, 381, 382, 55, 386, 80, 221, - 366, 5, 368, 369, 371, 372, 23, 375, - 40, 45, 381, 382, 55, 386, 221, 366, - 5, 368, 369, 371, 372, 85, 23, 375, - 40, 45, 381, 382, 55, 386, 221, 19, - 5, 368, 82, 371, 372, 23, 375, 398, - 45, 381, 382, 55, 386, 221, 366, 5, - 368, 369, 371, 372, 23, 375, 40, 45, - 381, 382, 55, 386, 221, 366, 5, 368, - 369, 371, 372, 23, 375, 40, 45, 381, - 382, 55, 386, 221, 366, 5, 368, 35, - 371, 372, 23, 375, 40, 45, 381, 382, - 55, 386, 369, 221, 366, 5, 368, 369, - 371, 372, 42, 23, 375, 40, 45, 381, - 382, 55, 386, 221, 366, 5, 368, 369, - 371, 372, 47, 375, 40, 45, 381, 382, - 55, 386, 23, 5, 221, 366, 5, 368, - 50, 371, 372, 23, 375, 40, 45, 381, - 382, 55, 79, 386, 221, 366, 5, 368, - 369, 371, 372, 51, 23, 375, 40, 45, - 381, 382, 55, 386, 221, 366, 5, 368, - 369, 371, 372, 23, 375, 40, 45, 381, - 382, 55, 386, 221, 366, 5, 368, 369, - 371, 372, 62, 23, 375, 40, 45, 381, - 382, 55, 386, 221, 366, 5, 368, 369, - 371, 372, 23, 375, 40, 45, 381, 382, - 55, 386, 221, 366, 5, 368, 369, 371, - 372, 23, 375, 40, 45, 381, 382, 55, - 386, 221, 366, 5, 368, 369, 371, 372, - 23, 375, 40, 45, 381, 382, 55, 386, - 221, 366, 5, 368, 369, 371, 372, 23, - 375, 40, 45, 381, 382, 72, 386, 55, - 221, 366, 5, 368, 369, 371, 372, 23, - 375, 40, 45, 381, 382, 55, 77, 386, - 369, 366, 369, 40, 221, 366, 5, 368, - 369, 371, 372, 84, 375, 40, 45, 381, - 382, 55, 386, 23, 221, 366, 5, 368, - 369, 371, 372, 23, 375, 40, 45, 381, - 382, 55, 386, 221, 366, 5, 368, 369, - 371, 372, 23, 375, 40, 45, 381, 382, - 55, 386, 98, 221, 366, 5, 368, 369, - 371, 372, 23, 375, 40, 45, 381, 382, - 55, 386, 221, 407, 408, 496, 103, 121, - 123, 126, 131, 135, 138, 143, 146, 153, - 156, 163, 167, 169, 170, 442, 626, 443, - 221, 407, 408, 103, 442, 443, 221, 408, - 103, 442, 443, 221, 410, 411, 412, 436, - 438, 113, 221, 410, 411, 221, 411, 413, - 419, 425, 221, 411, 413, 414, 419, 425, - 415, 416, 417, 418, 420, 421, 422, 423, - 424, 426, 431, 432, 427, 428, 429, 430, - 221, 411, 413, 419, 425, 221, 411, 433, - 419, 425, 434, 435, 413, 221, 411, 436, - 104, 438, 113, 108, 221, 411, 436, 438, - 113, 221, 411, 119, 438, 113, 436, 221, - 103, 442, 443, 409, 444, 221, 412, 445, - 447, 449, 473, 479, 485, 221, 446, 445, - 447, 448, 412, 447, 412, 449, 450, 456, - 462, 221, 447, 450, 451, 456, 462, 452, - 453, 454, 455, 457, 458, 459, 460, 461, - 463, 468, 469, 464, 465, 466, 467, 221, - 447, 450, 456, 462, 221, 447, 470, 456, - 462, 471, 472, 450, 221, 447, 473, 474, - 479, 485, 475, 476, 477, 478, 480, 481, - 482, 483, 484, 486, 491, 492, 487, 488, - 489, 490, 221, 447, 473, 479, 485, 221, - 447, 493, 479, 485, 494, 495, 473, 497, - 500, 504, 510, 515, 519, 525, 529, 537, - 541, 549, 554, 557, 559, 498, 499, 221, - 408, 103, 497, 500, 504, 510, 515, 519, - 525, 529, 537, 541, 549, 554, 557, 559, - 442, 443, 501, 502, 503, 221, 408, 103, - 497, 500, 504, 510, 515, 519, 525, 529, - 537, 541, 549, 554, 557, 559, 442, 443, - 505, 615, 506, 507, 508, 509, 614, 221, - 408, 103, 497, 500, 504, 510, 515, 519, - 525, 529, 537, 541, 549, 554, 557, 559, - 442, 443, 511, 609, 512, 513, 514, 221, - 408, 103, 497, 500, 504, 510, 515, 519, - 525, 529, 537, 541, 549, 554, 557, 559, - 442, 443, 516, 517, 518, 221, 408, 103, - 497, 500, 504, 510, 515, 519, 525, 529, - 537, 541, 549, 554, 557, 559, 442, 443, - 520, 521, 522, 523, 524, 221, 408, 103, - 497, 500, 504, 510, 515, 519, 525, 529, - 537, 541, 549, 554, 557, 559, 442, 443, - 526, 606, 527, 528, 605, 221, 408, 103, - 497, 500, 504, 510, 515, 519, 525, 529, - 537, 541, 549, 554, 557, 559, 442, 443, - 530, 531, 532, 533, 534, 535, 601, 536, - 221, 408, 103, 497, 500, 504, 510, 515, - 519, 525, 529, 537, 541, 549, 554, 557, - 559, 442, 443, 538, 539, 540, 221, 408, - 103, 497, 500, 504, 510, 515, 519, 525, - 529, 537, 541, 549, 554, 557, 559, 442, - 443, 542, 585, 547, 543, 578, 580, 544, - 545, 546, 548, 221, 408, 103, 497, 500, - 504, 510, 515, 519, 525, 529, 537, 541, - 549, 554, 557, 559, 442, 443, 550, 551, - 552, 553, 221, 408, 103, 497, 500, 504, - 510, 515, 519, 525, 529, 537, 541, 549, - 554, 557, 559, 442, 443, 555, 561, 575, - 556, 221, 408, 103, 497, 500, 504, 510, - 515, 519, 525, 529, 537, 541, 549, 554, - 557, 559, 442, 443, 558, 221, 408, 103, - 497, 500, 504, 510, 515, 519, 525, 529, - 537, 541, 549, 554, 557, 559, 442, 443, - 560, 221, 408, 103, 497, 500, 504, 510, - 515, 519, 525, 529, 537, 541, 549, 554, - 557, 559, 442, 443, 562, 563, 571, 221, - 408, 103, 497, 500, 504, 510, 515, 519, - 525, 529, 537, 541, 549, 554, 557, 559, - 442, 443, 564, 565, 566, 567, 568, 569, - 570, 221, 408, 103, 497, 500, 504, 510, - 515, 519, 525, 529, 537, 541, 549, 554, - 557, 559, 442, 443, 572, 573, 574, 221, - 408, 103, 497, 500, 504, 510, 515, 519, - 525, 529, 537, 541, 549, 554, 557, 559, - 442, 443, 576, 577, 221, 408, 103, 497, - 500, 504, 510, 515, 519, 525, 529, 537, - 541, 549, 554, 557, 559, 442, 443, 579, - 221, 408, 103, 497, 500, 504, 510, 515, - 519, 525, 529, 537, 541, 549, 554, 557, - 559, 442, 443, 221, 408, 103, 497, 500, - 504, 510, 515, 519, 525, 581, 537, 541, - 549, 554, 557, 559, 442, 443, 582, 583, - 584, 529, 586, 587, 588, 589, 590, 592, - 596, 591, 221, 408, 103, 497, 500, 504, - 510, 515, 519, 525, 529, 537, 541, 549, - 554, 557, 559, 442, 443, 593, 594, 595, - 221, 408, 103, 497, 500, 504, 510, 515, - 519, 525, 529, 537, 541, 549, 554, 557, - 559, 442, 443, 597, 598, 599, 600, 221, - 408, 103, 497, 500, 504, 510, 515, 519, - 525, 529, 537, 541, 549, 554, 557, 559, - 442, 443, 602, 603, 604, 221, 408, 103, - 497, 500, 504, 510, 515, 519, 525, 529, - 537, 541, 549, 554, 557, 559, 442, 443, - 221, 408, 103, 497, 500, 504, 510, 515, - 519, 525, 529, 537, 541, 549, 554, 557, - 559, 442, 443, 607, 608, 221, 408, 103, - 497, 500, 504, 510, 515, 519, 525, 529, - 537, 541, 549, 554, 557, 559, 442, 443, - 610, 611, 612, 613, 221, 408, 103, 497, - 500, 504, 510, 515, 519, 525, 529, 537, - 541, 549, 554, 557, 559, 442, 443, 616, - 619, 617, 618, 221, 408, 103, 497, 500, - 504, 510, 515, 519, 525, 529, 537, 541, - 549, 554, 557, 559, 442, 443, 620, 621, - 622, 623, 624, 625, 221, 408, 103, 497, - 500, 504, 510, 515, 519, 525, 529, 537, - 541, 549, 554, 557, 559, 442, 443, 657, - 659, 662, 676, 685, 688, 693, 698, 708, - 711, 736, 740, 755, 756, 221, 408, 103, - 121, 123, 126, 131, 135, 138, 143, 146, - 153, 156, 163, 167, 169, 170, 442, 443, - 221, 408, 103, 121, 123, 126, 131, 135, - 138, 143, 146, 153, 156, 163, 167, 169, - 170, 442, 443, 221, 408, 103, 121, 123, + 34, 36, 37, 38, 39, 387, 41, 388, + 43, 44, 389, 46, 390, 48, 49, 391, + 394, 404, 52, 53, 54, 395, 56, 65, + 68, 396, 69, 71, 57, 58, 59, 60, + 61, 63, 64, 398, 66, 67, 399, 400, + 70, 401, 402, 73, 74, 75, 76, 403, + 78, 405, 406, 81, 407, 83, 408, 410, + 86, 411, 88, 412, 90, 413, 92, 93, + 414, 96, 97, 415, 99, 100, 101, 416, + 417, 232, 420, 105, 106, 107, 448, 109, + 110, 111, 112, 114, 450, 451, 115, 116, + 117, 118, 120, 452, 122, 653, 124, 125, + 654, 127, 222, 128, 129, 130, 655, 684, + 132, 217, 133, 134, 656, 136, 137, 657, + 139, 140, 141, 142, 658, 144, 215, 145, + 659, 682, 147, 148, 149, 150, 151, 152, + 212, 660, 154, 155, 661, 157, 199, 162, + 158, 195, 676, 159, 160, 161, 662, 164, + 165, 166, 663, 168, 171, 182, 184, 664, + 665, 666, 667, 172, 179, 173, 174, 175, + 176, 177, 178, 668, 180, 181, 669, 183, + 670, 185, 186, 187, 188, 189, 193, 671, + 190, 192, 191, 672, 673, 194, 674, 675, + 197, 198, 677, 200, 201, 202, 203, 204, + 205, 208, 678, 206, 207, 679, 209, 210, + 211, 680, 213, 214, 681, 216, 683, 218, + 219, 220, 221, 223, 225, 224, 685, 226, + 227, 228, 229, 230, 686, 798, 232, 233, + 1, 4, 102, 231, 232, 234, 232, 234, + 232, 235, 236, 232, 236, 232, 238, 239, + 377, 5, 379, 380, 382, 383, 23, 386, + 40, 45, 392, 393, 55, 397, 232, 238, + 240, 241, 255, 256, 259, 260, 266, 279, + 286, 293, 300, 301, 309, 317, 232, 240, + 241, 255, 256, 259, 260, 266, 279, 286, + 293, 300, 301, 309, 368, 376, 242, 367, + 243, 244, 245, 246, 247, 248, 249, 363, + 250, 251, 252, 253, 254, 232, 240, 241, + 255, 256, 259, 260, 266, 279, 286, 293, + 300, 301, 309, 317, 232, 240, 241, 255, + 256, 259, 260, 266, 279, 286, 293, 300, + 301, 309, 357, 360, 317, 232, 240, 257, + 255, 256, 259, 260, 266, 279, 286, 293, + 300, 301, 309, 317, 345, 258, 232, 240, + 241, 255, 256, 259, 260, 266, 279, 286, + 293, 300, 301, 309, 317, 232, 240, 241, + 255, 256, 259, 260, 354, 266, 279, 286, + 293, 300, 301, 309, 317, 232, 261, 241, + 255, 348, 259, 260, 266, 279, 351, 293, + 300, 301, 309, 265, 317, 262, 263, 264, + 232, 240, 241, 255, 256, 259, 260, 266, + 279, 286, 293, 300, 301, 309, 317, 267, + 278, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 232, 240, 241, 255, 256, + 259, 260, 266, 279, 286, 293, 300, 301, + 309, 317, 232, 240, 241, 255, 280, 259, + 260, 266, 279, 286, 293, 300, 301, 309, + 317, 281, 282, 283, 284, 285, 256, 287, + 288, 232, 240, 241, 255, 256, 259, 260, + 289, 266, 279, 286, 293, 300, 301, 309, + 317, 290, 291, 292, 294, 295, 232, 240, + 241, 255, 256, 259, 260, 296, 279, 286, + 293, 300, 301, 309, 317, 297, 298, 299, + 266, 241, 232, 240, 241, 255, 302, 259, + 260, 266, 279, 286, 293, 300, 301, 309, + 343, 317, 303, 339, 232, 240, 241, 255, + 256, 259, 260, 304, 266, 279, 286, 293, + 300, 301, 309, 317, 305, 306, 307, 308, + 310, 322, 326, 316, 328, 331, 311, 312, + 313, 314, 315, 232, 240, 241, 255, 256, + 259, 260, 266, 279, 286, 293, 300, 301, + 309, 317, 232, 240, 241, 255, 256, 259, + 260, 318, 266, 279, 286, 293, 300, 301, + 309, 317, 319, 320, 321, 323, 324, 325, + 232, 240, 241, 255, 256, 259, 260, 266, + 279, 286, 293, 300, 301, 309, 317, 327, + 232, 240, 241, 255, 256, 259, 260, 266, + 279, 286, 293, 300, 301, 309, 317, 329, + 330, 232, 240, 241, 255, 256, 259, 260, + 266, 279, 286, 293, 300, 301, 309, 317, + 332, 232, 240, 241, 255, 256, 259, 260, + 266, 279, 286, 293, 300, 301, 333, 317, + 334, 335, 336, 337, 338, 309, 232, 240, + 241, 255, 256, 259, 260, 266, 279, 286, + 293, 300, 301, 309, 340, 317, 341, 342, + 344, 256, 346, 347, 349, 350, 240, 256, + 286, 232, 240, 241, 255, 256, 259, 260, + 352, 279, 286, 293, 300, 301, 309, 317, + 353, 266, 355, 356, 358, 359, 232, 240, + 241, 255, 256, 259, 260, 266, 279, 286, + 293, 300, 301, 309, 317, 361, 362, 364, + 365, 366, 232, 240, 241, 255, 256, 259, + 260, 266, 279, 286, 293, 300, 301, 309, + 317, 369, 370, 371, 372, 373, 374, 375, + 232, 240, 241, 255, 256, 259, 260, 266, + 279, 286, 293, 300, 301, 309, 317, 232, + 377, 5, 379, 380, 382, 383, 23, 386, + 40, 45, 392, 393, 55, 95, 232, 377, + 5, 379, 380, 382, 383, 23, 386, 40, + 45, 392, 393, 55, 397, 232, 377, 5, + 379, 380, 382, 383, 23, 386, 40, 45, + 392, 393, 55, 87, 89, 397, 232, 377, + 18, 379, 380, 382, 383, 23, 386, 40, + 45, 392, 393, 55, 397, 80, 232, 377, + 5, 379, 380, 382, 383, 23, 386, 40, + 45, 392, 393, 55, 397, 232, 377, 5, + 379, 380, 382, 383, 85, 23, 386, 40, + 45, 392, 393, 55, 397, 232, 19, 5, + 379, 82, 382, 383, 23, 386, 409, 45, + 392, 393, 55, 397, 232, 377, 5, 379, + 380, 382, 383, 23, 386, 40, 45, 392, + 393, 55, 397, 232, 377, 5, 379, 380, + 382, 383, 23, 386, 40, 45, 392, 393, + 55, 397, 232, 377, 5, 379, 35, 382, + 383, 23, 386, 40, 45, 392, 393, 55, + 397, 380, 232, 377, 5, 379, 380, 382, + 383, 42, 23, 386, 40, 45, 392, 393, + 55, 397, 232, 377, 5, 379, 380, 382, + 383, 47, 386, 40, 45, 392, 393, 55, + 397, 23, 5, 232, 377, 5, 379, 50, + 382, 383, 23, 386, 40, 45, 392, 393, + 55, 79, 397, 232, 377, 5, 379, 380, + 382, 383, 51, 23, 386, 40, 45, 392, + 393, 55, 397, 232, 377, 5, 379, 380, + 382, 383, 23, 386, 40, 45, 392, 393, + 55, 397, 232, 377, 5, 379, 380, 382, + 383, 62, 23, 386, 40, 45, 392, 393, + 55, 397, 232, 377, 5, 379, 380, 382, + 383, 23, 386, 40, 45, 392, 393, 55, + 397, 232, 377, 5, 379, 380, 382, 383, + 23, 386, 40, 45, 392, 393, 55, 397, + 232, 377, 5, 379, 380, 382, 383, 23, + 386, 40, 45, 392, 393, 55, 397, 232, + 377, 5, 379, 380, 382, 383, 23, 386, + 40, 45, 392, 393, 72, 397, 55, 232, + 377, 5, 379, 380, 382, 383, 23, 386, + 40, 45, 392, 393, 55, 77, 397, 380, + 377, 380, 40, 232, 377, 5, 379, 380, + 382, 383, 84, 386, 40, 45, 392, 393, + 55, 397, 23, 232, 377, 5, 379, 380, + 382, 383, 23, 386, 40, 45, 392, 393, + 55, 397, 232, 377, 5, 379, 380, 382, + 383, 23, 386, 40, 45, 392, 393, 55, + 397, 98, 232, 377, 5, 379, 380, 382, + 383, 23, 386, 40, 45, 392, 393, 55, + 397, 232, 418, 419, 507, 103, 121, 123, 126, 131, 135, 138, 143, 146, 153, 156, - 163, 167, 169, 170, 442, 443, 221, 408, - 103, 121, 123, 126, 131, 135, 138, 143, - 146, 153, 156, 163, 167, 169, 170, 442, - 443, 221, 408, 103, 121, 123, 126, 131, - 135, 138, 143, 146, 153, 156, 163, 167, - 169, 170, 442, 443, 221, 408, 103, 121, - 123, 126, 131, 135, 138, 143, 146, 153, - 156, 163, 167, 169, 170, 442, 443, 221, - 408, 103, 121, 123, 126, 131, 135, 138, + 163, 167, 169, 170, 453, 652, 454, 232, + 418, 419, 103, 453, 454, 232, 419, 103, + 453, 454, 232, 421, 422, 423, 447, 449, + 113, 232, 421, 422, 232, 422, 424, 430, + 436, 232, 422, 424, 425, 430, 436, 426, + 427, 428, 429, 431, 432, 433, 434, 435, + 437, 442, 443, 438, 439, 440, 441, 232, + 422, 424, 430, 436, 232, 422, 444, 430, + 436, 445, 446, 424, 232, 422, 447, 104, + 449, 113, 108, 232, 422, 447, 449, 113, + 232, 422, 119, 449, 113, 447, 232, 103, + 453, 454, 420, 455, 232, 423, 456, 458, + 460, 484, 490, 496, 232, 457, 456, 458, + 459, 423, 458, 423, 460, 461, 467, 473, + 232, 458, 461, 462, 467, 473, 463, 464, + 465, 466, 468, 469, 470, 471, 472, 474, + 479, 480, 475, 476, 477, 478, 232, 458, + 461, 467, 473, 232, 458, 481, 467, 473, + 482, 483, 461, 232, 458, 484, 485, 490, + 496, 486, 487, 488, 489, 491, 492, 493, + 494, 495, 497, 502, 503, 498, 499, 500, + 501, 232, 458, 484, 490, 496, 232, 458, + 504, 490, 496, 505, 506, 484, 508, 511, + 515, 521, 526, 530, 536, 540, 548, 552, + 560, 565, 568, 570, 509, 510, 232, 419, + 103, 508, 511, 515, 521, 526, 530, 536, + 540, 548, 552, 560, 565, 568, 570, 453, + 454, 512, 513, 514, 232, 419, 103, 508, + 511, 515, 521, 526, 530, 536, 540, 548, + 552, 560, 565, 568, 570, 453, 454, 516, + 641, 517, 518, 519, 520, 640, 232, 419, + 103, 508, 511, 515, 521, 526, 530, 536, + 540, 548, 552, 560, 565, 568, 570, 453, + 454, 522, 635, 523, 524, 525, 232, 419, + 103, 508, 511, 515, 521, 526, 530, 536, + 540, 548, 552, 560, 565, 568, 570, 453, + 454, 527, 528, 529, 232, 419, 103, 508, + 511, 515, 521, 526, 530, 536, 540, 548, + 552, 560, 565, 568, 570, 453, 454, 531, + 532, 533, 534, 535, 232, 419, 103, 508, + 511, 515, 521, 526, 530, 536, 540, 548, + 552, 560, 565, 568, 570, 453, 454, 537, + 632, 538, 539, 631, 232, 419, 103, 508, + 511, 515, 521, 526, 530, 536, 540, 548, + 552, 560, 565, 568, 570, 453, 454, 541, + 542, 543, 544, 545, 546, 627, 547, 232, + 419, 103, 508, 511, 515, 521, 526, 530, + 536, 540, 548, 552, 560, 565, 568, 570, + 453, 454, 549, 550, 551, 232, 419, 103, + 508, 511, 515, 521, 526, 530, 536, 540, + 548, 552, 560, 565, 568, 570, 453, 454, + 553, 611, 558, 554, 604, 606, 555, 556, + 557, 559, 232, 419, 103, 508, 511, 515, + 521, 526, 530, 536, 540, 548, 552, 560, + 565, 568, 570, 453, 454, 561, 562, 563, + 564, 232, 419, 103, 508, 511, 515, 521, + 526, 530, 536, 540, 548, 552, 560, 565, + 568, 570, 453, 454, 566, 572, 586, 589, + 567, 232, 419, 103, 508, 511, 515, 521, + 526, 530, 536, 540, 548, 552, 560, 565, + 568, 570, 453, 454, 569, 232, 419, 103, + 508, 511, 515, 521, 526, 530, 536, 540, + 548, 552, 560, 565, 568, 570, 453, 454, + 571, 232, 419, 103, 508, 511, 515, 521, + 526, 530, 536, 540, 548, 552, 560, 565, + 568, 570, 453, 454, 573, 574, 582, 232, + 419, 103, 508, 511, 515, 521, 526, 530, + 536, 540, 548, 552, 560, 565, 568, 570, + 453, 454, 575, 576, 577, 578, 579, 580, + 581, 232, 419, 103, 508, 511, 515, 521, + 526, 530, 536, 540, 548, 552, 560, 565, + 568, 570, 453, 454, 583, 584, 585, 232, + 419, 103, 508, 511, 515, 521, 526, 530, + 536, 540, 548, 552, 560, 565, 568, 570, + 453, 454, 587, 588, 232, 419, 103, 508, + 511, 515, 521, 526, 530, 536, 540, 548, + 552, 560, 565, 568, 570, 453, 454, 590, + 591, 592, 593, 595, 601, 594, 232, 419, + 103, 508, 511, 515, 521, 526, 530, 536, + 540, 548, 552, 560, 565, 568, 570, 453, + 454, 596, 599, 597, 598, 232, 419, 103, + 508, 511, 515, 521, 526, 530, 536, 540, + 548, 552, 560, 565, 568, 570, 453, 454, + 600, 232, 419, 103, 508, 511, 515, 521, + 526, 530, 536, 540, 548, 552, 560, 565, + 568, 570, 453, 454, 602, 603, 232, 419, + 103, 508, 511, 515, 521, 526, 530, 536, + 540, 548, 552, 560, 565, 568, 570, 453, + 454, 605, 232, 419, 103, 508, 511, 515, + 521, 526, 530, 536, 540, 548, 552, 560, + 565, 568, 570, 453, 454, 232, 419, 103, + 508, 511, 515, 521, 526, 530, 536, 607, + 548, 552, 560, 565, 568, 570, 453, 454, + 608, 609, 610, 540, 612, 613, 614, 615, + 616, 618, 622, 617, 232, 419, 103, 508, + 511, 515, 521, 526, 530, 536, 540, 548, + 552, 560, 565, 568, 570, 453, 454, 619, + 620, 621, 232, 419, 103, 508, 511, 515, + 521, 526, 530, 536, 540, 548, 552, 560, + 565, 568, 570, 453, 454, 623, 624, 625, + 626, 232, 419, 103, 508, 511, 515, 521, + 526, 530, 536, 540, 548, 552, 560, 565, + 568, 570, 453, 454, 628, 629, 630, 232, + 419, 103, 508, 511, 515, 521, 526, 530, + 536, 540, 548, 552, 560, 565, 568, 570, + 453, 454, 232, 419, 103, 508, 511, 515, + 521, 526, 530, 536, 540, 548, 552, 560, + 565, 568, 570, 453, 454, 633, 634, 232, + 419, 103, 508, 511, 515, 521, 526, 530, + 536, 540, 548, 552, 560, 565, 568, 570, + 453, 454, 636, 637, 638, 639, 232, 419, + 103, 508, 511, 515, 521, 526, 530, 536, + 540, 548, 552, 560, 565, 568, 570, 453, + 454, 642, 645, 643, 644, 232, 419, 103, + 508, 511, 515, 521, 526, 530, 536, 540, + 548, 552, 560, 565, 568, 570, 453, 454, + 646, 647, 648, 649, 650, 651, 232, 419, + 103, 508, 511, 515, 521, 526, 530, 536, + 540, 548, 552, 560, 565, 568, 570, 453, + 454, 687, 689, 692, 706, 715, 718, 723, + 728, 738, 741, 766, 770, 796, 797, 232, + 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, 153, 156, 163, 167, 169, 170, - 442, 443, 221, 408, 103, 121, 123, 126, + 453, 454, 232, 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, 153, 156, 163, - 167, 169, 170, 442, 443, 221, 408, 103, + 167, 169, 170, 453, 454, 232, 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, - 153, 156, 163, 167, 169, 170, 442, 443, - 221, 408, 103, 121, 123, 126, 131, 135, + 153, 156, 163, 167, 169, 170, 453, 454, + 232, 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, 153, 156, 163, 167, 169, - 170, 442, 443, 221, 408, 103, 121, 123, + 170, 453, 454, 232, 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, 153, 156, - 163, 167, 169, 170, 442, 443, 221, 408, + 163, 167, 169, 170, 453, 454, 232, 419, 103, 121, 123, 126, 131, 135, 138, 143, - 146, 153, 156, 163, 167, 169, 170, 442, - 443, 221, 408, 103, 121, 123, 126, 131, + 146, 153, 156, 163, 167, 169, 170, 453, + 454, 232, 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, 153, 156, 163, 167, - 169, 170, 442, 443, 221, 408, 103, 121, + 169, 170, 453, 454, 232, 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, 153, - 156, 163, 167, 169, 170, 442, 443, 221, - 408, 103, 121, 123, 126, 131, 135, 138, + 156, 163, 167, 169, 170, 453, 454, 232, + 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, 153, 156, 163, 167, 169, 170, - 442, 443, 221, 408, 103, 121, 123, 126, + 453, 454, 232, 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, 153, 156, 163, - 167, 169, 170, 442, 443, 221, 408, 103, + 167, 169, 170, 453, 454, 232, 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, - 153, 156, 163, 167, 169, 170, 442, 443, - 221, 408, 103, 121, 123, 126, 131, 135, + 153, 156, 163, 167, 169, 170, 453, 454, + 232, 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, 153, 156, 163, 167, 169, - 170, 442, 443, 221, 408, 103, 121, 123, + 170, 453, 454, 232, 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, 153, 156, - 163, 167, 169, 170, 442, 443, 221, 408, + 163, 167, 169, 170, 453, 454, 232, 419, 103, 121, 123, 126, 131, 135, 138, 143, - 185, 153, 156, 163, 167, 169, 170, 442, - 443, 146, 221, 408, 103, 121, 123, 126, - 131, 135, 138, 143, 146, 153, 156, 163, - 167, 169, 170, 442, 443, 221, 408, 103, - 121, 123, 126, 131, 135, 138, 143, 146, - 153, 156, 163, 167, 169, 170, 442, 443, - 221, 408, 103, 121, 123, 126, 131, 135, - 138, 143, 146, 153, 156, 163, 167, 169, - 170, 442, 443, 221, 408, 103, 121, 123, - 126, 131, 135, 138, 143, 146, 153, 156, - 163, 167, 169, 170, 442, 443, 221, 408, - 103, 121, 123, 126, 131, 135, 138, 143, - 146, 153, 156, 163, 167, 169, 170, 442, - 443, 221, 408, 103, 121, 123, 126, 131, + 146, 153, 156, 163, 167, 169, 170, 453, + 454, 232, 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, 153, 156, 163, 167, - 169, 170, 442, 443, 221, 408, 103, 121, + 169, 170, 453, 454, 232, 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, 153, - 156, 163, 167, 169, 170, 442, 443, 221, - 408, 103, 121, 123, 126, 131, 135, 138, + 156, 163, 167, 169, 170, 453, 454, 232, + 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, 153, 156, 163, 167, 169, 170, - 442, 443, 221, 408, 103, 121, 123, 126, + 453, 454, 232, 419, 103, 121, 123, 126, 131, 135, 138, 143, 146, 153, 156, 163, - 167, 169, 170, 442, 443, 658, 660, 661, - 663, 667, 664, 665, 666, 668, 670, 669, - 671, 672, 673, 674, 675, 677, 680, 678, - 679, 681, 682, 683, 684, 686, 687, 689, - 690, 691, 692, 694, 696, 695, 697, 699, - 700, 701, 702, 703, 704, 705, 706, 707, - 709, 710, 712, 723, 717, 713, 718, 719, - 714, 715, 716, 720, 721, 722, 724, 725, - 726, 727, 728, 729, 732, 730, 731, 733, - 734, 735, 737, 738, 739, 741, 742, 753, - 743, 750, 744, 745, 746, 747, 748, 749, - 751, 752, 754, 221, 758, 221, 759, 221, - 221, 759 + 167, 169, 170, 453, 454, 232, 419, 103, + 121, 123, 126, 131, 135, 138, 143, 146, + 153, 156, 163, 167, 169, 170, 453, 454, + 232, 419, 103, 121, 123, 126, 131, 135, + 138, 143, 146, 153, 156, 163, 167, 169, + 170, 453, 454, 232, 419, 103, 121, 123, + 126, 131, 135, 138, 143, 146, 153, 156, + 163, 167, 169, 170, 453, 454, 232, 419, + 103, 121, 123, 126, 131, 135, 138, 143, + 146, 153, 156, 163, 167, 169, 170, 453, + 454, 232, 419, 103, 121, 123, 126, 131, + 135, 138, 143, 146, 153, 156, 163, 167, + 169, 170, 453, 454, 232, 419, 103, 121, + 123, 126, 131, 135, 138, 143, 196, 153, + 156, 163, 167, 169, 170, 453, 454, 146, + 232, 419, 103, 121, 123, 126, 131, 135, + 138, 143, 146, 153, 156, 163, 167, 169, + 170, 453, 454, 232, 419, 103, 121, 123, + 126, 131, 135, 138, 143, 146, 153, 156, + 163, 167, 169, 170, 453, 454, 232, 419, + 103, 121, 123, 126, 131, 135, 138, 143, + 146, 153, 156, 163, 167, 169, 170, 453, + 454, 232, 419, 103, 121, 123, 126, 131, + 135, 138, 143, 146, 153, 156, 163, 167, + 169, 170, 453, 454, 232, 419, 103, 121, + 123, 126, 131, 135, 138, 143, 146, 153, + 156, 163, 167, 169, 170, 453, 454, 232, + 419, 103, 121, 123, 126, 131, 135, 138, + 143, 146, 153, 156, 163, 167, 169, 170, + 453, 454, 232, 419, 103, 121, 123, 126, + 131, 135, 138, 143, 146, 153, 156, 163, + 167, 169, 170, 453, 454, 232, 419, 103, + 121, 123, 126, 131, 135, 138, 143, 146, + 153, 156, 163, 167, 169, 170, 453, 454, + 232, 419, 103, 121, 123, 126, 131, 135, + 138, 143, 146, 153, 156, 163, 167, 169, + 170, 453, 454, 688, 690, 691, 693, 697, + 694, 695, 696, 698, 700, 699, 701, 702, + 703, 704, 705, 707, 710, 708, 709, 711, + 712, 713, 714, 716, 717, 719, 720, 721, + 722, 724, 726, 725, 727, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 739, 740, + 742, 753, 747, 743, 748, 749, 744, 745, + 746, 750, 751, 752, 754, 755, 756, 757, + 758, 759, 762, 760, 761, 763, 764, 765, + 767, 768, 769, 771, 772, 783, 785, 773, + 780, 774, 775, 776, 777, 778, 779, 781, + 782, 784, 786, 787, 788, 789, 790, 794, + 791, 793, 792, 795, 232, 799, 232, 800, + 232, 232, 800 }; static const short _demo_machine_parser_cmd_trans_actions[] = { - 0, 0, 452, 156, 156, 5, 0, 127, - 131, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 127, - 127, 0, 0, 0, 127, 0, 127, 0, + 0, 0, 472, 164, 164, 5, 0, 135, + 139, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 135, + 135, 0, 0, 0, 135, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 127, 0, 127, - 0, 0, 127, 0, 127, 0, 0, 127, - 127, 127, 0, 0, 0, 127, 0, 0, - 0, 127, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 127, 0, 0, 127, 127, - 0, 127, 127, 0, 0, 0, 0, 127, - 0, 127, 127, 0, 127, 0, 127, 127, - 0, 127, 0, 127, 0, 127, 0, 0, - 127, 0, 0, 127, 0, 0, 0, 127, - 127, 133, 127, 0, 0, 0, 127, 0, - 0, 0, 0, 0, 127, 127, 0, 0, - 0, 0, 0, 127, 0, 127, 0, 0, - 127, 0, 0, 0, 0, 0, 127, 127, - 0, 0, 0, 0, 127, 0, 0, 127, - 0, 0, 0, 0, 127, 0, 0, 0, - 127, 127, 0, 0, 0, 0, 0, 0, - 0, 127, 0, 0, 127, 0, 0, 0, - 0, 0, 127, 0, 0, 0, 127, 0, - 0, 0, 127, 0, 0, 0, 127, 127, - 127, 127, 0, 0, 0, 0, 0, 0, - 0, 0, 127, 0, 0, 127, 0, 127, - 127, 0, 0, 127, 0, 0, 0, 0, - 0, 0, 0, 127, 0, 0, 127, 0, - 0, 0, 127, 0, 0, 127, 0, 127, - 0, 0, 0, 0, 0, 0, 0, 127, - 0, 0, 0, 0, 0, 127, 0, 129, - 0, 0, 0, 0, 0, 440, 1, 159, - 0, 957, 0, 1, 456, 0, 444, 1, - 1, 127, 0, 127, 127, 127, 127, 0, - 127, 0, 0, 127, 127, 0, 127, 162, + 0, 0, 0, 0, 0, 135, 0, 135, + 0, 0, 135, 0, 135, 0, 0, 135, + 135, 135, 0, 0, 0, 135, 0, 0, + 0, 135, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 135, 0, 0, 135, 135, + 0, 135, 135, 0, 0, 0, 0, 135, + 0, 135, 135, 0, 135, 0, 135, 135, + 0, 135, 0, 135, 0, 135, 0, 0, + 135, 0, 0, 135, 0, 0, 0, 135, + 135, 141, 135, 0, 0, 0, 135, 0, + 0, 0, 0, 0, 135, 135, 0, 0, + 0, 0, 0, 135, 0, 135, 0, 0, + 135, 0, 0, 0, 0, 0, 135, 135, + 0, 0, 0, 0, 135, 0, 0, 135, + 0, 0, 0, 0, 135, 0, 0, 0, + 135, 135, 0, 0, 0, 0, 0, 0, + 0, 135, 0, 0, 135, 0, 0, 0, + 0, 0, 135, 0, 0, 0, 135, 0, + 0, 0, 135, 0, 0, 0, 0, 135, + 135, 135, 135, 0, 0, 0, 0, 0, + 0, 0, 0, 135, 0, 0, 135, 0, + 135, 0, 0, 0, 0, 0, 0, 135, + 0, 0, 0, 135, 135, 0, 135, 135, + 0, 0, 135, 0, 0, 0, 0, 0, + 0, 0, 135, 0, 0, 135, 0, 0, + 0, 135, 0, 0, 135, 0, 135, 0, + 0, 0, 0, 0, 0, 0, 135, 0, + 0, 0, 0, 0, 135, 0, 137, 0, + 0, 0, 0, 0, 460, 1, 167, 0, + 1025, 0, 1, 476, 0, 464, 1, 1, + 135, 0, 135, 135, 135, 135, 0, 135, + 0, 0, 135, 135, 0, 135, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 468, + 0, 0, 0, 0, 0, 0, 488, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 476, 13, + 0, 0, 0, 0, 0, 496, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 488, 19, 19, + 13, 13, 13, 13, 508, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 0, 0, 19, 496, 23, - 0, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 0, 0, 492, + 19, 19, 0, 0, 19, 516, 23, 0, + 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 0, 0, 512, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 500, 25, - 25, 25, 25, 25, 25, 0, 25, 25, - 25, 25, 25, 25, 25, 25, 508, 0, - 29, 29, 0, 29, 29, 29, 29, 0, - 29, 29, 29, 29, 0, 29, 0, 0, - 0, 504, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, + 21, 21, 21, 21, 21, 520, 25, 25, + 25, 25, 25, 25, 0, 25, 25, 25, + 25, 25, 25, 25, 25, 528, 0, 29, + 29, 0, 29, 29, 29, 29, 0, 29, + 29, 29, 29, 0, 29, 0, 0, 0, + 524, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 516, 33, 33, 33, + 0, 0, 0, 536, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 520, 35, 35, 35, 0, + 33, 33, 540, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 0, 0, 0, 0, 0, 35, - 0, 0, 524, 37, 37, 37, 37, 37, - 37, 0, 37, 37, 37, 37, 37, 37, - 37, 37, 0, 0, 0, 0, 0, 528, - 39, 39, 39, 39, 39, 39, 0, 39, - 39, 39, 39, 39, 39, 39, 0, 0, - 0, 39, 23, 540, 45, 45, 45, 0, + 35, 0, 0, 0, 0, 0, 35, 0, + 0, 544, 37, 37, 37, 37, 37, 37, + 0, 37, 37, 37, 37, 37, 37, 37, + 37, 0, 0, 0, 0, 0, 548, 39, + 39, 39, 39, 39, 39, 0, 39, 39, + 39, 39, 39, 39, 39, 0, 0, 0, + 39, 23, 560, 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 0, 45, 0, 0, 532, 41, 41, - 41, 41, 41, 41, 0, 41, 41, 41, - 41, 41, 41, 41, 41, 0, 0, 0, + 0, 45, 0, 0, 552, 41, 41, 41, + 41, 41, 41, 0, 41, 41, 41, 41, + 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 544, 47, 47, 47, + 0, 0, 0, 564, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 564, 57, 57, 57, 57, - 57, 57, 0, 57, 57, 57, 57, 57, - 57, 57, 57, 0, 0, 0, 0, 0, - 0, 548, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, - 0, 552, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 0, 0, 556, 53, 53, 53, 53, 53, + 47, 47, 584, 57, 57, 57, 57, 57, + 57, 0, 57, 57, 57, 57, 57, 57, + 57, 57, 0, 0, 0, 0, 0, 0, + 568, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 0, + 572, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 0, + 0, 576, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, - 53, 0, 560, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 0, - 55, 0, 0, 0, 0, 0, 55, 536, + 0, 580, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 55, + 0, 0, 0, 0, 0, 55, 556, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 0, 43, 0, - 0, 0, 45, 0, 0, 0, 0, 29, - 29, 29, 512, 31, 31, 31, 31, 31, - 31, 0, 31, 31, 31, 31, 31, 31, - 31, 0, 31, 0, 0, 0, 0, 484, + 43, 43, 43, 43, 0, 43, 0, 0, + 0, 45, 0, 0, 0, 0, 29, 29, + 29, 532, 31, 31, 31, 31, 31, 31, + 0, 31, 31, 31, 31, 31, 31, 31, + 0, 31, 0, 0, 0, 0, 504, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 0, 0, - 0, 0, 0, 480, 15, 15, 15, 15, + 17, 17, 17, 17, 17, 0, 0, 0, + 0, 0, 500, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 0, 0, 0, 0, 0, 0, - 0, 472, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 165, 261, 9, 261, 261, 261, 261, 9, - 261, 9, 9, 261, 261, 9, 0, 171, - 267, 13, 267, 267, 267, 267, 13, 267, - 13, 13, 267, 267, 13, 267, 180, 276, - 19, 276, 276, 276, 276, 19, 276, 19, - 19, 276, 276, 19, 0, 0, 276, 186, - 282, 0, 282, 282, 282, 282, 23, 282, - 23, 23, 282, 282, 23, 282, 0, 183, - 279, 21, 279, 279, 279, 279, 21, 279, - 21, 21, 279, 279, 21, 279, 189, 285, - 25, 285, 285, 285, 285, 0, 25, 285, - 25, 25, 285, 285, 25, 285, 195, 0, - 29, 291, 0, 291, 291, 29, 291, 127, - 29, 291, 291, 29, 291, 192, 288, 27, - 288, 288, 288, 288, 27, 288, 27, 27, - 288, 288, 27, 288, 201, 297, 33, 297, - 297, 297, 297, 33, 297, 33, 33, 297, - 297, 33, 297, 204, 300, 35, 300, 0, - 300, 300, 35, 300, 35, 35, 300, 300, - 35, 300, 300, 207, 303, 37, 303, 303, - 303, 303, 0, 37, 303, 37, 37, 303, - 303, 37, 303, 210, 306, 39, 306, 306, - 306, 306, 0, 306, 39, 39, 306, 306, - 39, 306, 39, 23, 219, 315, 45, 315, - 0, 315, 315, 45, 315, 45, 45, 315, - 315, 45, 0, 315, 213, 309, 41, 309, - 309, 309, 309, 0, 41, 309, 41, 41, - 309, 309, 41, 309, 222, 318, 47, 318, - 318, 318, 318, 47, 318, 47, 47, 318, - 318, 47, 318, 237, 333, 57, 333, 333, - 333, 333, 0, 57, 333, 57, 57, 333, - 333, 57, 333, 225, 321, 49, 321, 321, - 321, 321, 49, 321, 49, 49, 321, 321, - 49, 321, 228, 324, 51, 324, 324, 324, - 324, 51, 324, 51, 51, 324, 324, 51, - 324, 231, 327, 53, 327, 327, 327, 327, - 53, 327, 53, 53, 327, 327, 53, 327, - 234, 330, 55, 330, 330, 330, 330, 55, - 330, 55, 55, 330, 330, 0, 330, 55, - 216, 312, 43, 312, 312, 312, 312, 43, - 312, 43, 43, 312, 312, 43, 0, 312, - 315, 291, 291, 29, 198, 294, 31, 294, - 294, 294, 294, 0, 294, 31, 31, 294, - 294, 31, 294, 31, 177, 273, 17, 273, - 273, 273, 273, 17, 273, 17, 17, 273, - 273, 17, 273, 174, 270, 15, 270, 270, - 270, 270, 15, 270, 15, 15, 270, 270, - 15, 270, 0, 168, 264, 11, 264, 264, - 264, 264, 11, 264, 11, 11, 264, 264, - 11, 264, 1506, 700, 1152, 700, 967, 141, - 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 1152, 1152, 967, - 1326, 127, 255, 460, 704, 460, 952, 127, - 135, 249, 135, 962, 1, 138, 1, 127, - 127, 0, 464, 0, 7, 144, 0, 0, - 0, 0, 1147, 246, 121, 0, 121, 121, + 15, 0, 0, 0, 0, 0, 0, 0, + 492, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 173, + 269, 9, 269, 269, 269, 269, 9, 269, + 9, 9, 269, 269, 9, 0, 179, 275, + 13, 275, 275, 275, 275, 13, 275, 13, + 13, 275, 275, 13, 275, 188, 284, 19, + 284, 284, 284, 284, 19, 284, 19, 19, + 284, 284, 19, 0, 0, 284, 194, 290, + 0, 290, 290, 290, 290, 23, 290, 23, + 23, 290, 290, 23, 290, 0, 191, 287, + 21, 287, 287, 287, 287, 21, 287, 21, + 21, 287, 287, 21, 287, 197, 293, 25, + 293, 293, 293, 293, 0, 25, 293, 25, + 25, 293, 293, 25, 293, 203, 0, 29, + 299, 0, 299, 299, 29, 299, 135, 29, + 299, 299, 29, 299, 200, 296, 27, 296, + 296, 296, 296, 27, 296, 27, 27, 296, + 296, 27, 296, 209, 305, 33, 305, 305, + 305, 305, 33, 305, 33, 33, 305, 305, + 33, 305, 212, 308, 35, 308, 0, 308, + 308, 35, 308, 35, 35, 308, 308, 35, + 308, 308, 215, 311, 37, 311, 311, 311, + 311, 0, 37, 311, 37, 37, 311, 311, + 37, 311, 218, 314, 39, 314, 314, 314, + 314, 0, 314, 39, 39, 314, 314, 39, + 314, 39, 23, 227, 323, 45, 323, 0, + 323, 323, 45, 323, 45, 45, 323, 323, + 45, 0, 323, 221, 317, 41, 317, 317, + 317, 317, 0, 41, 317, 41, 41, 317, + 317, 41, 317, 230, 326, 47, 326, 326, + 326, 326, 47, 326, 47, 47, 326, 326, + 47, 326, 245, 341, 57, 341, 341, 341, + 341, 0, 57, 341, 57, 57, 341, 341, + 57, 341, 233, 329, 49, 329, 329, 329, + 329, 49, 329, 49, 49, 329, 329, 49, + 329, 236, 332, 51, 332, 332, 332, 332, + 51, 332, 51, 51, 332, 332, 51, 332, + 239, 335, 53, 335, 335, 335, 335, 53, + 335, 53, 53, 335, 335, 53, 335, 242, + 338, 55, 338, 338, 338, 338, 55, 338, + 55, 55, 338, 338, 0, 338, 55, 224, + 320, 43, 320, 320, 320, 320, 43, 320, + 43, 43, 320, 320, 43, 0, 320, 323, + 299, 299, 29, 206, 302, 31, 302, 302, + 302, 302, 0, 302, 31, 31, 302, 302, + 31, 302, 31, 185, 281, 17, 281, 281, + 281, 281, 17, 281, 17, 17, 281, 281, + 17, 281, 182, 278, 15, 278, 278, 278, + 278, 15, 278, 15, 15, 278, 278, 15, + 278, 0, 176, 272, 11, 272, 272, 272, + 272, 11, 272, 11, 11, 272, 272, 11, + 272, 1638, 736, 1240, 736, 1035, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 1240, 1240, 1035, 1434, + 135, 263, 480, 740, 480, 1020, 135, 143, + 257, 143, 1030, 1, 146, 1, 135, 135, + 0, 484, 0, 7, 152, 0, 0, 0, + 0, 1235, 254, 129, 0, 129, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1230, + 251, 127, 127, 127, 1225, 248, 0, 125, + 125, 0, 0, 125, 728, 129, 449, 0, + 449, 129, 0, 724, 127, 446, 446, 127, + 720, 125, 0, 443, 125, 443, 468, 3, + 135, 3, 260, 260, 1410, 155, 1, 732, + 155, 135, 135, 135, 1040, 3, 0, 266, + 3, 0, 135, 3, 3, 0, 0, 0, + 1428, 1016, 129, 0, 129, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1142, 243, 119, 119, 119, 1137, 240, 0, - 117, 117, 0, 0, 117, 692, 121, 429, - 0, 429, 121, 0, 688, 119, 426, 426, - 119, 684, 117, 0, 423, 117, 423, 448, - 3, 127, 3, 252, 252, 1302, 147, 1, - 696, 147, 127, 127, 127, 972, 3, 0, - 258, 3, 0, 127, 3, 3, 0, 0, - 0, 1320, 948, 121, 0, 121, 121, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1314, - 944, 119, 119, 119, 1308, 940, 0, 117, - 117, 0, 0, 117, 987, 429, 429, 127, - 429, 429, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 982, 426, 426, 426, 426, 977, - 423, 127, 423, 423, 127, 127, 423, 700, - 700, 700, 700, 700, 700, 700, 700, 700, - 700, 700, 700, 700, 700, 127, 127, 1513, - 712, 992, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 336, - 1157, 992, 127, 127, 127, 1520, 720, 997, - 339, 339, 339, 339, 339, 339, 339, 339, - 339, 339, 339, 339, 339, 339, 1162, 997, - 127, 127, 127, 127, 127, 127, 127, 1527, - 728, 1002, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 1167, 1002, 127, 127, 127, 127, 127, 1555, - 760, 1022, 354, 354, 354, 354, 354, 354, - 354, 354, 354, 354, 354, 354, 354, 354, - 1187, 1022, 127, 127, 127, 1569, 776, 1032, - 360, 360, 360, 360, 360, 360, 360, 360, - 360, 360, 360, 360, 360, 360, 1197, 1032, - 127, 127, 127, 127, 127, 1576, 784, 1037, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 1202, 1037, - 127, 127, 127, 127, 127, 1583, 792, 1042, - 366, 366, 366, 366, 366, 366, 366, 366, - 366, 366, 366, 366, 366, 366, 1207, 1042, - 127, 127, 127, 127, 127, 127, 127, 127, - 1604, 816, 1057, 375, 375, 375, 375, 375, - 375, 375, 375, 375, 375, 375, 375, 375, - 375, 1222, 1057, 127, 127, 127, 1618, 832, - 1067, 381, 381, 381, 381, 381, 381, 381, - 381, 381, 381, 381, 381, 381, 381, 1232, - 1067, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 1625, 840, 1072, 384, 384, - 384, 384, 384, 384, 384, 384, 384, 384, - 384, 384, 384, 384, 1237, 1072, 127, 127, - 127, 127, 1667, 888, 1102, 402, 402, 402, - 402, 402, 402, 402, 402, 402, 402, 402, - 402, 402, 402, 1267, 1102, 127, 127, 127, - 127, 1674, 896, 1107, 405, 405, 405, 405, - 405, 405, 405, 405, 405, 405, 405, 405, - 405, 405, 1272, 1107, 127, 1709, 936, 1132, - 420, 420, 420, 420, 420, 420, 420, 420, - 420, 420, 420, 420, 420, 420, 1297, 1132, - 127, 1562, 768, 1027, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 1192, 1027, 127, 127, 127, 1681, - 904, 1112, 408, 408, 408, 408, 408, 408, - 408, 408, 408, 408, 408, 408, 408, 408, - 1277, 1112, 127, 127, 127, 127, 127, 127, - 127, 1688, 912, 1117, 411, 411, 411, 411, - 411, 411, 411, 411, 411, 411, 411, 411, - 411, 411, 1282, 1117, 127, 127, 127, 1695, - 920, 1122, 414, 414, 414, 414, 414, 414, - 414, 414, 414, 414, 414, 414, 414, 414, - 1287, 1122, 127, 127, 1702, 928, 1127, 417, - 417, 417, 417, 417, 417, 417, 417, 417, - 417, 417, 417, 417, 417, 1292, 1127, 127, - 1632, 848, 1077, 387, 387, 387, 387, 387, - 387, 387, 387, 387, 387, 387, 387, 387, - 387, 1242, 1077, 1639, 856, 1082, 390, 390, - 390, 390, 390, 390, 390, 127, 390, 390, - 390, 390, 390, 390, 1247, 1082, 127, 127, - 127, 390, 127, 127, 127, 127, 127, 127, - 127, 127, 1646, 864, 1087, 393, 393, 393, - 393, 393, 393, 393, 393, 393, 393, 393, - 393, 393, 393, 1252, 1087, 127, 127, 127, - 1653, 872, 1092, 396, 396, 396, 396, 396, - 396, 396, 396, 396, 396, 396, 396, 396, - 396, 1257, 1092, 127, 127, 127, 127, 1660, - 880, 1097, 399, 399, 399, 399, 399, 399, - 399, 399, 399, 399, 399, 399, 399, 399, - 1262, 1097, 127, 127, 127, 1611, 824, 1062, - 378, 378, 378, 378, 378, 378, 378, 378, - 378, 378, 378, 378, 378, 378, 1227, 1062, - 1590, 800, 1047, 369, 369, 369, 369, 369, - 369, 369, 369, 369, 369, 369, 369, 369, - 369, 1212, 1047, 127, 127, 1597, 808, 1052, - 372, 372, 372, 372, 372, 372, 372, 372, - 372, 372, 372, 372, 372, 372, 1217, 1052, - 127, 127, 127, 127, 1534, 736, 1007, 345, - 345, 345, 345, 345, 345, 345, 345, 345, - 345, 345, 345, 345, 345, 1172, 1007, 127, - 127, 127, 127, 1541, 744, 1012, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 348, 1177, 1012, 127, 127, - 127, 127, 127, 127, 1548, 752, 1017, 351, - 351, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 1182, 1017, 700, - 700, 700, 700, 700, 700, 700, 700, 700, - 700, 700, 700, 700, 700, 1332, 336, 568, + 0, 0, 0, 0, 0, 0, 1422, 1012, + 127, 127, 127, 1416, 1008, 0, 125, 125, + 0, 0, 125, 1055, 449, 449, 135, 449, + 449, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 1050, 446, 446, 446, 446, 1045, 443, + 135, 443, 443, 135, 135, 443, 736, 736, + 736, 736, 736, 736, 736, 736, 736, 736, + 736, 736, 736, 736, 135, 135, 1645, 748, + 1060, 344, 344, 344, 344, 344, 344, 344, + 344, 344, 344, 344, 344, 344, 344, 1245, + 1060, 135, 135, 135, 1652, 756, 1065, 347, + 347, 347, 347, 347, 347, 347, 347, 347, + 347, 347, 347, 347, 347, 1250, 1065, 135, + 135, 135, 135, 135, 135, 135, 1659, 764, + 1070, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 1255, + 1070, 135, 135, 135, 135, 135, 1687, 796, + 1090, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 1275, + 1090, 135, 135, 135, 1701, 812, 1100, 368, + 368, 368, 368, 368, 368, 368, 368, 368, + 368, 368, 368, 368, 368, 1285, 1100, 135, + 135, 135, 135, 135, 1708, 820, 1105, 371, + 371, 371, 371, 371, 371, 371, 371, 371, + 371, 371, 371, 371, 371, 1290, 1105, 135, + 135, 135, 135, 135, 1715, 828, 1110, 374, + 374, 374, 374, 374, 374, 374, 374, 374, + 374, 374, 374, 374, 374, 1295, 1110, 135, + 135, 135, 135, 135, 135, 135, 135, 1736, + 852, 1125, 383, 383, 383, 383, 383, 383, + 383, 383, 383, 383, 383, 383, 383, 383, + 1310, 1125, 135, 135, 135, 1750, 868, 1135, + 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 1320, 1135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 1757, 876, 1140, 392, 392, 392, + 392, 392, 392, 392, 392, 392, 392, 392, + 392, 392, 392, 1325, 1140, 135, 135, 135, + 135, 1799, 924, 1170, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 1355, 1170, 135, 135, 135, 135, + 135, 1806, 932, 1175, 413, 413, 413, 413, + 413, 413, 413, 413, 413, 413, 413, 413, + 413, 413, 1360, 1175, 135, 1869, 1004, 1220, + 440, 440, 440, 440, 440, 440, 440, 440, + 440, 440, 440, 440, 440, 440, 1405, 1220, + 135, 1694, 804, 1095, 365, 365, 365, 365, + 365, 365, 365, 365, 365, 365, 365, 365, + 365, 365, 1280, 1095, 135, 135, 135, 1813, + 940, 1180, 416, 416, 416, 416, 416, 416, + 416, 416, 416, 416, 416, 416, 416, 416, + 1365, 1180, 135, 135, 135, 135, 135, 135, + 135, 1820, 948, 1185, 419, 419, 419, 419, + 419, 419, 419, 419, 419, 419, 419, 419, + 419, 419, 1370, 1185, 135, 135, 135, 1827, + 956, 1190, 422, 422, 422, 422, 422, 422, + 422, 422, 422, 422, 422, 422, 422, 422, + 1375, 1190, 135, 135, 1834, 964, 1195, 425, + 425, 425, 425, 425, 425, 425, 425, 425, + 425, 425, 425, 425, 425, 1380, 1195, 135, + 135, 135, 135, 135, 135, 135, 1841, 972, + 1200, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 1385, + 1200, 135, 135, 135, 135, 1855, 988, 1210, + 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 1395, 1210, + 135, 1848, 980, 1205, 431, 431, 431, 431, + 431, 431, 431, 431, 431, 431, 431, 431, + 431, 431, 1390, 1205, 135, 135, 1862, 996, + 1215, 437, 437, 437, 437, 437, 437, 437, + 437, 437, 437, 437, 437, 437, 437, 1400, + 1215, 135, 1764, 884, 1145, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 1330, 1145, 1771, 892, 1150, + 398, 398, 398, 398, 398, 398, 398, 135, + 398, 398, 398, 398, 398, 398, 1335, 1150, + 135, 135, 135, 398, 135, 135, 135, 135, + 135, 135, 135, 135, 1778, 900, 1155, 401, + 401, 401, 401, 401, 401, 401, 401, 401, + 401, 401, 401, 401, 401, 1340, 1155, 135, + 135, 135, 1785, 908, 1160, 404, 404, 404, + 404, 404, 404, 404, 404, 404, 404, 404, + 404, 404, 404, 1345, 1160, 135, 135, 135, + 135, 1792, 916, 1165, 407, 407, 407, 407, + 407, 407, 407, 407, 407, 407, 407, 407, + 407, 407, 1350, 1165, 135, 135, 135, 1743, + 860, 1130, 386, 386, 386, 386, 386, 386, + 386, 386, 386, 386, 386, 386, 386, 386, + 1315, 1130, 1722, 836, 1115, 377, 377, 377, + 377, 377, 377, 377, 377, 377, 377, 377, + 377, 377, 377, 1300, 1115, 135, 135, 1729, + 844, 1120, 380, 380, 380, 380, 380, 380, + 380, 380, 380, 380, 380, 380, 380, 380, + 1305, 1120, 135, 135, 135, 135, 1666, 772, + 1075, 353, 353, 353, 353, 353, 353, 353, + 353, 353, 353, 353, 353, 353, 353, 1260, + 1075, 135, 135, 135, 135, 1673, 780, 1080, + 356, 356, 356, 356, 356, 356, 356, 356, + 356, 356, 356, 356, 356, 356, 1265, 1080, + 135, 135, 135, 135, 135, 135, 1680, 788, + 1085, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 1270, + 1085, 736, 736, 736, 736, 736, 736, 736, + 736, 736, 736, 736, 736, 736, 736, 1440, + 344, 588, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 708, 568, - 1338, 339, 572, 61, 61, 61, 61, 61, + 744, 588, 1446, 347, 592, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, - 61, 716, 572, 1344, 342, 576, 63, 63, + 61, 61, 61, 752, 592, 1452, 350, 596, 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 724, 576, 1368, 354, - 592, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 756, - 592, 1380, 360, 600, 75, 75, 75, 75, + 63, 63, 63, 63, 63, 63, 760, 596, + 1476, 362, 612, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, + 71, 792, 612, 1488, 368, 620, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 772, 600, 1386, 363, 604, 77, - 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 780, 604, 1392, - 366, 608, 79, 79, 79, 79, 79, 79, + 75, 75, 75, 75, 808, 620, 1494, 371, + 624, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 816, + 624, 1500, 374, 628, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 788, 608, 1410, 375, 620, 85, 85, 85, + 79, 79, 824, 628, 1518, 383, 640, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 812, 620, 1422, 381, 628, + 85, 85, 85, 85, 85, 848, 640, 1530, + 389, 648, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, - 89, 89, 89, 89, 89, 89, 828, 628, - 1428, 384, 632, 91, 91, 91, 91, 91, + 864, 648, 1536, 392, 652, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, - 91, 836, 632, 1464, 402, 656, 103, 103, + 91, 91, 91, 872, 652, 1572, 410, 676, 103, 103, 103, 103, 103, 103, 103, 103, - 103, 103, 103, 103, 884, 656, 1470, 405, - 660, 105, 105, 105, 105, 105, 105, 105, - 105, 105, 105, 105, 105, 105, 105, 892, - 660, 1500, 420, 680, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 932, 680, 1374, 357, 596, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 764, 596, 1476, - 408, 664, 107, 107, 107, 107, 107, 107, + 103, 103, 103, 103, 103, 103, 920, 676, + 1578, 413, 680, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, + 105, 928, 680, 1632, 440, 716, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 1000, 716, 1482, 365, + 616, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 800, + 616, 1584, 416, 684, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 900, 664, 1482, 411, 668, 109, 109, 109, + 107, 107, 936, 684, 1590, 419, 688, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 908, 668, 1488, 414, 672, + 109, 109, 109, 109, 109, 944, 688, 1596, + 422, 692, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, - 111, 111, 111, 111, 111, 111, 916, 672, - 1494, 417, 676, 113, 113, 113, 113, 113, + 952, 692, 1602, 425, 696, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 924, 676, 1434, 387, 636, 93, 93, + 113, 113, 113, 960, 696, 1608, 428, 700, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 968, 700, + 1620, 434, 708, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, + 119, 984, 708, 1614, 431, 704, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 976, 704, 1626, 437, + 712, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 992, + 712, 1542, 395, 656, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 844, 636, 1440, 390, - 640, 95, 95, 95, 95, 95, 95, 95, - 0, 95, 95, 95, 95, 95, 95, 852, - 640, 95, 1446, 393, 644, 97, 97, 97, + 93, 93, 880, 656, 1548, 398, 660, 95, + 95, 95, 95, 95, 95, 95, 0, 95, + 95, 95, 95, 95, 95, 888, 660, 95, + 1554, 401, 664, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 860, 644, 1452, 396, 648, + 97, 896, 664, 1560, 404, 668, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 868, 648, - 1458, 399, 652, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, - 101, 876, 652, 1416, 378, 624, 87, 87, + 99, 99, 99, 99, 904, 668, 1566, 407, + 672, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 912, + 672, 1524, 386, 644, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 820, 624, 1398, 369, - 612, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 796, - 612, 1404, 372, 616, 83, 83, 83, 83, + 87, 87, 856, 644, 1506, 377, 632, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 832, 632, 1512, + 380, 636, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 804, 616, 1350, 345, 580, 65, + 840, 636, 1458, 353, 600, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 732, 580, 1356, - 348, 584, 67, 67, 67, 67, 67, 67, + 65, 65, 65, 768, 600, 1464, 356, 604, 67, 67, 67, 67, 67, 67, 67, 67, - 740, 584, 1362, 351, 588, 69, 69, 69, + 67, 67, 67, 67, 67, 67, 776, 604, + 1470, 359, 608, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 748, 588, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 436, 0, 432, 1, 153, - 150, 0 + 69, 784, 608, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 456, 0, 452, 1, + 161, 158, 0 }; static const short _demo_machine_parser_cmd_to_state_actions[] = { @@ -3894,9 +4142,9 @@ static const short _demo_machine_parser_cmd_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3961,7 +4209,13 @@ static const short _demo_machine_parser_cmd_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; static const short _demo_machine_parser_cmd_from_state_actions[] = { @@ -3992,9 +4246,9 @@ static const short _demo_machine_parser_cmd_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4059,7 +4313,13 @@ static const short _demo_machine_parser_cmd_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; static const short _demo_machine_parser_cmd_eof_trans[] = { @@ -4090,86 +4350,92 @@ static const short _demo_machine_parser_cmd_eof_trans[] = { 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 0, 0, 254, 256, - 258, 261, 263, 280, 263, 296, 280, 280, - 280, 280, 280, 280, 280, 280, 280, 280, - 280, 280, 280, 327, 342, 359, 280, 376, - 391, 407, 280, 280, 280, 280, 426, 280, - 280, 280, 280, 280, 280, 280, 280, 280, - 280, 280, 280, 453, 468, 280, 280, 280, - 280, 280, 468, 280, 280, 491, 280, 280, - 280, 491, 280, 280, 512, 280, 280, 280, - 512, 359, 532, 280, 550, 280, 280, 280, - 280, 550, 280, 280, 280, 280, 280, 280, - 280, 581, 596, 280, 280, 280, 596, 280, - 280, 280, 618, 280, 634, 280, 280, 651, - 280, 667, 280, 280, 280, 280, 280, 667, - 688, 280, 280, 688, 280, 532, 280, 280, - 359, 280, 280, 407, 715, 280, 715, 280, - 280, 391, 280, 280, 736, 280, 280, 342, - 280, 280, 280, 756, 280, 280, 280, 280, - 296, 280, 280, 280, 280, 778, 793, 808, - 823, 840, 856, 871, 887, 902, 917, 932, - 932, 948, 948, 964, 964, 840, 981, 997, - 997, 1013, 1028, 1028, 1044, 1059, 1074, 1089, - 1089, 1105, 1105, 981, 840, 887, 1125, 1125, - 871, 1141, 823, 1156, 793, 1172, 1187, 1209, - 1215, 1220, 1227, 1230, 1220, 1235, 1227, 1227, - 1227, 1227, 1235, 1235, 1227, 1227, 1227, 1227, - 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1257, - 1262, 1227, 1227, 1262, 1270, 1270, 1270, 1277, - 1282, 1282, 1288, 1288, 1294, 1302, 1227, 1288, - 1302, 1294, 1314, 1302, 1302, 1302, 1302, 1314, - 1314, 1302, 1302, 1302, 1302, 1302, 1302, 1302, - 1302, 1302, 1302, 1302, 1336, 1341, 1302, 1302, - 1341, 1349, 1288, 1288, 1288, 1288, 1349, 1349, - 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, - 1288, 1288, 1288, 1371, 1376, 1288, 1288, 1376, - 1187, 1209, 1209, 1400, 1209, 1209, 1209, 1422, - 1209, 1209, 1209, 1209, 1209, 1448, 1209, 1209, - 1209, 1209, 1472, 1209, 1209, 1209, 1494, 1209, - 1209, 1209, 1209, 1209, 1518, 1209, 1209, 1209, - 1542, 1209, 1209, 1209, 1209, 1209, 1209, 1209, - 1569, 1209, 1209, 1209, 1591, 1209, 1209, 1209, - 1209, 1209, 1209, 1209, 1620, 1209, 1209, 1209, - 1209, 1643, 1209, 1209, 1666, 1209, 1686, 1209, - 1706, 1209, 1728, 1209, 1209, 1209, 1209, 1209, - 1209, 1209, 1754, 1209, 1209, 1209, 1776, 1209, - 1209, 1797, 1209, 1817, 1836, 1209, 1209, 1209, - 1836, 1209, 1209, 1209, 1209, 1209, 1209, 1867, - 1209, 1209, 1209, 1889, 1209, 1209, 1209, 1209, - 1912, 1209, 1209, 1209, 1934, 1953, 1209, 1209, - 1974, 1209, 1209, 1209, 1209, 1209, 1997, 1209, - 1209, 1209, 2020, 1209, 1209, 1209, 1209, 1209, - 1209, 2045, 1187, 2078, 2097, 2116, 2135, 2154, - 2173, 2192, 2211, 2230, 2249, 2268, 2287, 2306, - 2325, 2344, 2363, 2382, 2401, 2420, 2439, 2439, - 2459, 2478, 2497, 2516, 2535, 2554, 2573, 2592, - 2611, 1288, 1288, 1288, 1288, 1288, 1288, 1288, - 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, - 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, - 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, - 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, - 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, - 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, - 1288, 1288, 1288, 1288, 1288, 1288, 1288, 2439, - 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, - 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, - 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, - 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, - 1288, 1288, 1288, 1288, 1288, 2716, 2716, 2720 + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 0, + 0, 269, 271, 273, 276, 278, 295, 278, + 311, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 342, 357, + 374, 295, 391, 406, 422, 295, 295, 295, + 295, 441, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 468, 483, + 295, 295, 295, 295, 295, 483, 295, 295, + 506, 295, 295, 295, 506, 295, 295, 527, + 295, 295, 295, 527, 374, 547, 295, 565, + 295, 295, 295, 295, 565, 295, 295, 295, + 295, 295, 295, 295, 596, 611, 295, 295, + 295, 611, 295, 295, 295, 633, 295, 649, + 295, 295, 666, 295, 682, 295, 295, 295, + 295, 295, 682, 703, 295, 295, 703, 295, + 547, 295, 295, 374, 295, 295, 422, 730, + 295, 730, 295, 295, 406, 295, 295, 751, + 295, 295, 357, 295, 295, 295, 771, 295, + 295, 295, 295, 311, 295, 295, 295, 295, + 793, 808, 823, 838, 855, 871, 886, 902, + 917, 932, 947, 947, 963, 963, 979, 979, + 855, 996, 1012, 1012, 1028, 1043, 1043, 1059, + 1074, 1089, 1104, 1104, 1120, 1120, 996, 855, + 902, 1140, 1140, 886, 1156, 838, 1171, 808, + 1187, 1202, 1224, 1230, 1235, 1242, 1245, 1235, + 1250, 1242, 1242, 1242, 1242, 1250, 1250, 1242, + 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, + 1242, 1242, 1272, 1277, 1242, 1242, 1277, 1285, + 1285, 1285, 1292, 1297, 1297, 1303, 1303, 1309, + 1317, 1242, 1303, 1317, 1309, 1329, 1317, 1317, + 1317, 1317, 1329, 1329, 1317, 1317, 1317, 1317, + 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1351, + 1356, 1317, 1317, 1356, 1364, 1303, 1303, 1303, + 1303, 1364, 1364, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1386, 1391, + 1303, 1303, 1391, 1202, 1224, 1224, 1415, 1224, + 1224, 1224, 1437, 1224, 1224, 1224, 1224, 1224, + 1463, 1224, 1224, 1224, 1224, 1487, 1224, 1224, + 1224, 1509, 1224, 1224, 1224, 1224, 1224, 1533, + 1224, 1224, 1224, 1557, 1224, 1224, 1224, 1224, + 1224, 1224, 1224, 1584, 1224, 1224, 1224, 1606, + 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1635, + 1224, 1224, 1224, 1224, 1658, 1224, 1224, 1682, + 1224, 1702, 1224, 1722, 1224, 1744, 1224, 1224, + 1224, 1224, 1224, 1224, 1224, 1770, 1224, 1224, + 1224, 1792, 1224, 1224, 1813, 1224, 1224, 1224, + 1224, 1224, 1839, 1224, 1224, 1224, 1862, 1224, + 1882, 1224, 1224, 1903, 1224, 1923, 1942, 1224, + 1224, 1224, 1942, 1224, 1224, 1224, 1224, 1224, + 1224, 1973, 1224, 1224, 1224, 1995, 1224, 1224, + 1224, 1224, 2018, 1224, 1224, 1224, 2040, 2059, + 1224, 1224, 2080, 1224, 1224, 1224, 1224, 1224, + 2103, 1224, 1224, 1224, 2126, 1224, 1224, 1224, + 1224, 1224, 1224, 2151, 1202, 2184, 2203, 2222, + 2241, 2260, 2279, 2298, 2317, 2336, 2355, 2374, + 2393, 2412, 2431, 2450, 2469, 2488, 2507, 2526, + 2545, 2564, 2583, 2602, 2621, 2621, 2641, 2660, + 2679, 2698, 2717, 2736, 2755, 2774, 2793, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 2621, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 2909, 2909, + 2913 }; -static const int demo_machine_parser_cmd_start = 221; -static const int demo_machine_parser_cmd_first_final = 221; +static const int demo_machine_parser_cmd_start = 232; +static const int demo_machine_parser_cmd_first_final = 232; static const int demo_machine_parser_cmd_error = 0; -static const int demo_machine_parser_cmd_en_main = 221; +static const int demo_machine_parser_cmd_en_main = 232; -/* #line 328 "./dssl.rl" */ +/* #line 332 "./dssl.rl" */ -/* #line 4173 "./dssl.c" */ +/* #line 4439 "./dssl.c" */ { cs = demo_machine_parser_cmd_start; ts = 0; @@ -4177,7 +4443,7 @@ static const int demo_machine_parser_cmd_en_main = 221; act = 0; } -/* #line 329 "./dssl.rl" */ +/* #line 333 "./dssl.rl" */ /* default values */ *comment = tsk_false; @@ -4192,7 +4458,7 @@ static const int demo_machine_parser_cmd_en_main = 221; /* exec */ -/* #line 4196 "./dssl.c" */ +/* #line 4462 "./dssl.c" */ { int _klen; unsigned int _trans; @@ -4210,11 +4476,11 @@ _resume: _nacts = (unsigned int) *_acts++; while ( _nacts-- > 0 ) { switch ( *_acts++ ) { - case 71: + case 75: /* #line 1 "./dssl.rl" */ {ts = p;} break; -/* #line 4218 "./dssl.c" */ +/* #line 4484 "./dssl.c" */ } } @@ -4683,61 +4949,77 @@ replace: break; case 66: /* #line 283 "./dssl.rl" */ - { opt->type = opt_to; } + { opt->type = opt_stun_ip; } break; case 67: -/* #line 290 "./dssl.rl" */ - { set_level(lv_stack); } +/* #line 284 "./dssl.rl" */ + { opt->type = opt_stun_pwd; } break; case 68: -/* #line 290 "./dssl.rl" */ - { set_level(lv_session); } +/* #line 285 "./dssl.rl" */ + { opt->type = opt_stun_port; } break; case 69: -/* #line 290 "./dssl.rl" */ - { set_level(lv_action); } +/* #line 286 "./dssl.rl" */ + { opt->type = opt_stun_usr; } + break; + case 70: +/* #line 287 "./dssl.rl" */ + { opt->type = opt_to; } + break; + case 71: +/* #line 294 "./dssl.rl" */ + { set_level(lv_stack); } break; case 72: +/* #line 294 "./dssl.rl" */ + { set_level(lv_session); } + break; + case 73: +/* #line 294 "./dssl.rl" */ + { set_level(lv_action); } + break; + case 76: /* #line 1 "./dssl.rl" */ {te = p+1;} break; - case 73: -/* #line 303 "./dssl.rl" */ - {te = p+1;{ }} - break; - case 74: -/* #line 305 "./dssl.rl" */ - {te = p+1;{ }} - break; - case 75: -/* #line 300 "./dssl.rl" */ - {te = p;p--;{ }} - break; - case 76: -/* #line 301 "./dssl.rl" */ - {te = p;p--;{ }} - break; case 77: -/* #line 302 "./dssl.rl" */ - {te = p;p--;{ }} +/* #line 307 "./dssl.rl" */ + {te = p+1;{ }} break; case 78: -/* #line 303 "./dssl.rl" */ - {te = p;p--;{ }} +/* #line 309 "./dssl.rl" */ + {te = p+1;{ }} break; case 79: /* #line 304 "./dssl.rl" */ {te = p;p--;{ }} break; case 80: -/* #line 300 "./dssl.rl" */ - {{p = ((te))-1;}{ }} +/* #line 305 "./dssl.rl" */ + {te = p;p--;{ }} break; case 81: -/* #line 301 "./dssl.rl" */ +/* #line 306 "./dssl.rl" */ + {te = p;p--;{ }} + break; + case 82: +/* #line 307 "./dssl.rl" */ + {te = p;p--;{ }} + break; + case 83: +/* #line 308 "./dssl.rl" */ + {te = p;p--;{ }} + break; + case 84: +/* #line 304 "./dssl.rl" */ {{p = ((te))-1;}{ }} break; -/* #line 4741 "./dssl.c" */ + case 85: +/* #line 305 "./dssl.rl" */ + {{p = ((te))-1;}{ }} + break; +/* #line 5023 "./dssl.c" */ } } @@ -4746,11 +5028,11 @@ _again: _nacts = (unsigned int) *_acts++; while ( _nacts-- > 0 ) { switch ( *_acts++ ) { - case 70: + case 74: /* #line 1 "./dssl.rl" */ {ts = 0;} break; -/* #line 4754 "./dssl.c" */ +/* #line 5036 "./dssl.c" */ } } @@ -4770,12 +5052,12 @@ _again: _out: {} } -/* #line 343 "./dssl.rl" */ +/* #line 347 "./dssl.rl" */ if( cs < -/* #line 4777 "./dssl.c" */ -221 -/* #line 344 "./dssl.rl" */ +/* #line 5059 "./dssl.c" */ +232 +/* #line 348 "./dssl.rl" */ ){ TSK_DEBUG_ERROR("Failed to parse [%s] command-Line.", p); TSK_OBJECT_SAFE_FREE(cmd); diff --git a/trunk/tinyDEMO/dssl.rl b/trunk/tinyDEMO/dssl.rl index 1b0bc1fa..cc4d1040 100644 --- a/trunk/tinyDEMO/dssl.rl +++ b/trunk/tinyDEMO/dssl.rl @@ -280,6 +280,10 @@ replace: "sigcomp-id"i % { opt->type = opt_sigcomp_id; } | "silent"i % { opt->type = opt_silent; } | "smsc"i % { opt->type = opt_smsc; } | + "stun-ip"i % { opt->type = opt_stun_ip; } | + "stun-pwd"i % { opt->type = opt_stun_pwd; } | + "stun-port"i % { opt->type = opt_stun_port; } | + "stun-usr"i % { opt->type = opt_stun_usr; } | "to"i % { opt->type = opt_to; } )** >10 | (any*) >tag >0 %option_error; diff --git a/trunk/tinyDEMO/invite.c b/trunk/tinyDEMO/invite.c index b6f3b723..0f088874 100644 --- a/trunk/tinyDEMO/invite.c +++ b/trunk/tinyDEMO/invite.c @@ -96,6 +96,11 @@ int invite_handle_event(const tsip_event_t *_event) // ============================ // Media Events // + + /* Early Media started */ + case tsip_m_early_media: + TSK_DEBUG_INFO("invite_handle_event(tsip_m_early_media)"); + break; /* 3GPP TS 24.610: Communication Hold */ case tsip_m_local_hold_ok: diff --git a/trunk/tinyMEDIA/include/tinymedia/tmedia_codec.h b/trunk/tinyMEDIA/include/tinymedia/tmedia_codec.h index 991e2a18..4ef3706e 100644 --- a/trunk/tinyMEDIA/include/tinymedia/tmedia_codec.h +++ b/trunk/tinyMEDIA/include/tinymedia/tmedia_codec.h @@ -99,8 +99,7 @@ TMEDIA_BEGIN_DECLS #define TMEDIA_CODEC_FORMAT_AMR_WB_BE "113" #define TMEDIA_CODEC_FORMAT_AMR_WB_OA "114" -//#define TMEDIA_CODEC_FORMAT_BV16 "115" //FIXME -#define TMEDIA_CODEC_FORMAT_BV16 "106" +#define TMEDIA_CODEC_FORMAT_BV16 "115" #define TMEDIA_CODEC_FORMAT_RAW "121" #define TMEDIA_CODEC_FORMAT_FFV1 "122" diff --git a/trunk/tinyMEDIA/include/tinymedia/tmedia_params.h b/trunk/tinyMEDIA/include/tinymedia/tmedia_params.h index 1b638265..792e4b43 100644 --- a/trunk/tinyMEDIA/include/tinymedia/tmedia_params.h +++ b/trunk/tinyMEDIA/include/tinymedia/tmedia_params.h @@ -57,15 +57,14 @@ tmedia_param_plugin_type_t; typedef enum tmedia_param_value_type_e { - // It's very important to distinguish pvoid (opaque) to pchar (can be duplicated) tmedia_pvt_int32, - tmedia_pvt_pvoid, /* SHOULD be removed ==> many problems */ + tmedia_pvt_pobject, tmedia_pvt_pchar, tmedia_pvt_int64, } tmedia_param_value_type_t; -#define TMEDIA_PARAM_VALUE_TYPE_IS_PTR(self) ((self) == tmedia_pvt_pvoid || (self) == tmedia_pvt_pchar) +#define TMEDIA_PARAM_VALUE_TYPE_IS_PTR(self) ((self) == tmedia_pvt_pobject || (self) == tmedia_pvt_pchar) typedef struct tmedia_param_s { diff --git a/trunk/tinyMEDIA/include/tinymedia/tmedia_session.h b/trunk/tinyMEDIA/include/tinymedia/tmedia_session.h index b3ddbcd3..9dfd725f 100644 --- a/trunk/tinyMEDIA/include/tinymedia/tmedia_session.h +++ b/trunk/tinyMEDIA/include/tinymedia/tmedia_session.h @@ -38,6 +38,8 @@ #include "tinysdp/tsdp_message.h" +#include "tinynet.h" + #include "tsk_list.h" TMEDIA_BEGIN_DECLS @@ -161,6 +163,8 @@ typedef struct tmedia_session_mgr_s tsk_bool_t offerer; //! local IP address or FQDN char* addr; + //! public IP address or FQDN + char* public_addr; //! whether the @a addr is IPv6 or not (useful when @addr is a FQDN) tsk_bool_t ipv6; @@ -184,6 +188,9 @@ typedef struct tmedia_session_mgr_s tmedia_qos_strength_t strength; } qos; + /* NAT Traversal context */ + tnet_nat_context_handle_t* natt_ctx; + //! List of all sessions tmedia_sessions_L_t* sessions; @@ -209,25 +216,25 @@ tmedia_session_param_type_t; // (const char*)KEY_STR, (void**)&VALUE_PTR /* Manager */ #define TMEDIA_SESSION_MANAGER_SET_INT32(KEY_STR, VALUE_INT32) TMEDIA_SESSION_SET_PARAM(tmedia_none, tmedia_ppt_manager, tmedia_pvt_int32, KEY_STR, VALUE_INT32) -#define TMEDIA_SESSION_MANAGER_SET_PVOID(KEY_STR, VALUE_PTR) TMEDIA_SESSION_SET_PARAM(tmedia_none, tmedia_ppt_manager, tmedia_pvt_pvoid, KEY_STR, VALUE_PTR) +#define TMEDIA_SESSION_MANAGER_SET_POBJECT(KEY_STR, VALUE_PTR) TMEDIA_SESSION_SET_PARAM(tmedia_none, tmedia_ppt_manager, tmedia_pvt_pobject, KEY_STR, VALUE_PTR) #define TMEDIA_SESSION_MANAGER_SET_STR(KEY_STR, VALUE_STR) TMEDIA_SESSION_SET_PARAM(tmedia_none, tmedia_ppt_manager, tmedia_pvt_pchar, KEY_STR, VALUE_STR) #define TMEDIA_SESSION_MANAGER_SET_INT64(KEY_STR, VALUE_INT64) TMEDIA_SESSION_SET_PARAM(tmedia_none, tmedia_ppt_manager, tmedia_pvt_int64, KEY_STR, VALUE_INT64) //#define TMEDIA_SESSION_MANAGER_GET_INT32(KEY_STR, VALUE_PINT32) TMEDIA_SESSION_GET_PARAM(tmedia_none, tmedia_ppt_manager, tmedia_pvt_int32, KEY_STR, VALUE_PINT32) -//#define TMEDIA_SESSION_MANAGER_GET_PVOID(KEY_STR, VALUE_PPTR) TMEDIA_SESSION_GET_PARAM(tmedia_none, tmedia_ppt_manager, tmedia_pvt_pvoid, KEY_STR, VALUE_PPTR) +//#define TMEDIA_SESSION_MANAGER_GET_PVOID(KEY_STR, VALUE_PPTR) TMEDIA_SESSION_GET_PARAM(tmedia_none, tmedia_ppt_manager, tmedia_pvt_pobject, KEY_STR, VALUE_PPTR) //#define TMEDIA_SESSION_MANAGER_GET_STR(KEY_STR, VALUE_PSTR) TMEDIA_SESSION_GET_PARAM(tmedia_none, tmedia_ppt_manager, tmedia_pvt_pchar, KEY_STR, VALUE_PSTR) //#define TMEDIA_SESSION_MANAGER_GET_INT64(KEY_STR, VALUE_PINT64) TMEDIA_SESSION_GET_PARAM(tmedia_none, tmedia_ppt_manager, tmedia_pvt_int64, KEY_STR, VALUE_PINT64) /* Any Session */ #define TMEDIA_SESSION_SET_INT32(MEDIA_TYPE_ENUM, KEY_STR, VALUE_INT32) TMEDIA_SESSION_SET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_session, tmedia_pvt_int32, KEY_STR, VALUE_INT32) -#define TMEDIA_SESSION_SET_PVOID(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PTR) TMEDIA_SESSION_SET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_session, tmedia_pvt_pvoid, KEY_STR, VALUE_PTR) +#define TMEDIA_SESSION_SET_POBJECT(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PTR) TMEDIA_SESSION_SET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_session, tmedia_pvt_pobject, KEY_STR, VALUE_PTR) #define TMEDIA_SESSION_SET_STR(MEDIA_TYPE_ENUM, KEY_STR, VALUE_STR) TMEDIA_SESSION_SET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_session, tmedia_pvt_pchar, KEY_STR, VALUE_STR) #define TMEDIA_SESSION_SET_INT64(MEDIA_TYPE_ENUM, KEY_STR, VALUE_INT64) TMEDIA_SESSION_SET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_session, tmedia_pvt_int64, KEY_STR, VALUE_INT64) //#define TMEDIA_SESSION_GET_INT32(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PINT32) TMEDIA_SESSION_GET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_session, tmedia_pvt_int32, KEY_STR, VALUE_PINT32) -//#define TMEDIA_SESSION_GET_PVOID(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PPTR) TMEDIA_SESSION_GET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_session, tmedia_pvt_pvoid, KEY_STR, VALUE_PPTR) +//#define TMEDIA_SESSION_GET_PVOID(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PPTR) TMEDIA_SESSION_GET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_session, tmedia_pvt_pobject, KEY_STR, VALUE_PPTR) //#define TMEDIA_SESSION_GET_STR(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PSTR) TMEDIA_SESSION_GET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_session, tmedia_pvt_pchar, KEY_STR, VALUE_PSTR) //#define TMEDIA_SESSION_GET_INT64(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PINT64) TMEDIA_SESSION_GET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_session, tmedia_pvt_int64, KEY_STR, VALUE_PINT64) /* Audio Session */ #define TMEDIA_SESSION_AUDIO_SET_INT32(KEY_STR, VALUE_INT32) TMEDIA_SESSION_SET_INT32(tmedia_audio, KEY_STR, VALUE_INT32) -#define TMEDIA_SESSION_AUDIO_SET_PVOID(KEY_STR, VALUE_PTR) TMEDIA_SESSION_SET_PVOID(tmedia_audio, KEY_STR, VALUE_PTR) +#define TMEDIA_SESSION_AUDIO_SET_POBJECT(KEY_STR, VALUE_PTR) TMEDIA_SESSION_SET_POBJECT(tmedia_audio, KEY_STR, VALUE_PTR) #define TMEDIA_SESSION_AUDIO_SET_STR(KEY_STR, VALUE_STR) TMEDIA_SESSION_SET_STR(tmedia_audio, KEY_STR, VALUE_STR) #define TMEDIA_SESSION_AUDIO_SET_INT64(KEY_STR, VALUE_INT64) TMEDIA_SESSION_SET_INT64(tmedia_audio, KEY_STR, VALUE_INT64) //#define TMEDIA_SESSION_AUDIO_GET_INT32(KEY_STR, VALUE_PINT32) TMEDIA_SESSION_GET_INT32(tmedia_audio, KEY_STR, VALUE_PINT32) @@ -236,7 +243,7 @@ tmedia_session_param_type_t; //#define TMEDIA_SESSION_AUDIO_GET_INT64(KEY_STR, VALUE_PINT64) TMEDIA_SESSION_GET_INT64(tmedia_audio, KEY_STR, VALUE_PINT64) /* Video Session */ #define TMEDIA_SESSION_VIDEO_SET_INT32(KEY_STR, VALUE_INT32) TMEDIA_SESSION_SET_INT32(tmedia_video, KEY_STR, VALUE_INT32) -#define TMEDIA_SESSION_VIDEO_SET_PVOID(KEY_STR, VALUE_PTR) TMEDIA_SESSION_SET_PVOID(tmedia_video, KEY_STR, VALUE_PTR) +#define TMEDIA_SESSION_VIDEO_SET_POBJECT(KEY_STR, VALUE_PTR) TMEDIA_SESSION_SET_POBJECT(tmedia_video, KEY_STR, VALUE_PTR) #define TMEDIA_SESSION_VIDEO_SET_STR(KEY_STR, VALUE_STR) TMEDIA_SESSION_SET_STR(tmedia_video, KEY_STR, VALUE_STR) #define TMEDIA_SESSION_VIDEO_SET_INT64(KEY_STR, VALUE_INT64) TMEDIA_SESSION_SET_INT64(tmedia_video, KEY_STR, VALUE_INT64) //#define TMEDIA_SESSION_VIDEO_GET_INT32(KEY_STR, VALUE_PINT32) TMEDIA_SESSION_GET_INT32(tmedia_video, KEY_STR, VALUE_PINT32) @@ -245,7 +252,7 @@ tmedia_session_param_type_t; //#define TMEDIA_SESSION_VIDEO_GET_INT64(KEY_STR, VALUE_PINT64) TMEDIA_SESSION_GET_INT64(tmedia_video, KEY_STR, VALUE_PINT64) /* Msrp Session */ #define TMEDIA_SESSION_MSRP_SET_INT32(KEY_STR, VALUE_INT32) TMEDIA_SESSION_SET_INT32(tmedia_msrp, KEY_STR, VALUE_INT32) -#define TMEDIA_SESSION_MSRP_SET_PVOID(KEY_STR, VALUE_PTR) TMEDIA_SESSION_SET_PVOID(tmedia_msrp, KEY_STR, VALUE_PTR) +#define TMEDIA_SESSION_MSRP_SET_POBJECT(KEY_STR, VALUE_PTR) TMEDIA_SESSION_SET_POBJECT(tmedia_msrp, KEY_STR, VALUE_PTR) #define TMEDIA_SESSION_MSRP_SET_STR(KEY_STR, VALUE_STR) TMEDIA_SESSION_SET_STR(tmedia_msrp, KEY_STR, VALUE_STR) #define TMEDIA_SESSION_MSRP_SET_INT64(KEY_STR, VALUE_INT64) TMEDIA_SESSION_SET_INT64(tmedia_msrp, KEY_STR, VALUE_INT64) //#define TMEDIA_SESSION_MSRP_GET_INT32(KEY_STR, VALUE_PINT32) TMEDIA_SESSION_GET_INT32(tmedia_msrp, KEY_STR, VALUE_PINT32) @@ -254,16 +261,16 @@ tmedia_session_param_type_t; //#define TMEDIA_SESSION_MSRP_GET_INT64(KEY_STR, VALUE_PINT64) TMEDIA_SESSION_GET_INT64(tmedia_msrp, KEY_STR, VALUE_PINT64) /* Any Consumer */ #define TMEDIA_SESSION_CONSUMER_SET_INT32(MEDIA_TYPE_ENUM, KEY_STR, VALUE_INT32) TMEDIA_SESSION_SET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_consumer, tmedia_pvt_int32, KEY_STR, VALUE_INT32) -#define TMEDIA_SESSION_CONSUMER_SET_PVOID(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PTR) TMEDIA_SESSION_SET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_consumer, tmedia_pvt_pvoid, KEY_STR, VALUE_PTR) +#define TMEDIA_SESSION_CONSUMER_SET_POBJECT(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PTR) TMEDIA_SESSION_SET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_consumer, tmedia_pvt_pobject, KEY_STR, VALUE_PTR) #define TMEDIA_SESSION_CONSUMER_SET_STR(MEDIA_TYPE_ENUM, KEY_STR, VALUE_STR) TMEDIA_SESSION_SET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_consumer, tmedia_pvt_pchar, KEY_STR, VALUE_STR) #define TMEDIA_SESSION_CONSUMER_SET_INT64(MEDIA_TYPE_ENUM, KEY_STR, VALUE_INT64) TMEDIA_SESSION_SET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_consumer, tmedia_pvt_int64, KEY_STR, VALUE_INT64) //#define TMEDIA_SESSION_CONSUMER_GET_INT32(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PINT32) TMEDIA_SESSION_GET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_consumer, tmedia_pvt_int32, KEY_STR, VALUE_PINT32) -//#define TMEDIA_SESSION_CONSUMER_GET_PVOID(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PPTR) TMEDIA_SESSION_GET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_consumer, tmedia_pvt_pvoid, KEY_STR, VALUE_PPTR) +//#define TMEDIA_SESSION_CONSUMER_GET_PVOID(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PPTR) TMEDIA_SESSION_GET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_consumer, tmedia_pvt_pobject, KEY_STR, VALUE_PPTR) //#define TMEDIA_SESSION_CONSUMER_GET_STR(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PSTR) TMEDIA_SESSION_GET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_consumer, tmedia_pvt_pchar, KEY_STR, VALUE_PSTR) //#define TMEDIA_SESSION_CONSUMER_GET_INT64(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PINT64) TMEDIA_SESSION_GET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_consumer, tmedia_pvt_int64, KEY_STR, VALUE_PINT64) /* Audio Consumer */ #define TMEDIA_SESSION_AUDIO_CONSUMER_SET_INT32(KEY_STR, VALUE_INT32) TMEDIA_SESSION_CONSUMER_SET_INT32(tmedia_audio, KEY_STR, VALUE_INT32) -#define TMEDIA_SESSION_AUDIO_CONSUMER_SET_PVOID(KEY_STR, VALUE_PTR) TMEDIA_SESSION_CONSUMER_SET_PVOID(tmedia_audio, KEY_STR, VALUE_PTR) +#define TMEDIA_SESSION_AUDIO_CONSUMER_SET_POBJECT(KEY_STR, VALUE_PTR) TMEDIA_SESSION_CONSUMER_SET_POBJECT(tmedia_audio, KEY_STR, VALUE_PTR) #define TMEDIA_SESSION_AUDIO_CONSUMER_SET_STR(KEY_STR, VALUE_STR) TMEDIA_SESSION_CONSUMER_SET_STR(tmedia_audio, KEY_STR, VALUE_STR) #define TMEDIA_SESSION_AUDIO_CONSUMER_SET_INT64(KEY_STR, VALUE_INT64) TMEDIA_SESSION_CONSUMER_SET_INT64(tmedia_audio, KEY_STR, VALUE_INT64) //#define TMEDIA_SESSION_AUDIO_CONSUMER_GET_INT32(KEY_STR, VALUE_PINT32) TMEDIA_SESSION_CONSUMER_GET_INT32(tmedia_audio, KEY_STR, VALUE_PINT32) @@ -272,7 +279,7 @@ tmedia_session_param_type_t; //#define TMEDIA_SESSION_AUDIO_CONSUMER_GET_INT64(KEY_STR, VALUE_PINT64) TMEDIA_SESSION_CONSUMER_GET_INT64(tmedia_audio, KEY_STR, VALUE_PINT64) /* Video Consumer */ #define TMEDIA_SESSION_VIDEO_CONSUMER_SET_INT32(KEY_STR, VALUE_INT32) TMEDIA_SESSION_CONSUMER_SET_INT32(tmedia_video, KEY_STR, VALUE_INT32) -#define TMEDIA_SESSION_VIDEO_CONSUMER_SET_PVOID(KEY_STR, VALUE_PTR) TMEDIA_SESSION_CONSUMER_SET_PVOID(tmedia_video, KEY_STR, VALUE_PTR) +#define TMEDIA_SESSION_VIDEO_CONSUMER_SET_POBJECT(KEY_STR, VALUE_PTR) TMEDIA_SESSION_CONSUMER_SET_POBJECT(tmedia_video, KEY_STR, VALUE_PTR) #define TMEDIA_SESSION_VIDEO_CONSUMER_SET_STR(KEY_STR, VALUE_STR) TMEDIA_SESSION_CONSUMER_SET_STR(tmedia_video, KEY_STR, VALUE_STR) #define TMEDIA_SESSION_VIDEO_CONSUMER_SET_INT64(KEY_STR, VALUE_INT64) TMEDIA_SESSION_CONSUMER_SET_INT64(tmedia_video, KEY_STR, VALUE_INT64) //#define TMEDIA_SESSION_VIDEO_CONSUMER_GET_INT32(KEY_STR, VALUE_PINT32) TMEDIA_SESSION_CONSUMER_GET_INT32(tmedia_video, KEY_STR, VALUE_PINT32) @@ -281,7 +288,7 @@ tmedia_session_param_type_t; //#define TMEDIA_SESSION_VIDEO_CONSUMER_GET_INT64(KEY_STR, VALUE_PINT64) TMEDIA_SESSION_CONSUMER_GET_INT64(tmedia_video, KEY_STR, VALUE_PINT64) /* Msrp Consumer */ #define TMEDIA_SESSION_MSRP_CONSUMER_SET_INT32(KEY_STR, VALUE_INT32) TMEDIA_SESSION_CONSUMER_SET_INT32(tmedia_msrp, KEY_STR, VALUE_INT32) -#define TMEDIA_SESSION_MSRP_CONSUMER_SET_PVOID(KEY_STR, VALUE_PTR) TMEDIA_SESSION_CONSUMER_SET_PVOID(tmedia_msrp, KEY_STR, VALUE_PTR) +#define TMEDIA_SESSION_MSRP_CONSUMER_SET_POBJECT(KEY_STR, VALUE_PTR) TMEDIA_SESSION_CONSUMER_SET_POBJECT(tmedia_msrp, KEY_STR, VALUE_PTR) #define TMEDIA_SESSION_MSRP_CONSUMER_SET_STR(KEY_STR, VALUE_STR) TMEDIA_SESSION_CONSUMER_SET_STR(tmedia_msrp, KEY_STR, VALUE_STR) #define TMEDIA_SESSION_MSRP_CONSUMER_SET_INT64(KEY_STR, VALUE_INT64) TMEDIA_SESSION_CONSUMER_SET_INT64(tmedia_msrp, KEY_STR, VALUE_INT64) //#define TMEDIA_SESSION_MSRP_CONSUMER_GET_INT32(KEY_STR, VALUE_PINT32) TMEDIA_SESSION_CONSUMER_GET_INT32(tmedia_msrp, KEY_STR, VALUE_PINT32) @@ -290,16 +297,16 @@ tmedia_session_param_type_t; //#define TMEDIA_SESSION_MSRP_CONSUMER_GET_INT64(KEY_STR, VALUE_PINT64) TMEDIA_SESSION_CONSUMER_GET_INT64(tmedia_msrp, KEY_STR, VALUE_PINT64) /* Any Producer */ #define TMEDIA_SESSION_PRODUCER_SET_INT32(MEDIA_TYPE_ENUM, KEY_STR, VALUE_INT32) TMEDIA_SESSION_SET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_producer, tmedia_pvt_int32, KEY_STR, VALUE_INT32) -#define TMEDIA_SESSION_PRODUCER_SET_PVOID(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PTR) TMEDIA_SESSION_SET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_producer, tmedia_pvt_pvoid, KEY_STR, VALUE_PTR) +#define TMEDIA_SESSION_PRODUCER_SET_POBJECT(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PTR) TMEDIA_SESSION_SET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_producer, tmedia_pvt_pobject, KEY_STR, VALUE_PTR) #define TMEDIA_SESSION_PRODUCER_SET_STR(MEDIA_TYPE_ENUM, KEY_STR, VALUE_STR) TMEDIA_SESSION_SET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_producer, tmedia_pvt_pchar, KEY_STR, VALUE_STR) #define TMEDIA_SESSION_PRODUCER_SET_INT64(MEDIA_TYPE_ENUM, KEY_STR, VALUE_INT64) TMEDIA_SESSION_SET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_producer, tmedia_pvt_int64, KEY_STR, VALUE_INT64) //#define TMEDIA_SESSION_PRODUCER_GET_INT32(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PINT32) TMEDIA_SESSION_GET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_producer, tmedia_pvt_int32, KEY_STR, VALUE_PINT32) -//#define TMEDIA_SESSION_PRODUCER_GET_PVOID(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PPTR) TMEDIA_SESSION_GET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_producer, tmedia_pvt_pvoid, KEY_STR, VALUE_PPTR) +//#define TMEDIA_SESSION_PRODUCER_GET_PVOID(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PPTR) TMEDIA_SESSION_GET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_producer, tmedia_pvt_pobject, KEY_STR, VALUE_PPTR) //#define TMEDIA_SESSION_PRODUCER_GET_STR(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PSTR) TMEDIA_SESSION_GET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_producer, tmedia_pvt_pchar, KEY_STR, VALUE_PSTR) //#define TMEDIA_SESSION_PRODUCER_GET_INT64(MEDIA_TYPE_ENUM, KEY_STR, VALUE_PINT64) TMEDIA_SESSION_GET_PARAM(MEDIA_TYPE_ENUM, tmedia_ppt_producer, tmedia_pvt_int64, KEY_STR, VALUE_PINT64) /* Audio Producer */ #define TMEDIA_SESSION_AUDIO_PRODUCER_SET_INT32(KEY_STR, VALUE_INT32) TMEDIA_SESSION_PRODUCER_SET_INT32(tmedia_audio, KEY_STR, VALUE_INT32) -#define TMEDIA_SESSION_AUDIO_PRODUCER_SET_PVOID(KEY_STR, VALUE_PTR) TMEDIA_SESSION_PRODUCER_SET_PVOID(tmedia_audio, KEY_STR, VALUE_PTR) +#define TMEDIA_SESSION_AUDIO_PRODUCER_SET_POBJECT(KEY_STR, VALUE_PTR) TMEDIA_SESSION_PRODUCER_SET_POBJECT(tmedia_audio, KEY_STR, VALUE_PTR) #define TMEDIA_SESSION_AUDIO_PRODUCER_SET_STR(KEY_STR, VALUE_STR) TMEDIA_SESSION_AUDIO_PRODUCER_SET_STR(tmedia_audio, KEY_STR, VALUE_STR) #define TMEDIA_SESSION_AUDIO_PRODUCER_SET_INT64(KEY_STR, VALUE_INT64) TMEDIA_SESSION_PRODUCER_SET_INT64(tmedia_audio, KEY_STR, VALUE_INT64) //#define TMEDIA_SESSION_AUDIO_PRODUCER_GET_INT32(KEY_STR, VALUE_PINT32) TMEDIA_SESSION_PRODUCER_GET_INT32(tmedia_audio, KEY_STR, VALUE_PINT32) @@ -308,7 +315,7 @@ tmedia_session_param_type_t; //#define TMEDIA_SESSION_AUDIO_PRODUCER_GET_INT64(KEY_STR, VALUE_PINT64) TMEDIA_SESSION_PRODUCER_GET_INT64(tmedia_audio, KEY_STR, VALUE_PINT64) /* Video Producer */ #define TMEDIA_SESSION_VIDEO_PRODUCER_SET_INT32(KEY_STR, VALUE_INT32) TMEDIA_SESSION_PRODUCER_SET_INT32(tmedia_video, KEY_STR, VALUE_INT32) -#define TMEDIA_SESSION_VIDEO_PRODUCER_SET_PVOID(KEY_STR, VALUE_PTR) TMEDIA_SESSION_PRODUCER_SET_PVOID(tmedia_video, KEY_STR, VALUE_PTR) +#define TMEDIA_SESSION_VIDEO_PRODUCER_SET_POBJECT(KEY_STR, VALUE_PTR) TMEDIA_SESSION_PRODUCER_SET_POBJECT(tmedia_video, KEY_STR, VALUE_PTR) #define TMEDIA_SESSION_VIDEO_PRODUCER_SET_STR(KEY_STR, VALUE_STR) TMEDIA_SESSION_AUDIO_PRODUCER_SET_STR(tmedia_video, KEY_STR, VALUE_STR) #define TMEDIA_SESSION_VIDEO_PRODUCER_SET_INT64(KEY_STR, VALUE_INT64) TMEDIA_SESSION_PRODUCER_SET_INT64(tmedia_video, KEY_STR, VALUE_INT64) //#define TMEDIA_SESSION_VIDEO_PRODUCER_GET_INT32(KEY_STR, VALUE_PINT32) TMEDIA_SESSION_PRODUCER_GET_INT32(tmedia_video, KEY_STR, VALUE_PINT32) @@ -317,7 +324,7 @@ tmedia_session_param_type_t; //#define TMEDIA_SESSION_VIDEO_PRODUCER_GET_INT64(KEY_STR, VALUE_PINT64) TMEDIA_SESSION_PRODUCER_GET_INT64(tmedia_video, KEY_STR, VALUE_PINT64) /* Msrp Producer */ #define TMEDIA_SESSION_MSRP_PRODUCER_SET_INT32(KEY_STR, VALUE_INT32) TMEDIA_SESSION_PRODUCER_SET_INT32(tmedia_msrp, KEY_STR, VALUE_INT32) -#define TMEDIA_SESSION_MSRP_PRODUCER_SET_PVOID(KEY_STR, VALUE_PTR) TMEDIA_SESSION_PRODUCER_SET_PVOID(tmedia_msrp, KEY_STR, VALUE_PTR) +#define TMEDIA_SESSION_MSRP_PRODUCER_SET_POBJECT(KEY_STR, VALUE_PTR) TMEDIA_SESSION_PRODUCER_SET_POBJECT(tmedia_msrp, KEY_STR, VALUE_PTR) #define TMEDIA_SESSION_MSRP_PRODUCER_SET_STR(KEY_STR, VALUE_STR) TMEDIA_SESSION_AUDIO_PRODUCER_SET_STR(tmedia_msrp, KEY_STR, VALUE_STR) #define TMEDIA_SESSION_MSRP_PRODUCER_SET_INT64(KEY_STR, VALUE_INT64) TMEDIA_SESSION_PRODUCER_SET_INT64(tmedia_msrp, KEY_STR, VALUE_INT64) //#define TMEDIA_SESSION_MSRP_PRODUCER_GET_INT32(KEY_STR, VALUE_PINT32) TMEDIA_SESSION_PRODUCER_GET_INT32(tmedia_msrp, KEY_STR, VALUE_PINT32) @@ -336,6 +343,7 @@ tmedia_session_param_type_t; TINYMEDIA_API tmedia_session_mgr_t* tmedia_session_mgr_create(tmedia_type_t type, const char* addr, tsk_bool_t ipv6, tsk_bool_t offerer); +TINYMEDIA_API int tmedia_session_mgr_set_natt_ctx(tmedia_session_mgr_t* self, tnet_nat_context_handle_t* natt_ctx, const char* public_addr); TINYMEDIA_API int tmedia_session_mgr_start(tmedia_session_mgr_t* self); TINYMEDIA_API int tmedia_session_mgr_set(tmedia_session_mgr_t* self, ...); TINYMEDIA_API int tmedia_session_mgr_set_2(tmedia_session_mgr_t* self, va_list *app); diff --git a/trunk/tinyMEDIA/src/tmedia_params.c b/trunk/tinyMEDIA/src/tmedia_params.c index f9a97955..e6d9538c 100644 --- a/trunk/tinyMEDIA/src/tmedia_params.c +++ b/trunk/tinyMEDIA/src/tmedia_params.c @@ -55,19 +55,20 @@ tmedia_param_t* tmedia_param_create(tmedia_param_access_type_t access_type, switch(value_type){ case tmedia_pvt_int32: if(param->value = tsk_calloc(1, sizeof(int32_t))){ - *((int32_t*)param->value) = *((int32_t*)value); + memcpy(param->value, value, sizeof(int32_t)); + //*((int32_t*)param->value) = *((int32_t*)value); } break; - case tmedia_pvt_pvoid: - /* FIXME */ - param->value = value; + case tmedia_pvt_pobject: + param->value = tsk_object_ref(value); break; case tmedia_pvt_pchar: param->value = tsk_strdup(value); break; case tmedia_pvt_int64: if(param->value = tsk_calloc(1, sizeof(int64_t))){ - *((int64_t*)param->value) = *((int64_t*)value); + memcpy(param->value, value, sizeof(int64_t)); + //*((int64_t*)param->value) = *((int64_t*)value); } break; } @@ -123,10 +124,9 @@ static tsk_object_t* tmedia_param_dtor(tsk_object_t* self) tmedia_param_t *param = self; if(param){ TSK_FREE(param->key); - switch(param->access_type){ - case tmedia_pvt_pvoid: - /* FIXME */ - param->value = tsk_null; + switch(param->value_type){ + case tmedia_pvt_pobject: + TSK_OBJECT_SAFE_FREE(param->value); break; case tmedia_pvt_pchar: case tmedia_pvt_int64: diff --git a/trunk/tinyMEDIA/src/tmedia_session.c b/trunk/tinyMEDIA/src/tmedia_session.c index c18f9768..94aaf917 100644 --- a/trunk/tinyMEDIA/src/tmedia_session.c +++ b/trunk/tinyMEDIA/src/tmedia_session.c @@ -485,6 +485,24 @@ tmedia_session_mgr_t* tmedia_session_mgr_create(tmedia_type_t type, const char* return mgr; } +/**@ingroup tmedia_session_group +*/ +int tmedia_session_mgr_set_natt_ctx(tmedia_session_mgr_t* self, tnet_nat_context_handle_t* natt_ctx, const char* public_addr) +{ + if(!self || !natt_ctx){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + TSK_OBJECT_SAFE_FREE(self->natt_ctx); + self->natt_ctx = tsk_object_ref(natt_ctx); + tsk_strupdate(&self->public_addr, public_addr); + + tmedia_session_mgr_set(self, + TMEDIA_SESSION_SET_POBJECT(self->type, "natt-ctx", self->natt_ctx), + TMEDIA_SESSION_SET_NULL()); + return 0; +} + /**@ingroup tmedia_session_group * Starts the session manager by starting all underlying sessions. * You should set both remote and local offers before calling this function. @@ -695,10 +713,10 @@ const tsdp_message_t* tmedia_session_mgr_get_lo(tmedia_session_mgr_t* self) if(self->sdp.lo){ return self->sdp.lo; } - else if((self->sdp.lo = tsdp_message_create_empty(self->addr, self->ipv6, self->sdp.lo_ver++))){ + else if((self->sdp.lo = tsdp_message_create_empty(self->public_addr ? self->public_addr : self->addr, self->ipv6, self->sdp.lo_ver++))){ /* Set connection "c=" */ tsdp_message_add_headers(self->sdp.lo, - TSDP_HEADER_C_VA_ARGS("IN", self->ipv6 ? "IP6" : "IP4", self->addr), + TSDP_HEADER_C_VA_ARGS("IN", self->ipv6 ? "IP6" : "IP4", self->public_addr ? self->public_addr : self->addr), tsk_null); }else{ self->sdp.lo_ver--; @@ -1090,11 +1108,11 @@ int _tmedia_session_mgr_load_sessions(tmedia_session_mgr_t* self) } } } - /* set ldefault values */ + /* set default values */ tmedia_session_mgr_set(self, - TMEDIA_SESSION_SET_STR(self->type, "local-ip", self->addr), - TMEDIA_SESSION_SET_STR(self->type, "local-ipver", self->ipv6 ? "ipv6" : "ipv4"), - TMEDIA_SESSION_SET_NULL()); + TMEDIA_SESSION_SET_STR(self->type, "local-ip", self->addr), + TMEDIA_SESSION_SET_STR(self->type, "local-ipver", self->ipv6 ? "ipv6" : "ipv4"), + TMEDIA_SESSION_SET_NULL()); /* load params */ _tmedia_session_mgr_apply_params(self); @@ -1175,6 +1193,9 @@ static tsk_object_t* tmedia_session_mgr_dtor(tsk_object_t * self) TSK_OBJECT_SAFE_FREE(mgr->params); + TSK_OBJECT_SAFE_FREE(mgr->natt_ctx); + TSK_FREE(mgr->public_addr); + TSK_FREE(mgr->addr); } diff --git a/trunk/tinyNET/src/dhcp/tnet_dhcp.c b/trunk/tinyNET/src/dhcp/tnet_dhcp.c index 3adcb4db..8e7dbe61 100644 --- a/trunk/tinyNET/src/dhcp/tnet_dhcp.c +++ b/trunk/tinyNET/src/dhcp/tnet_dhcp.c @@ -136,7 +136,7 @@ tnet_dhcp_reply_t* tnet_dhcp_send_request(tnet_dhcp_ctx_t* ctx, tnet_dhcp_reques if(request->type == dhcp_type_inform){ struct sockaddr_storage ss; if(!tnet_get_sockaddr(localsocket4->fd, &ss)){ - uint32_t addr = tnet_htonl((*((uint32_t*)&((struct sockaddr_in*)&ss)->sin_addr))); + uint32_t addr = tnet_htonl_2(&((struct sockaddr_in*)&ss)->sin_addr); memcpy(&request->ciaddr, &addr, 4); } } diff --git a/trunk/tinyNET/src/dhcp/tnet_dhcp_message.c b/trunk/tinyNET/src/dhcp/tnet_dhcp_message.c index 157cc97c..e4eff3bc 100644 --- a/trunk/tinyNET/src/dhcp/tnet_dhcp_message.c +++ b/trunk/tinyNET/src/dhcp/tnet_dhcp_message.c @@ -211,25 +211,25 @@ tnet_dhcp_message_t* tnet_dhcp_message_deserialize(const struct tnet_dhcp_ctx_s /*== htype (1) */ message->hops = *(dataPtr++); /*== xid (4) */ - message->xid= tnet_ntohl(*((uint32_t*)dataPtr)); + message->xid= tnet_htonl_2(dataPtr); dataPtr += 4; /*== secs (2) */ - message->secs = tnet_ntohs(*((uint16_t*)dataPtr)); + message->secs = tnet_ntohs_2(dataPtr); dataPtr += 2; /*== flags (2) */ - message->flags = tnet_ntohs(*((uint16_t*)dataPtr)); + message->flags = tnet_ntohs_2(dataPtr); dataPtr += 2; /*== ciaddr (4) */ - message->ciaddr= tnet_ntohl(*((uint32_t*)dataPtr)); + message->ciaddr= tnet_htonl_2(dataPtr); dataPtr += 4; /*== yiaddr (4) */ - message->yiaddr= tnet_ntohl(*((uint32_t*)dataPtr)); + message->yiaddr= tnet_htonl_2(dataPtr); dataPtr += 4; /*== siaddr (4) */ - message->siaddr= tnet_ntohl(*((uint32_t*)dataPtr)); + message->siaddr= tnet_htonl_2(dataPtr); dataPtr += 4; /*== giaddr (4) */ - message->giaddr= tnet_ntohl(*((uint32_t*)dataPtr)); + message->giaddr= tnet_htonl_2(dataPtr); dataPtr += 4; /*== chaddr (16[max]) */ memcpy(message->chaddr, dataPtr, message->hlen>16 ? 16 : message->hlen); @@ -241,7 +241,7 @@ tnet_dhcp_message_t* tnet_dhcp_message_deserialize(const struct tnet_dhcp_ctx_s memcpy(message->file, dataPtr, 128); dataPtr += 128; /*== Magic Cookie (4) */ - if(tnet_ntohl(*((uint32_t*)dataPtr)) != TNET_DHCP_MAGIC_COOKIE){ + if(tnet_htonl_2(dataPtr) != TNET_DHCP_MAGIC_COOKIE){ TSK_DEBUG_ERROR("Invalid DHCP magic cookie."); // Do not exit ==> continue parsing. } diff --git a/trunk/tinyNET/src/dhcp/tnet_dhcp_option.c b/trunk/tinyNET/src/dhcp/tnet_dhcp_option.c index af7d0d31..39a28e92 100644 --- a/trunk/tinyNET/src/dhcp/tnet_dhcp_option.c +++ b/trunk/tinyNET/src/dhcp/tnet_dhcp_option.c @@ -290,7 +290,7 @@ static tsk_object_t* tnet_dhcp_option_dns_ctor(tsk_object_t * self, va_list * ap | 6 | n | a1 | a2 | a3 | a4 | a1 | a2 | ... +-----+-----+-----+-----+-----+-----+-----+-----+-- */ - address = tnet_ntohl(*((uint32_t*)payloadPtr)); + address = tnet_htonl_2(payloadPtr); tsk_sprintf(&ip4, "%u.%u.%u.%u", (address>>24)&0xFF, (address>>16)&0xFF, (address>>8)&0xFF, (address>>0)&0xFF); addrstring = tsk_string_create(ip4); diff --git a/trunk/tinyNET/src/dhcp/tnet_dhcp_option_sip.c b/trunk/tinyNET/src/dhcp/tnet_dhcp_option_sip.c index 72cd6182..69d564e4 100644 --- a/trunk/tinyNET/src/dhcp/tnet_dhcp_option_sip.c +++ b/trunk/tinyNET/src/dhcp/tnet_dhcp_option_sip.c @@ -92,7 +92,8 @@ static tsk_object_t* tnet_dhcp_option_sip_ctor(tsk_object_t * self, va_list * ap char* ip4 = 0; while(payloadPtr < payloadEnd){ - address = tnet_ntohl(*((uint32_t*)++payloadPtr)); + ++payloadPtr; + address = tnet_htonl_2(payloadPtr); tsk_sprintf(&ip4, "%u.%u.%u.%u", (address>>24)&0xFF, (address>>16)&0xFF, (address>>8)&0xFF, (address>>0)&0xFF); diff --git a/trunk/tinyNET/src/dhcp6/tnet_dhcp6.c b/trunk/tinyNET/src/dhcp6/tnet_dhcp6.c index b2c426f6..cc524769 100644 --- a/trunk/tinyNET/src/dhcp6/tnet_dhcp6.c +++ b/trunk/tinyNET/src/dhcp6/tnet_dhcp6.c @@ -107,7 +107,7 @@ tnet_dhcp6_reply_t* tnet_dhcp6_send_request(const tnet_dhcp6_ctx_t* ctx, tnet_dh //if(request->type == dhcp_type_inform){ // struct sockaddr_storage ss; // if(!tnet_get_sockaddr(localsocket4->fd, &ss)){ - // uint32_t addr = tnet_htonl((*((uint32_t*)&((struct sockaddr_in*)&ss)->sin_addr))); + // uint32_t addr = tnet_htonl_2(&((struct sockaddr_in*)&ss)->sin_addr); // memcpy(&request->ciaddr, &addr, 4); // } //} diff --git a/trunk/tinyNET/src/dhcp6/tnet_dhcp6_duid.c b/trunk/tinyNET/src/dhcp6/tnet_dhcp6_duid.c index a155c60f..378ba3c0 100644 --- a/trunk/tinyNET/src/dhcp6/tnet_dhcp6_duid.c +++ b/trunk/tinyNET/src/dhcp6/tnet_dhcp6_duid.c @@ -90,7 +90,7 @@ tnet_dhcp6_duid_t* tnet_dhcp6_duid_deserialize(const void* data, tsk_size_t size goto bail; } - type = (tnet_dhcp6_duid_type_t) tnet_ntohs(*((uint16_t*)dataPtr)); + type = (tnet_dhcp6_duid_type_t) tnet_ntohs_2(dataPtr); dataPtr += 2; bail: diff --git a/trunk/tinyNET/src/dhcp6/tnet_dhcp6_option.c b/trunk/tinyNET/src/dhcp6/tnet_dhcp6_option.c index 79d267f8..7f7aca42 100644 --- a/trunk/tinyNET/src/dhcp6/tnet_dhcp6_option.c +++ b/trunk/tinyNET/src/dhcp6/tnet_dhcp6_option.c @@ -89,10 +89,10 @@ tnet_dhcp6_option_t* tnet_dhcp6_option_deserialize(const void* data, tsk_size_t goto bail; } - code = (tnet_dhcp6_option_code_t) tnet_ntohs(*((uint16_t*)dataPtr)); + code = (tnet_dhcp6_option_code_t) tnet_ntohs_2(dataPtr); dataPtr += 2; - len = tnet_ntohs(*((uint16_t*)dataPtr)); + len = tnet_ntohs_2(dataPtr); dataPtr += 2; switch(code){ diff --git a/trunk/tinyNET/src/dns/tnet_dns.c b/trunk/tinyNET/src/dns/tnet_dns.c index 3bd2faa9..0683cbb5 100644 --- a/trunk/tinyNET/src/dns/tnet_dns.c +++ b/trunk/tinyNET/src/dns/tnet_dns.c @@ -669,7 +669,7 @@ int tnet_dns_query_srv(tnet_dns_ctx_t *ctx, const char* service, char** hostname TSK_OBJECT_SAFE_FREE(response); - return (hostname && !tsk_strempty(*hostname)) ? 0 : -2; + return (hostname && !tsk_strnullORempty(*hostname)) ? 0 : -2; } /**@ingroup tnet_dns_group diff --git a/trunk/tinyNET/src/dns/tnet_dns_a.c b/trunk/tinyNET/src/dns/tnet_dns_a.c index aed2359a..f53e070a 100644 --- a/trunk/tinyNET/src/dns/tnet_dns_a.c +++ b/trunk/tinyNET/src/dns/tnet_dns_a.c @@ -73,7 +73,7 @@ static tsk_object_t* tnet_dns_a_ctor(tsk_object_t * self, va_list * app) if(rddata && rdlength && (rdlength == 4/* 32bits */)){ // ==> DESERIALIZATION /* ADDRESS */ - uint32_t address = tnet_ntohl(*((uint32_t*)rddata)); + uint32_t address = tnet_htonl_2(rddata); tsk_sprintf(&(a->address), "%u.%u.%u.%u", (address>>24)&0xFF, (address>>16)&0xFF, (address>>8)&0xFF, (address>>0)&0xFF); } else{ diff --git a/trunk/tinyNET/src/dns/tnet_dns_aaaa.c b/trunk/tinyNET/src/dns/tnet_dns_aaaa.c index 339ee442..ab1fa645 100644 --- a/trunk/tinyNET/src/dns/tnet_dns_aaaa.c +++ b/trunk/tinyNET/src/dns/tnet_dns_aaaa.c @@ -75,8 +75,8 @@ static tsk_object_t* tnet_dns_aaaa_ctor(tsk_object_t * self, va_list * app) // ==> DESERIALIZATION /* ADDRESS */ tsk_sprintf(&(aaaa->address), "%x:%x:%x:%x:%x:%x:%x:%x", - tnet_ntohs(*((uint16_t*)&rddata[0])), tnet_ntohs(*((uint16_t*)&rddata[2])), tnet_ntohs(*((uint16_t*)&rddata[4])), tnet_ntohs(*((uint16_t*)&rddata[6])), - tnet_ntohs(*((uint16_t*)&rddata[8])), tnet_ntohs(*((uint16_t*)&rddata[10])), tnet_ntohs(*((uint16_t*)&rddata[12])), tnet_ntohs(*((uint16_t*)&rddata[14]))); + tnet_ntohs_2(&rddata[0]), tnet_ntohs_2(&rddata[2]), tnet_ntohs_2(&rddata[4]), tnet_ntohs_2(&rddata[6]), + tnet_ntohs_2(&rddata[8]), tnet_ntohs_2(&rddata[10]), tnet_ntohs_2(&rddata[12]), tnet_ntohs_2(&rddata[14])); } else{ TSK_DEBUG_ERROR("Invalid IPv6 address."); diff --git a/trunk/tinyNET/src/dns/tnet_dns_message.c b/trunk/tinyNET/src/dns/tnet_dns_message.c index 10c13f89..cc2c2e25 100644 --- a/trunk/tinyNET/src/dns/tnet_dns_message.c +++ b/trunk/tinyNET/src/dns/tnet_dns_message.c @@ -216,11 +216,11 @@ tnet_dns_message_t* tnet_dns_message_deserialize(const uint8_t *data, tsk_size_t /* === HEADER ===*/ /* ID */ - message->Header.ID = tnet_ntohs(*((uint16_t*)dataPtr)); + message->Header.ID = tnet_ntohs_2(dataPtr); dataPtr += 2; /* |QR| Opcode |AA|TC|RD|RA| Z | RCODE | */ { - uint16_t flags = tnet_ntohs(*((uint16_t*)dataPtr)); + uint16_t flags = tnet_ntohs_2(dataPtr); message->Header.QR = (flags >> 15); message->Header.OPCODE = ((flags >> 11) & 0x000F); @@ -234,16 +234,16 @@ tnet_dns_message_t* tnet_dns_message_deserialize(const uint8_t *data, tsk_size_t dataPtr += 2; } /* QDCOUNT */ - message->Header.QDCOUNT = tnet_ntohs(*((uint16_t*)dataPtr)); + message->Header.QDCOUNT = tnet_ntohs_2(dataPtr); dataPtr += 2; /* ANCOUNT */ - message->Header.ANCOUNT = tnet_ntohs(*((uint16_t*)dataPtr)); + message->Header.ANCOUNT = tnet_ntohs_2(dataPtr); dataPtr += 2; /* NSCOUNT */ - message->Header.NSCOUNT = tnet_ntohs(*((uint16_t*)dataPtr)); + message->Header.NSCOUNT = tnet_ntohs_2(dataPtr); dataPtr += 2; /* ARCOUNT */ - message->Header.ARCOUNT = tnet_ntohs(*((uint16_t*)dataPtr)); + message->Header.ARCOUNT = tnet_ntohs_2(dataPtr); dataPtr += 2; /* === Queries ===*/ diff --git a/trunk/tinyNET/src/dns/tnet_dns_mx.c b/trunk/tinyNET/src/dns/tnet_dns_mx.c index 08210fe6..8537af7d 100644 --- a/trunk/tinyNET/src/dns/tnet_dns_mx.c +++ b/trunk/tinyNET/src/dns/tnet_dns_mx.c @@ -68,7 +68,7 @@ static tsk_object_t* tnet_dns_mx_ctor(tsk_object_t * self, va_list * app) if(rdlength){ // ==> DESERIALIZATION /* PREFERENCE */ - mx->preference = tnet_ntohs(*((uint16_t*)(((uint8_t*)data) + offset))); + mx->preference = tnet_ntohs_2(((uint8_t*)data) + offset); offset += 2; /* EXCHANGE */ tnet_dns_rr_qname_deserialize(data, &(mx->exchange), &offset); diff --git a/trunk/tinyNET/src/dns/tnet_dns_naptr.c b/trunk/tinyNET/src/dns/tnet_dns_naptr.c index 5368577b..4152734a 100644 --- a/trunk/tinyNET/src/dns/tnet_dns_naptr.c +++ b/trunk/tinyNET/src/dns/tnet_dns_naptr.c @@ -71,10 +71,10 @@ static tsk_object_t* tnet_dns_naptr_ctor(tsk_object_t * self, va_list * app) if(rdlength){ // ==> DESERIALIZATION /* ORDER */ - naptr->order = tnet_ntohs(*((uint16_t*)(((uint8_t*)data) + offset))); + naptr->order = tnet_ntohs_2(((uint8_t*)data) + offset); offset += 2; /* PREFERENCE */ - naptr->preference = tnet_ntohs(*((uint16_t*)(((uint8_t*)data) + offset))); + naptr->preference = tnet_ntohs_2(((uint8_t*)data) + offset); offset += 2; /* FLAGS */ tnet_dns_rr_charstring_deserialize(data, &(naptr->flags), &offset); diff --git a/trunk/tinyNET/src/dns/tnet_dns_rr.c b/trunk/tinyNET/src/dns/tnet_dns_rr.c index 1b47b6dc..ddf3682c 100644 --- a/trunk/tinyNET/src/dns/tnet_dns_rr.c +++ b/trunk/tinyNET/src/dns/tnet_dns_rr.c @@ -260,16 +260,16 @@ tnet_dns_rr_t* tnet_dns_rr_deserialize(const void* data, tsk_size_t size, tsk_si tnet_dns_rr_qname_deserialize(dataStart, &qname, offset); dataPtr = (dataStart + *offset); /* == Parse QTYPE == */ - qtype = (tnet_dns_qtype_t)tnet_ntohs(*((uint16_t*)dataPtr)); + qtype = (tnet_dns_qtype_t)tnet_ntohs_2(dataPtr); dataPtr += 2, *offset += 2; /* == Parse QCLASS == */ - qclass = (tnet_dns_qclass_t)tnet_ntohs(*((uint16_t*)dataPtr)); + qclass = (tnet_dns_qclass_t)tnet_ntohs_2(dataPtr); dataPtr += 2, *offset += 2; /* == Parse TTL == */ - ttl = tnet_ntohl(*((uint32_t*)dataPtr)); + ttl = tnet_htonl_2(dataPtr); dataPtr += 4, *offset += 4; /* == Parse RDLENGTH == */ - rdlength = tnet_ntohs(*((uint16_t*)dataPtr)); + rdlength = tnet_ntohs_2(dataPtr); dataPtr += 2, *offset += 2; switch(qtype){ diff --git a/trunk/tinyNET/src/dns/tnet_dns_soa.c b/trunk/tinyNET/src/dns/tnet_dns_soa.c index c9180235..0b8be151 100644 --- a/trunk/tinyNET/src/dns/tnet_dns_soa.c +++ b/trunk/tinyNET/src/dns/tnet_dns_soa.c @@ -70,19 +70,19 @@ static tsk_object_t* tnet_dns_soa_ctor(tsk_object_t * self, va_list * app) /* RNAME */ tnet_dns_rr_qname_deserialize(data, &(soa->rname), &offset); /* SERIAL */ - soa->serial = tnet_ntohl(*((uint32_t*)(((uint8_t*)data) + offset))), + soa->serial = tnet_htonl_2(((uint8_t*)data) + offset), offset += 2; /* REFRESH */ - soa->refresh = tnet_ntohl(*((uint32_t*)(((uint8_t*)data) + offset))), + soa->refresh = tnet_htonl_2(((uint8_t*)data) + offset), offset += 2; /* RETRY */ - soa->retry = tnet_ntohl(*((uint32_t*)(((uint8_t*)data) + offset))), + soa->retry = tnet_htonl_2(((uint8_t*)data) + offset), offset += 2; /* EXPIRE */ - soa->expire = tnet_ntohl(*((uint32_t*)(((uint8_t*)data) + offset))), + soa->expire = tnet_htonl_2(((uint8_t*)data) + offset), offset += 2; /* MINIMUM */ - soa->minimum = tnet_ntohl(*((uint32_t*)(((uint8_t*)data) + offset))), + soa->minimum = tnet_htonl_2(((uint8_t*)data) + offset), offset += 2; } } diff --git a/trunk/tinyNET/src/dns/tnet_dns_srv.c b/trunk/tinyNET/src/dns/tnet_dns_srv.c index 8a580226..2fc8f415 100644 --- a/trunk/tinyNET/src/dns/tnet_dns_srv.c +++ b/trunk/tinyNET/src/dns/tnet_dns_srv.c @@ -68,13 +68,13 @@ static tsk_object_t* tnet_dns_srv_ctor(tsk_object_t * self, va_list * app) if(rdlength){ // ==> DESERIALIZATION /* Priority */ - srv->priority = tnet_ntohs(*((uint16_t*)(((uint8_t*)data) + offset))), + srv->priority = tnet_ntohs_2(((uint8_t*)data) + offset), offset += 2; /* Weight */ - srv->weight = tnet_ntohs(*((uint16_t*)(((uint8_t*)data) + offset))), + srv->weight = tnet_ntohs_2(((uint8_t*)data) + offset), offset += 2; /* Port */ - srv->port = tnet_ntohs(*((uint16_t*)(((uint8_t*)data) + offset))), + srv->port = tnet_ntohs_2(((uint8_t*)data) + offset), offset += 2; /* Target */ tnet_dns_rr_qname_deserialize(data, &(srv->target), &offset); diff --git a/trunk/tinyNET/src/stun/tnet_stun.c b/trunk/tinyNET/src/stun/tnet_stun.c index ec2691f2..5faa9745 100644 --- a/trunk/tinyNET/src/stun/tnet_stun.c +++ b/trunk/tinyNET/src/stun/tnet_stun.c @@ -164,17 +164,17 @@ tnet_stun_response_t* tnet_stun_send_unreliably(tnet_fd_t localFD, uint16_t RTO, tv.tv_sec += rto/1000; tv.tv_usec += (rto% 1000) * 1000; - ret = tnet_sockfd_sendto(localFD, server, buffer->data, buffer->size); - FD_ZERO(&set); FD_SET(localFD, &set); + ret = tnet_sockfd_sendto(localFD, server, buffer->data, buffer->size); + if((ret = select(localFD+1, &set, NULL, NULL, &tv))<0){ goto bail; } else if(ret == 0){ /* timeout */ - + TSK_DEBUG_INFO("STUN request timedout at %d", i); rto *= 2; continue; } @@ -184,11 +184,18 @@ tnet_stun_response_t* tnet_stun_send_unreliably(tnet_fd_t localFD, uint16_t RTO, tsk_size_t len = 0; void* data = 0; + TSK_DEBUG_INFO("STUN request got response"); + /* Check how how many bytes are pending */ if((ret = tnet_ioctlt(localFD, FIONREAD, &len))<0){ goto bail; } + if(len==0){ + TSK_DEBUG_INFO("tnet_ioctlt() returent zero bytes"); + continue; + } + /* Receive pending data */ data = tsk_calloc(len, sizeof(uint8_t)); if((ret = tnet_sockfd_recvfrom(localFD, data, len, 0, server))<0){ diff --git a/trunk/tinyNET/src/stun/tnet_stun_attribute.c b/trunk/tinyNET/src/stun/tnet_stun_attribute.c index 0d59024f..4f74e203 100644 --- a/trunk/tinyNET/src/stun/tnet_stun_attribute.c +++ b/trunk/tinyNET/src/stun/tnet_stun_attribute.c @@ -162,8 +162,8 @@ tnet_stun_attribute_t* tnet_stun_attribute_deserialize(const void* data, tsk_siz tnet_stun_attribute_t *attribute = 0; const uint8_t* dataPtr = data; - tnet_stun_attribute_type_t type = (tnet_stun_attribute_type_t)tnet_ntohs(*((uint16_t*)dataPtr)); - uint16_t length = tnet_ntohs(*(((uint16_t*)dataPtr)+1)); + tnet_stun_attribute_type_t type = (tnet_stun_attribute_type_t)tnet_ntohs_2(dataPtr); + uint16_t length = tnet_ntohs_2(&dataPtr[2]); /* Check validity */ if(!data || size<=4/* Type(2-bytes) plus Length (2-bytes) */) @@ -212,7 +212,7 @@ tnet_stun_attribute_t* tnet_stun_attribute_deserialize(const void* data, tsk_siz /* RFC 5389 - 15.5. FINGERPRINT*/ case stun_fingerprint: { - uint32_t fingerprint = tnet_ntohl(*((uint32_t*)dataPtr)); + uint32_t fingerprint = tnet_htonl_2(dataPtr); attribute = (tnet_stun_attribute_t *)tnet_stun_attribute_fingerprint_create(fingerprint); break; } @@ -278,7 +278,7 @@ tnet_stun_attribute_t* tnet_stun_attribute_deserialize(const void* data, tsk_siz } default: - TSK_DEBUG_ERROR("==> NOT IMPLEMENTED"); + //TSK_DEBUG_WARN("==> NOT IMPLEMENTED"); break; } @@ -491,11 +491,11 @@ static tsk_object_t* tnet_stun_attribute_mapped_addr_ctor(tsk_object_t * self, v TNET_STUN_ATTRIBUTE(attribute)->length = payload_size; attribute->family = (tnet_stun_addr_family_t) (*(payloadPtr++)); - attribute->port = tnet_ntohs(*((uint16_t*)payloadPtr)); + attribute->port = tnet_ntohs_2(payloadPtr); payloadPtr+=2; if(attribute->family == stun_ipv4){ - uint32_t addr = tnet_ntohl(*((uint32_t*)payloadPtr)); + uint32_t addr = tnet_htonl_2(payloadPtr); memcpy(attribute->address, &addr, 4); payloadPtr+=4; } @@ -507,7 +507,7 @@ static tsk_object_t* tnet_stun_attribute_mapped_addr_ctor(tsk_object_t * self, v uint32_t addr; for(i=0; iaddress[i], &addr, 4); payloadPtr+=4; } @@ -562,7 +562,7 @@ static tsk_object_t* tnet_stun_attribute_xmapped_addr_ctor(tsk_object_t * self, XOR'ing it with the most significant 16 bits of the magic cookie, and then the converting the result to network byte order. */ - attribute->xport = tnet_ntohs(*((uint16_t*)payloadPtr)); + attribute->xport = tnet_ntohs_2(payloadPtr); attribute->xport ^= 0x2112; payloadPtr+=2; @@ -580,8 +580,7 @@ static tsk_object_t* tnet_stun_attribute_xmapped_addr_ctor(tsk_object_t * self, uint32_t addr; for(i=0; ixaddress[i], &addr, 4); payloadPtr+=4; } @@ -734,7 +733,7 @@ static tsk_object_t* tnet_stun_attribute_errorcode_ctor(tsk_object_t * self, va_ tsk_size_t payload_size = va_arg(*app, tsk_size_t); if(payload_size >4){ - uint32_t code = tnet_ntohl(*((uint32_t*)payload)); + uint32_t code = tnet_htonl_2(payload); payload += 4; attribute->_class = code >>8; @@ -928,11 +927,11 @@ static tsk_object_t* tnet_stun_attribute_altserver_ctor(tsk_object_t * self, va_ TNET_STUN_ATTRIBUTE(attribute)->length = payload_size; attribute->family = (tnet_stun_addr_family_t) (*(payloadPtr++)); - attribute->port = tnet_ntohs(*((uint16_t*)payloadPtr)); + attribute->port = tnet_ntohs_2(payloadPtr); payloadPtr+=2; if(attribute->family == stun_ipv4){ - uint32_t addr = tnet_ntohl(*((uint32_t*)payloadPtr)); + uint32_t addr = tnet_htonl_2(payloadPtr); memcpy(attribute->server, &addr, 4); payloadPtr+=4; } diff --git a/trunk/tinyNET/src/stun/tnet_stun_message.c b/trunk/tinyNET/src/stun/tnet_stun_message.c index 5df403f3..97690922 100644 --- a/trunk/tinyNET/src/stun/tnet_stun_message.c +++ b/trunk/tinyNET/src/stun/tnet_stun_message.c @@ -241,12 +241,12 @@ tnet_stun_message_t* tnet_stun_message_deserialize(const uint8_t *data, tsk_size /* Message Type */ - message->type = (tnet_stun_message_type_t)tnet_ntohs(*((uint16_t*)dataPtr)); + message->type = (tnet_stun_message_type_t)tnet_ntohs_2(dataPtr); dataPtr += 2; /* Message Length */ - message->length = tnet_ntohs(*((uint16_t*)dataPtr)); + message->length = tnet_ntohs_2(dataPtr); dataPtr += 2; /* Check message validity diff --git a/trunk/tinyNET/src/tnet_endianness.c b/trunk/tinyNET/src/tnet_endianness.c index 74eb7b1c..afa61c25 100644 --- a/trunk/tinyNET/src/tnet_endianness.c +++ b/trunk/tinyNET/src/tnet_endianness.c @@ -48,6 +48,13 @@ unsigned short tnet_htons(unsigned short x) } } +/* Memory alignment hack */ +unsigned short tnet_htons_2(const void* px) +{ + unsigned short y = TSK_TO_UINT16((const uint8_t*)px); + return tnet_htons(y); +} + /** Converts a 32-bit value from host to TCP/IP network byte order (big-endian). * @param x The 32-bit (in host byte order) value to convert. * @retval @a x in TCP/IP network byte order. @@ -65,6 +72,13 @@ unsigned long tnet_htonl(unsigned long x) } } +/* Memory alignment hack */ +unsigned long tnet_htonl_2(const void* px) +{ + unsigned long y = TSK_TO_UINT32((const uint8_t*)px); + return tnet_htonl(y); +} + /** Indicates whether we are on a Big Endian host or not.
* IMPORTANT: Before calling this function, you should initialize the network stack by using * @ref tnet_startup(). diff --git a/trunk/tinyNET/src/tnet_endianness.h b/trunk/tinyNET/src/tnet_endianness.h index 94f5671e..cf257298 100644 --- a/trunk/tinyNET/src/tnet_endianness.h +++ b/trunk/tinyNET/src/tnet_endianness.h @@ -37,11 +37,15 @@ TNET_BEGIN_DECLS TINYNET_API TNET_INLINE unsigned short tnet_htons(unsigned short x); +TINYNET_API TNET_INLINE unsigned short tnet_htons_2(const void* px); TINYNET_API TNET_INLINE unsigned long tnet_htonl(unsigned long x); +TINYNET_API TNET_INLINE unsigned long tnet_htonl_2(const void* px); TINYNET_API TNET_INLINE tsk_bool_t tnet_is_BE(); #define tnet_ntohs(x) tnet_htons(x) +#define tnet_ntohs_2(px) tnet_htons_2(px) #define tnet_ntohl(x) tnet_htonl(x) +#define tnet_ntohl_2(px) tnet_htonl_2(px) TNET_BEGIN_DECLS diff --git a/trunk/tinyNET/src/tnet_nat.c b/trunk/tinyNET/src/tnet_nat.c index 11db0a2f..cd39b68e 100644 --- a/trunk/tinyNET/src/tnet_nat.c +++ b/trunk/tinyNET/src/tnet_nat.c @@ -115,7 +115,7 @@ int __pred_find_turn_channel_binding(const tsk_list_item_t* item, const void* id /** * Formats binary IP address as string. * - * @param in_ip The binary IP address to format. + * @param in_ip The binary IP address to format (in Host byte order). * @param family The address family. * @param [in,out] out_ip The output string * @@ -123,18 +123,29 @@ int __pred_find_turn_channel_binding(const tsk_list_item_t* item, const void* id **/ int tnet_stun_address_tostring(const uint8_t in_ip[16], tnet_stun_addr_family_t family, char** out_ip) { - if(family == stun_ipv6){ + /*if(family == stun_ipv6){ tsk_sprintf(out_ip, "%x:%x:%x:%x:%x:%x:%x:%x", - tnet_ntohs(*((uint16_t*)&in_ip[0])), tnet_ntohs(*((uint16_t*)&in_ip[2])), tnet_ntohs(*((uint16_t*)&in_ip[4])), tnet_ntohs(*((uint16_t*)&in_ip[6])), - tnet_ntohs(*((uint16_t*)&in_ip[8])), tnet_ntohs(*((uint16_t*)&in_ip[10])), tnet_ntohs(*((uint16_t*)&in_ip[12])), tnet_ntohs(*((uint16_t*)&in_ip[14]))); + tnet_ntohs_2(&in_ip[0]), tnet_ntohs_2(&in_ip[2]), tnet_ntohs_2(&in_ip[4]), tnet_ntohs_2(&in_ip[6]), + tnet_ntohs_2(&in_ip[8]), tnet_ntohs_2(&in_ip[10]), tnet_ntohs_2(&in_ip[12]), tnet_ntohs_2(&in_ip[14])); } else if(family == stun_ipv4){ - uint32_t address = *((uint32_t*)in_ip); - address = /*tnet_ntohl*/(address); tsk_sprintf(out_ip, "%u.%u.%u.%u", (address>>24)&0xFF, (address>>16)&0xFF, (address>>8)&0xFF, (address>>0)&0xFF); return 0; } + else{ + TSK_DEBUG_ERROR("Unsupported address family: %u.", family); + }*/ + if(family == stun_ipv6){ + tsk_sprintf(out_ip, "%x:%x:%x:%x:%x:%x:%x:%x", + TSK_TO_UINT16(&in_ip[0]), TSK_TO_UINT16(&in_ip[2]), TSK_TO_UINT16(&in_ip[4]), TSK_TO_UINT16(&in_ip[6]), + TSK_TO_UINT16(&in_ip[8]), TSK_TO_UINT16(&in_ip[10]), TSK_TO_UINT16(&in_ip[12]), TSK_TO_UINT16(&in_ip[14])); + } + else if(family == stun_ipv4){ + tsk_sprintf(out_ip, "%u.%u.%u.%u", in_ip[0], in_ip[1], in_ip[2], in_ip[3]); + + return 0; + } else{ TSK_DEBUG_ERROR("Unsupported address family: %u.", family); } @@ -228,15 +239,25 @@ int tnet_nat_stun_get_reflexive_address(const tnet_nat_context_handle_t* self, t tnet_stun_binding_t *binding = item->data; /*STUN2: XOR-MAPPED-ADDRESS */ if(binding->xmaddr){ - int ret = tnet_stun_address_tostring(binding->xmaddr->xaddress, binding->xmaddr->family, ipaddress); - *port = /*tnet_ntohs*/(binding->xmaddr->xport); + int ret = 0; + if(ipaddress){ + ret = tnet_stun_address_tostring(binding->xmaddr->xaddress, binding->xmaddr->family, ipaddress); + } + if(port){ + *port = /*tnet_ntohs*/(binding->xmaddr->xport); + } return ret; } /*STUN1: MAPPED-ADDRESS*/ if(binding->maddr){ - int ret = tnet_stun_address_tostring(binding->maddr->address, binding->maddr->family, ipaddress); - *port = /*tnet_ntohs*/(binding->maddr->port); + int ret = 0; + if(ipaddress){ + ret = tnet_stun_address_tostring(binding->maddr->address, binding->maddr->family, ipaddress); + } + if(port){ + *port = /*tnet_ntohs*/(binding->maddr->port); + } return ret; } } diff --git a/trunk/tinyNET/src/tnet_nat.h b/trunk/tinyNET/src/tnet_nat.h index 9a4b21b7..023f2d55 100644 --- a/trunk/tinyNET/src/tnet_nat.h +++ b/trunk/tinyNET/src/tnet_nat.h @@ -49,8 +49,10 @@ TNET_BEGIN_DECLS #define TNET_NAT_DEFAULT_RTO 500 /**@ingroup tnet_nat_group * Number of retransmission for UDP retransmission in millisecond. +/* 7.2.1. Sending over UDP + Rc SHOULD be configurable and SHOULD have a default of 7. */ -#define TNET_NAT_DEFAULT_RC 7 +#define TNET_NAT_DEFAULT_RC /*7*/3/* 7 is too hight */ /**@ingroup tnet_nat_group */ #define TNET_NAT_TCP_UDP_DEFAULT_PORT 3478 diff --git a/trunk/tinyNET/src/tnet_transport.c b/trunk/tinyNET/src/tnet_transport.c index f62d1dc9..6b27c5ab 100644 --- a/trunk/tinyNET/src/tnet_transport.c +++ b/trunk/tinyNET/src/tnet_transport.c @@ -109,7 +109,7 @@ const char* tnet_transport_get_description(const tnet_transport_handle_t *handle } else{ TSK_DEBUG_ERROR("NULL transport object."); - return 0; + return tsk_null; } } @@ -128,18 +128,85 @@ int tnet_transport_get_ip_n_port_2(const tnet_transport_handle_t *handle, tnet_i { const tnet_transport_t *transport = handle; if(transport){ - // do not check the master, let the apllication die if "null" + // do not check the master, let the application die if "null" if(ip){ memcpy(*ip, transport->master->ip, sizeof(transport->master->ip)); } if(port){ *port = transport->master->port; } + return 0; } else{ TSK_DEBUG_ERROR("NULL transport object."); + return -1; } - return -1; +} + +int tnet_transport_set_natt_ctx(tnet_transport_handle_t *handle, tnet_nat_context_handle_t* natt_ctx) +{ + tnet_transport_t *transport = handle; + + if(transport && natt_ctx){ + TSK_OBJECT_SAFE_FREE(transport->natt_ctx); // delete old + transport->natt_ctx = tsk_object_ref(natt_ctx); + return 0; + } + else{ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } +} + +int tnet_transport_get_public_ip_n_port(const tnet_transport_handle_t *handle, tnet_fd_t fd, tnet_ip_t *ip, tnet_port_t *port) +{ + tsk_bool_t stun_ok = tsk_false; + tnet_nat_context_handle_t* natt_ctx; + const tnet_transport_t *transport = handle; + if(!transport){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(TNET_SOCKET_TYPE_IS_DGRAM(transport->type) && (natt_ctx = tsk_object_ref(transport->natt_ctx))){ + tnet_stun_binding_id_t bind_id = TNET_STUN_INVALID_BINDING_ID; + // if the socket is already monitored by the transport we should pause beacuse both the transport and + // NAT binder will try to read from it + tsk_bool_t pause_socket = (TSK_RUNNABLE(transport)->running || TSK_RUNNABLE(transport)->started); + + // FIXME: change when ICE will be fully implemented + TSK_DEBUG_INFO("Getting public address"); + // Pause the soket + if(pause_socket){ + tnet_transport_pause_socket(transport, fd, tsk_true); + } + // Performs STUN binding + bind_id = tnet_nat_stun_bind(transport->natt_ctx, fd); + // Resume the socket + if(pause_socket){ + tnet_transport_pause_socket(transport, fd, tsk_false); + } + + if(TNET_STUN_IS_VALID_BINDING_ID(bind_id)){ + char* public_ip = tsk_null; + if(tnet_nat_stun_get_reflexive_address(transport->natt_ctx, bind_id, &public_ip, port) == 0){ + if(ip && public_ip){ + tsk_size_t ip_len = tsk_strlen(public_ip); + memcpy(ip, public_ip, ip_len> sizeof(*ip)?sizeof(*ip):ip_len); + } + stun_ok = tsk_true; + } + TSK_FREE(public_ip); + tnet_nat_stun_unbind(transport->natt_ctx, bind_id); + } + tsk_object_unref(natt_ctx); + } + + if(!stun_ok){ + return tnet_transport_get_ip_n_port(handle, fd, ip, port); + } + + return 0; } tnet_socket_type_t tnet_transport_get_type(const tnet_transport_handle_t *handle) @@ -154,6 +221,18 @@ tnet_socket_type_t tnet_transport_get_type(const tnet_transport_handle_t *handle return tnet_socket_type_invalid; } +tnet_fd_t tnet_transport_get_master_fd(const tnet_transport_handle_t *handle) +{ + if(handle){ + const tnet_transport_t *transport = handle; + return transport->master->fd; + } + else{ + TSK_DEBUG_ERROR("NULL transport object."); + } + return TNET_INVALID_FD; +} + /** * Connects a socket. * @param handle The transport to use to connect() the socket. The new socket will be managed by this transport. @@ -282,7 +361,7 @@ static void *run(void* self) tsk_list_item_t *curr; tnet_transport_t *transport = self; - TSK_RUNNABLE(transport)->running = tsk_true; // VERY IMPORTANT --> needed by the main thread + TSK_DEBUG_INFO("Transport::run() - enter"); /* create main thread */ if((ret = tsk_thread_create(transport->mainThreadId, tnet_transport_mainthread, transport))){ /* More important than "tsk_runnable_start" ==> start it first. */ @@ -293,8 +372,7 @@ static void *run(void* self) TSK_RUNNABLE_RUN_BEGIN(transport); - if((curr = TSK_RUNNABLE_POP_FIRST(transport))) - { + if((curr = TSK_RUNNABLE_POP_FIRST(transport))){ const tnet_transport_event_t *e = (const tnet_transport_event_t*)curr->data; if(transport->callback){ @@ -305,6 +383,8 @@ static void *run(void* self) TSK_RUNNABLE_RUN_END(transport); + TSK_DEBUG_INFO("Transport::run() - exit"); + return tsk_null; } @@ -355,6 +435,7 @@ static tsk_object_t* tnet_transport_dtor(tsk_object_t * self) tnet_transport_shutdown(transport); TSK_OBJECT_SAFE_FREE(transport->master); TSK_OBJECT_SAFE_FREE(transport->context); + TSK_OBJECT_SAFE_FREE(transport->natt_ctx); TSK_FREE(transport->description); TSK_FREE(transport->local_ip); diff --git a/trunk/tinyNET/src/tnet_transport.h b/trunk/tinyNET/src/tnet_transport.h index 0618f7f0..41f078d4 100644 --- a/trunk/tinyNET/src/tnet_transport.h +++ b/trunk/tinyNET/src/tnet_transport.h @@ -34,6 +34,8 @@ #include "tnet_socket.h" #include "tnet_utils.h" +#include "tnet_nat.h" + #include "tsk_runnable.h" TNET_BEGIN_DECLS @@ -75,11 +77,14 @@ TINYNET_API int tnet_transport_issecure(const tnet_transport_handle_t *handle); TINYNET_API const char* tnet_transport_get_description(const tnet_transport_handle_t *handle); TINYNET_API int tnet_transport_get_ip_n_port(const tnet_transport_handle_t *handle, tnet_fd_t fd, tnet_ip_t *ip, tnet_port_t *port); TINYNET_API int tnet_transport_get_ip_n_port_2(const tnet_transport_handle_t *handle, tnet_ip_t *ip, tnet_port_t *port); +TINYNET_API int tnet_transport_set_natt_ctx(tnet_transport_handle_t *handle, tnet_nat_context_handle_t* natt_ctx); +TINYNET_API int tnet_transport_get_public_ip_n_port(const tnet_transport_handle_t *handle, tnet_fd_t fd, tnet_ip_t *ip, tnet_port_t *port); TINYNET_API int tnet_transport_isconnected(const tnet_transport_handle_t *handle, tnet_fd_t fd); TINYNET_API int tnet_transport_have_socket(const tnet_transport_handle_t *handle, tnet_fd_t fd); TINYNET_API const tnet_tls_socket_handle_t* tnet_transport_get_tlshandle(const tnet_transport_handle_t *handle, tnet_fd_t fd); TINYNET_API int tnet_transport_add_socket(const tnet_transport_handle_t *handle, tnet_fd_t fd, tnet_socket_type_t type, tsk_bool_t take_ownership, tsk_bool_t isClient); +TINYNET_API int tnet_transport_pause_socket(const tnet_transport_handle_t *handle, tnet_fd_t fd, tsk_bool_t pause); TINYNET_API int tnet_transport_remove_socket(const tnet_transport_handle_t *handle, tnet_fd_t* fd); TINYNET_API tnet_fd_t tnet_transport_connectto(const tnet_transport_handle_t *handle, const char* host, tnet_port_t port, tnet_socket_type_t type); #define tnet_transport_connectto_2(handle, host, port) tnet_transport_connectto(handle, host, port, tnet_transport_get_type(handle)) @@ -89,6 +94,7 @@ TINYNET_API tsk_size_t tnet_transport_sendto(const tnet_transport_handle_t *hand TINYNET_API int tnet_transport_set_callback(const tnet_transport_handle_t *handle, tnet_transport_cb_f callback, const void* callback_data); TINYNET_API tnet_socket_type_t tnet_transport_get_type(const tnet_transport_handle_t *handle); +TINYNET_API tnet_fd_t tnet_transport_get_master_fd(const tnet_transport_handle_t *handle); TINYNET_API int tnet_transport_shutdown(tnet_transport_handle_t* handle); typedef struct tnet_transport_s @@ -97,6 +103,7 @@ typedef struct tnet_transport_s tnet_socket_type_t type; char* local_ip; + tnet_nat_context_handle_t* natt_ctx; tnet_socket_t *master; tsk_object_t *context; diff --git a/trunk/tinyNET/src/tnet_transport_poll.c b/trunk/tinyNET/src/tnet_transport_poll.c index 921012b1..743e2fc8 100644 --- a/trunk/tinyNET/src/tnet_transport_poll.c +++ b/trunk/tinyNET/src/tnet_transport_poll.c @@ -47,6 +47,7 @@ typedef struct transport_socket_s tnet_fd_t fd; tsk_bool_t owner; tsk_bool_t connected; + tsk_bool_t paused; tnet_socket_type_t type; tnet_tls_socket_handle_t* tlshandle; @@ -103,7 +104,7 @@ int tnet_transport_add_socket(const tnet_transport_handle_t *handle, tnet_fd_t f // signal if(context->pipeW){ if((ret = write(context->pipeW, &c, 1)) > 0){ - TSK_DEBUG_INFO("Socket added."); + TSK_DEBUG_INFO("Socket added (external call) %d", fd); return 0; } else{ @@ -116,8 +117,27 @@ int tnet_transport_add_socket(const tnet_transport_handle_t *handle, tnet_fd_t f } } -/* Remove socket - */ +int tnet_transport_pause_socket(const tnet_transport_handle_t *handle, tnet_fd_t fd, tsk_bool_t pause) +{ + tnet_transport_t *transport = (tnet_transport_t*)handle; + transport_context_t *context; + transport_socket_t* socket; + + if(!transport || !(context = (transport_context_t*)transport->context)){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if((socket = getSocket(context, fd))){ + socket->paused = pause; + } + else{ + TSK_DEBUG_WARN("Socket does not exist in this context"); + } + return 0; +} + +/* Remove socket */ int tnet_transport_remove_socket(const tnet_transport_handle_t *handle, tnet_fd_t *fd) { tnet_transport_t *transport = (tnet_transport_t*)handle; @@ -126,6 +146,8 @@ int tnet_transport_remove_socket(const tnet_transport_handle_t *handle, tnet_fd_ tsk_size_t i; tsk_bool_t found = tsk_false; + TSK_DEBUG_INFO("Removing socket %d", *fd); + if(!transport){ TSK_DEBUG_ERROR("Invalid server handle."); return ret; @@ -226,6 +248,7 @@ int tnet_transport_have_socket(const tnet_transport_handle_t *handle, tnet_fd_t return (getSocket((transport_context_t*)transport->context, fd) != 0); } + const tnet_tls_socket_handle_t* tnet_transport_get_tlshandle(const tnet_transport_handle_t *handle, tnet_fd_t fd) { tnet_transport_t *transport = (tnet_transport_t*)handle; @@ -280,7 +303,7 @@ int addSocket(tnet_fd_t fd, tnet_socket_type_t type, tnet_transport_t *transport tsk_safeobj_lock(context); context->ufds[context->count].fd = fd; - context->ufds[context->count].events = context->events; + context->ufds[context->count].events = (fd == context->pipeR) ? TNET_POLLIN : context->events; context->ufds[context->count].revents = 0; context->sockets[context->count] = sock; @@ -288,7 +311,7 @@ int addSocket(tnet_fd_t fd, tnet_socket_type_t type, tnet_transport_t *transport tsk_safeobj_unlock(context); - TSK_DEBUG_INFO("Socket added"); + TSK_DEBUG_INFO("Socket added %d", fd); return 0; } @@ -362,7 +385,7 @@ int tnet_transport_stop(tnet_transport_t *transport) } context = transport->context; - + if((ret = tsk_runnable_stop(TSK_RUNNABLE(transport)))){ return ret; } @@ -371,7 +394,9 @@ int tnet_transport_stop(tnet_transport_t *transport) static char c = '\0'; // signal + tsk_safeobj_lock(context); // =>MUST write(context->pipeW, &c, 1); + tsk_safeobj_unlock(context); } if(transport->mainThreadId[0]){ @@ -405,11 +430,11 @@ int tnet_transport_prepare(tnet_transport_t *transport) /* set events */ context->events = TNET_POLLIN | TNET_POLLNVAL | TNET_POLLERR; if(TNET_SOCKET_TYPE_IS_STREAM(transport->master->type)){ - context->events |= TNET_POLLPRI -#if !defined(ANDROID) - | TNET_POLLHUP -#endif - ; +// context->events |= TNET_POLLPRI +//#if !defined(ANDROID) +// | TNET_POLLHUP /* FIXME: always present */ +//#endif +// ; } /* Start listening */ @@ -431,11 +456,13 @@ int tnet_transport_prepare(tnet_transport_t *transport) context->pipeW = pipes[1]; /* add R side */ + TSK_DEBUG_INFO("pipeR fd=%d", context->pipeR); if((ret = addSocket(context->pipeR, transport->master->type, transport, tsk_true, tsk_false))){ goto bail; } /* Add the master socket to the context. */ + TSK_DEBUG_INFO("master fd=%d", transport->master->fd); if((ret = addSocket(transport->master->fd, transport->master->type, transport, tsk_true, tsk_false))){ TSK_DEBUG_ERROR("Failed to add master socket"); goto bail; @@ -461,8 +488,7 @@ int tnet_transport_unprepare(tnet_transport_t *transport) } if(!transport->prepared){ - TSK_DEBUG_ERROR("Transport not prepared."); - return -2; + return 0; } transport->prepared = tsk_false; @@ -492,14 +518,13 @@ void *tnet_transport_mainthread(void *param) TSK_DEBUG_INFO("Starting [%s] server with IP {%s} on port {%d}...", transport->description, transport->master->ip, transport->master->port); - while(TSK_RUNNABLE(transport)->running) - { + while(TSK_RUNNABLE(transport)->running || TSK_RUNNABLE(transport)->started){ if((ret = tnet_poll(context->ufds, context->count, -1)) < 0){ TNET_PRINT_LAST_ERROR("poll have failed."); goto bail; } - if(!TSK_RUNNABLE(transport)->running){ + if(!TSK_RUNNABLE(transport)->running && !TSK_RUNNABLE(transport)->started){ goto bail; } @@ -509,7 +534,19 @@ void *tnet_transport_mainthread(void *param) /* == == */ for(i=0; icount; i++) { - if(!context->ufds[i].revents || context->ufds[i].fd == context->pipeR){ + if(!context->ufds[i].revents){ + continue; + } + + if(context->ufds[i].fd == context->pipeR){ + if(context->ufds[i].revents & TNET_POLLIN){ + static char __buffer[64]; + if(read(context->pipeR, __buffer, sizeof(__buffer))<0){ + TNET_PRINT_LAST_ERROR("Failed to read from the Pipe"); + } + } + TSK_DEBUG_INFO("PipeR event %d", context->ufds[i].revents); + context->ufds[i].revents = 0; continue; } @@ -520,11 +557,22 @@ void *tnet_transport_mainthread(void *param) if(context->ufds[i].revents & TNET_POLLIN) { tsk_size_t len = 0; - void* buffer = 0; + void* buffer = tsk_null; tnet_transport_event_t* e; /* TSK_DEBUG_INFO("NETWORK EVENT FOR SERVER [%s] -- TNET_POLLIN", transport->description); */ + + // + // FIXME: check if accept() is needed or not + // + + /* check whether the socket is paused or not */ + if(active_socket->paused){ + TSK_DEBUG_INFO("Socket is paused"); + break; + } + /* Retrieve the amount of pending data. * IMPORTANT: If you are using Symbian please update your SDK to the latest build (August 2009) to have 'FIONREAD'. * This apply whatever you are using the 3rd or 5th edition. diff --git a/trunk/tinyNET/src/tnet_transport_win32.c b/trunk/tinyNET/src/tnet_transport_win32.c index 41e9f95d..d209adb0 100644 --- a/trunk/tinyNET/src/tnet_transport_win32.c +++ b/trunk/tinyNET/src/tnet_transport_win32.c @@ -43,6 +43,7 @@ typedef struct transport_socket_s tnet_fd_t fd; unsigned owner:1; unsigned connected:1; + unsigned paused:1; tnet_socket_type_t type; tnet_tls_socket_handle_t* tlshandle; @@ -160,6 +161,26 @@ int tnet_transport_add_socket(const tnet_transport_handle_t *handle, tnet_fd_t f return -1; } +int tnet_transport_pause_socket(const tnet_transport_handle_t *handle, tnet_fd_t fd, tsk_bool_t pause) +{ + tnet_transport_t *transport = (tnet_transport_t*)handle; + transport_context_t *context; + transport_socket_t* socket; + + if(!transport || !(context = (transport_context_t*)transport->context)){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if((socket = getSocket(context, fd))){ + socket->paused = pause; + } + else{ + TSK_DEBUG_WARN("Socket does not exist in this context"); + } + return 0; +} + /* Remove socket */ int tnet_transport_remove_socket(const tnet_transport_handle_t *handle, tnet_fd_t* fd) @@ -170,14 +191,9 @@ int tnet_transport_remove_socket(const tnet_transport_handle_t *handle, tnet_fd_ tsk_size_t i; tsk_bool_t found = tsk_false; - if(!transport){ - TSK_DEBUG_ERROR("Invalid server handle."); - return ret; - } - - if(!(context = (transport_context_t*)transport->context)){ - TSK_DEBUG_ERROR("Invalid context."); - return -2; + if(!transport || !(context = (transport_context_t*)transport->context)){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; } for(i=0; icount; i++){ @@ -362,8 +378,7 @@ static int removeSocket(int index, transport_context_t *context) tsk_safeobj_lock(context); - if(index < (int)context->count) - { + if(index < (int)context->count){ /* Close the socket if we are the owner. */ if(context->sockets[index]->owner){ @@ -474,8 +489,7 @@ int tnet_transport_unprepare(tnet_transport_t *transport) } if(!transport->prepared){ - TSK_DEBUG_ERROR("Transport not prepared."); - return -2; + return 0; } transport->prepared = tsk_false; @@ -503,7 +517,7 @@ void *tnet_transport_mainthread(void *param) TSK_DEBUG_INFO("Starting [%s] server with IP {%s} on port {%d}...", transport->description, transport->master->ip, transport->master->port); - while(TSK_RUNNABLE(transport)->running) + while(TSK_RUNNABLE(transport)->running || TSK_RUNNABLE(transport)->started) { /* Wait for multiple events */ if((evt = WSAWaitForMultipleEvents(context->count, context->events, FALSE, WSA_INFINITE, FALSE)) == WSA_WAIT_FAILED){ @@ -511,7 +525,7 @@ void *tnet_transport_mainthread(void *param) goto bail; } - if(!TSK_RUNNABLE(transport)->running){ + if(!TSK_RUNNABLE(transport)->running && !TSK_RUNNABLE(transport)->started){ goto bail; } @@ -594,6 +608,12 @@ void *tnet_transport_mainthread(void *param) /* TSK_DEBUG_INFO("NETWORK EVENT FOR SERVER [%s] -- FD_READ", transport->description); */ + /* check whether the socket is paused or not */ + if(active_socket->paused){ + TSK_DEBUG_INFO("Socket is paused"); + break; + } + if(networkEvents.iErrorCode[FD_READ_BIT]){ TSK_RUNNABLE_ENQUEUE(transport, event_error, transport->callback_data, active_socket->fd); TNET_PRINT_LAST_ERROR("READ FAILED."); diff --git a/trunk/tinyNET/src/tnet_utils.c b/trunk/tinyNET/src/tnet_utils.c index d36bf0ce..e9422ca7 100644 --- a/trunk/tinyNET/src/tnet_utils.c +++ b/trunk/tinyNET/src/tnet_utils.c @@ -720,7 +720,9 @@ int tnet_getaddrinfo(const char *node, const char *service, const struct addrinf **/ void tnet_freeaddrinfo(struct addrinfo *ai) { - freeaddrinfo(ai); + if(ai){ + freeaddrinfo(ai); + } } /**@ingroup tnet_utils_group diff --git a/trunk/tinyNET/src/turn/tnet_turn.c b/trunk/tinyNET/src/turn/tnet_turn.c index c7c467c6..08adb13a 100644 --- a/trunk/tinyNET/src/turn/tnet_turn.c +++ b/trunk/tinyNET/src/turn/tnet_turn.c @@ -427,12 +427,14 @@ tnet_turn_channel_binding_id_t tnet_turn_channel_bind(const tnet_nat_context_t* if(channel_binding){ if(((struct sockaddr*)peer)->sa_family == AF_INET){ struct sockaddr_in *sin = ((struct sockaddr_in*)peer); + uint32_t _sin_addr; channel_binding->xpeer = tnet_turn_attribute_xpeer_addr_create_null(); channel_binding->xpeer->family = stun_ipv4; channel_binding->xpeer->xport = ((sin->sin_port) ^ tnet_htons(0x2112)); - *((uint32_t*)channel_binding->xpeer->xaddress) = ((*((uint32_t*)&sin->sin_addr)) ^tnet_htonl(TNET_STUN_MAGIC_COOKIE)); + _sin_addr = tnet_htonl_2(&sin->sin_addr) ^tnet_htonl(TNET_STUN_MAGIC_COOKIE); + memcpy(channel_binding->xpeer->xaddress, &_sin_addr, sizeof(_sin_addr)); } else if(((struct sockaddr*)peer)->sa_family == AF_INET6){ TSK_DEBUG_ERROR("IPv6 not supported."); diff --git a/trunk/tinyNET/src/turn/tnet_turn_attribute.c b/trunk/tinyNET/src/turn/tnet_turn_attribute.c index 09c08dcd..0bc55ad2 100644 --- a/trunk/tinyNET/src/turn/tnet_turn_attribute.c +++ b/trunk/tinyNET/src/turn/tnet_turn_attribute.c @@ -122,7 +122,7 @@ tnet_stun_attribute_t* tnet_turn_attribute_deserialize(tnet_stun_attribute_type_ /* draft-ietf-behave-turn-16 - 14.1. CHANNEL-NUMBER */ case stun_channel_number: { - uint32_t number = tnet_ntohl(*((uint32_t*)dataPtr)); + uint32_t number = tnet_htonl_2(dataPtr); attribute = (tnet_stun_attribute_t *)tnet_turn_attribute_channelnum_create(number); break; } @@ -130,7 +130,7 @@ tnet_stun_attribute_t* tnet_turn_attribute_deserialize(tnet_stun_attribute_type_ /* draft-ietf-behave-turn-16 - 14.2. LIFETIME */ case stun_lifetime: { - uint32_t lifetime = tnet_ntohl(*((uint32_t*)dataPtr)); + uint32_t lifetime = tnet_htonl_2(dataPtr); attribute = (tnet_stun_attribute_t *)tnet_turn_attribute_lifetime_create(lifetime); break; } @@ -472,7 +472,7 @@ static tsk_object_t* tnet_turn_attribute_xrelayed_addr_ctor(tsk_object_t * self, attribute->family = (tnet_stun_addr_family_t)(*(payloadPtr++)); - attribute->xport = tnet_ntohs(*((uint16_t*)payloadPtr)); + attribute->xport = tnet_ntohs_2(payloadPtr); attribute->xport ^= 0x2112; payloadPtr+=2; @@ -483,7 +483,7 @@ static tsk_object_t* tnet_turn_attribute_xrelayed_addr_ctor(tsk_object_t * self, uint32_t addr; for(i=0; ixaddress[i], &addr, 4); payloadPtr+=4; diff --git a/trunk/tinyNET/test/test.c b/trunk/tinyNET/test/test.c index 310669a4..f27e05ca 100644 --- a/trunk/tinyNET/test/test.c +++ b/trunk/tinyNET/test/test.c @@ -43,9 +43,9 @@ #define RUN_TEST_TRANSPORT 0 #define RUN_TEST_AUTH 0 #define RUN_TEST_STUN 0 -#define RUN_TEST_NAT 0 +#define RUN_TEST_NAT 1 #define RUN_TEST_IFACES 0 -#define RUN_TEST_DNS 1 +#define RUN_TEST_DNS 0 #define RUN_TEST_DHCP 0 #define RUN_TEST_DHCP6 0 #define RUN_TEST_TLS 0 diff --git a/trunk/tinyNET/test/test_nat.h b/trunk/tinyNET/test/test_nat.h index ffbae072..ed7af3cb 100644 --- a/trunk/tinyNET/test/test_nat.h +++ b/trunk/tinyNET/test/test_nat.h @@ -210,8 +210,8 @@ bail: void test_nat() { test_nat_stun(); - test_nat_turn(); - tsk_thread_sleep(1000); + //test_nat_turn(); + //tsk_thread_sleep(1000); } diff --git a/trunk/tinyRTP/include/tinyrtp/trtp_manager.h b/trunk/tinyRTP/include/tinyrtp/trtp_manager.h index aa510e96..6e376599 100644 --- a/trunk/tinyRTP/include/tinyrtp/trtp_manager.h +++ b/trunk/tinyRTP/include/tinyrtp/trtp_manager.h @@ -31,7 +31,7 @@ #include "tinyrtp_config.h" -#include "tnet_transport.h" +#include "tinynet.h" TRTP_BEGIN_DECLS @@ -57,6 +57,9 @@ typedef struct trtp_manager_s tnet_port_t remote_port; struct sockaddr_storage remote_addr; + char* public_ip; + tnet_port_t public_port; + const void* callback_data; trtp_manager_rtp_cb_f callback; } rtp; @@ -67,6 +70,9 @@ typedef struct trtp_manager_s struct sockaddr_storage remote_addr; tnet_socket_t* local_socket; + char* public_ip; + tnet_port_t public_port; + const void* callback_data; trtp_manager_rtcp_cb_f callback; } rtcp; @@ -82,6 +88,7 @@ trtp_manager_t; TINYRTP_API trtp_manager_t* trtp_manager_create(tsk_bool_t enable_rtcp, const char* local_ip, tsk_bool_t ipv6); TINYRTP_API int trtp_manager_prepare(trtp_manager_t*self); TINYRTP_API tsk_bool_t trtp_manager_is_prepared(trtp_manager_t* self); +TINYRTP_API int trtp_manager_set_natt_ctx(trtp_manager_t* self, tnet_nat_context_handle_t* natt_ctx); TINYRTP_API int trtp_manager_set_rtp_callback(trtp_manager_t* self, trtp_manager_rtp_cb_f callback, const void* callback_data); TINYRTP_API int trtp_manager_set_payload_type(trtp_manager_t* self, uint8_t payload_type); TINYRTP_API int trtp_manager_set_rtp_remote(trtp_manager_t* self, const char* remote_ip, tnet_port_t remote_port); diff --git a/trunk/tinyRTP/src/trtp_manager.c b/trunk/tinyRTP/src/trtp_manager.c index 7a845dd2..ed5bd7ff 100644 --- a/trunk/tinyRTP/src/trtp_manager.c +++ b/trunk/tinyRTP/src/trtp_manager.c @@ -123,7 +123,7 @@ int trtp_manager_prepare(trtp_manager_t* self) /* Creates local rtp and rtcp sockets */ while(retry_count--){ /* random number in the range 1024 to 65535 */ -#if 1 +#if 0 tnet_port_t local_port = 6060; #else tnet_port_t local_port = ((rand() % 64510) + 1025); @@ -138,6 +138,8 @@ int trtp_manager_prepare(trtp_manager_t* self) if((self->transport = tnet_transport_create(self->local_ip, local_port, socket_type, "RTP/RTCP Manager"))){ /* set callback function */ tnet_transport_set_callback(self->transport, trtp_transport_layer_cb, self); + tsk_strupdate(&self->rtp.public_ip, self->transport->master->ip); + self->rtp.public_port = local_port; } else { TSK_DEBUG_ERROR("Failed to create RTP/RTCP Transport"); @@ -151,6 +153,10 @@ int trtp_manager_prepare(trtp_manager_t* self) TSK_OBJECT_SAFE_FREE(self->transport); continue; } + else{ + tsk_strupdate(&self->rtcp.public_ip, self->rtcp.local_socket->ip); + self->rtcp.public_port = local_port + 1; + } } TSK_DEBUG_INFO("RTP/RTCP manager[End]: Trying to bind to random ports"); @@ -170,6 +176,34 @@ tsk_bool_t trtp_manager_is_prepared(trtp_manager_t* self) return self->transport == tsk_null ? tsk_false : tsk_true; } +/** Sets NAT Traversal context */ +int trtp_manager_set_natt_ctx(trtp_manager_t* self, tnet_nat_context_handle_t* natt_ctx) +{ + int ret; + + if(!self || !self->transport){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + if(!(ret = tnet_transport_set_natt_ctx(self->transport, natt_ctx))){ + tnet_ip_t public_ip = {0}; + tnet_port_t public_port = 0; + /* get RTP public IP and Port */ + if(!tnet_transport_get_public_ip_n_port(self->transport, self->transport->master->fd, &public_ip, &public_port)){ + tsk_strupdate(&self->rtp.public_ip, public_ip); + self->rtp.public_port = public_port; + } + /* get RTCP public IP and Port */ + memset(public_ip, 0, sizeof(public_ip)); + public_port = 0; + if(self->rtcp.local_socket && !tnet_transport_get_public_ip_n_port(self->transport, self->rtcp.local_socket->fd, &public_ip, &public_port)){ + tsk_strupdate(&self->rtcp.public_ip, public_ip); + self->rtcp.public_port = public_port; + } + } + return ret; +} + /** Sets RTP callback */ int trtp_manager_set_rtp_callback(trtp_manager_t* self, trtp_manager_rtp_cb_f callback, const void* callback_data) { @@ -414,9 +448,11 @@ static tsk_object_t* trtp_manager_dtor(tsk_object_t * self) /* rtp */ TSK_FREE(manager->rtp.remote_ip); + TSK_FREE(manager->rtp.public_ip); /* rtcp */ TSK_FREE(manager->rtcp.remote_ip); + TSK_FREE(manager->rtcp.public_ip); TSK_OBJECT_SAFE_FREE(manager->rtcp.local_socket); TSK_FREE(manager->local_ip); diff --git a/trunk/tinySAK/src/tsk_common.h b/trunk/tinySAK/src/tsk_common.h index 3d08498c..acff4e3c 100644 --- a/trunk/tinySAK/src/tsk_common.h +++ b/trunk/tinySAK/src/tsk_common.h @@ -47,6 +47,11 @@ typedef int tsk_boolean_t; #define TSK_MAX(a,b) (((a) > (b)) ? (a) : (b)) #define TSK_ABS(a) (((a)< 0) ? -(a) : (a)) +// used to avoid making *((uint32_t*)ptr) which don't respect memory alignment on +// some embedded platforms +#define TSK_TO_UINT32(u8_ptr) (((uint32_t)(u8_ptr)[0]) | ((uint32_t)(u8_ptr)[1])<<8 | ((uint32_t)(u8_ptr)[2])<<16 | ((uint32_t)(u8_ptr)[3])<<24) +#define TSK_TO_UINT16(u8_ptr) (((uint16_t)(u8_ptr)[0]) | ((uint16_t)(u8_ptr)[1])<<8) + typedef int tsk_ssize_t; /**< Signed size */ typedef unsigned int tsk_size_t; /**< Unsigned size */ diff --git a/trunk/tinySAK/src/tsk_string.c b/trunk/tinySAK/src/tsk_string.c index 0f35bf03..4e40d7b7 100644 --- a/trunk/tinySAK/src/tsk_string.c +++ b/trunk/tinySAK/src/tsk_string.c @@ -539,6 +539,7 @@ void tsk_str_from_hex(const uint8_t *hex, tsk_size_t size, char* str) **/ void tsk_str_to_hex(const char *str, tsk_size_t size, uint8_t* hex) { + // to avoid SIGBUS error when memory is misaligned do not use sscanf("%2x") TSK_DEBUG_FATAL("Not implemented."); } diff --git a/trunk/tinySAK/src/tsk_uuid.c b/trunk/tinySAK/src/tsk_uuid.c index 48c83fb8..18c04f3e 100644 --- a/trunk/tinySAK/src/tsk_uuid.c +++ b/trunk/tinySAK/src/tsk_uuid.c @@ -59,7 +59,13 @@ int tsk_uuidgenerate(tsk_uuidstring_t *result) /* XOR the SHA-1 result with random numbers. */ for(i=0; i<(TSK_UUID_DIGEST_SIZE*2); i+=4){ +#if 0 *((uint32_t*)&sha1result[i]) ^= rand(); +#else + k = rand(); + sha1result[i] ^= k, sha1result[i + 1] ^= k, + sha1result[i + 2] ^= k, sha1result[i + 3] ^= k; +#endif for(k=0; knet_transport) : -1) @@ -84,10 +86,10 @@ tsip_uri_t* tsip_transport_get_uri(const tsip_transport_t *self, int lr); #define tsip_transport_isconnected(transport) (transport ? tnet_transport_isconnected(transport->net_transport, transport->connectedFD) : 0) #define tsip_transport_get_description(transport) (transport ? tnet_transport_get_description(transport->net_transport) : 0) #define tsip_transport_get_ip_n_port(transport, ip, port) (transport ? tnet_transport_get_ip_n_port(transport->net_transport, transport->connectedFD, ip, port) : -1) +#define tsip_transport_get_public_ip_n_port(transport, ip, port) (transport ? tnet_transport_get_public_ip_n_port(transport->net_transport, transport->connectedFD, ip, port) : -1) #define tsip_transport_connectto(transport, host, port, type) (transport ? (transport->connectedFD=tnet_transport_connectto(transport->net_transport, host, port, type)) : TNET_INVALID_FD) #define tsip_transport_connectto_2(transport, host, port) (transport ? (transport->connectedFD=tnet_transport_connectto_2(transport->net_transport, host, port)) : TNET_INVALID_FD) -#define tsip_transport_sendto(transport, to, buf, size) (transport ? tnet_transport_sendto(transport->net_transport, transport->connectedFD, to, buf, size) : 0) #define tsip_transport_set_callback(transport, callback, callback_data) (transport ? tnet_transport_set_callback(transport->net_transport, callback, callback_data) : -1) diff --git a/trunk/tinySIP/include/tsip.h b/trunk/tinySIP/include/tsip.h index 81fcb0ed..a1effd00 100644 --- a/trunk/tinySIP/include/tsip.h +++ b/trunk/tinySIP/include/tsip.h @@ -40,8 +40,7 @@ #include "tinysip/sigcomp/tsip_sigcomp.h" -#include "tnet_socket.h" -#include "dns/tnet_dns.h" +#include "tinynet.h" #include "tsk_runnable.h" @@ -97,9 +96,12 @@ typedef enum tsip_stack_param_type_e /* === Dummy Headers === */ tsip_pname_header, - /* === User Data === */ - tsip_pname_userdata + /* Nat Traversal */ + tsip_pname_stun_server, + tsip_pname_stun_cred, + /* === User Data === */ + tsip_pname_userdata, } tsip_stack_param_type_t; @@ -449,7 +451,7 @@ int ret = tsip_stack_set(stack, * @param NAME_STR The name of the header to remove. * @code * int ret = tsip_stack_set(stack, -* TSIP_STACK_UNSET_HEADER("User-Agent""), +* TSIP_STACK_UNSET_HEADER("User-Agent"), * TSIP_STACK_UNSET_HEADER("Allow"), * TSIP_STACK_UNSET_HEADER("My_Header"), * TSIP_STACK_SET_NULL()); @@ -460,6 +462,36 @@ int ret = tsip_stack_set(stack, #define TSIP_STACK_SET_HEADER(NAME_STR, VALUE_STR) tsip_pname_header, (const char*)NAME_STR, (const char*)VALUE_STR #define TSIP_STACK_UNSET_HEADER(NAME_STR) TSIP_STACK_SET_HEADER(NAME_STR, ((const char*)-1)) +/* === NAT Traversal === */ +/**@ingroup tsip_stack_group +* @def TSIP_STACK_SET_STUN_SERVER +* Sets the IP address and port of the STUN2 server. Also used for TURN. +* @param IP_STR The IPv4/IPv6 address for FQDN of the STUN2/TURN address. +* @param PORT_UINT The server port (default is 3478 for both TCP and UDP, and 5349 for TLS) +* @code +* int ret = tsip_stack_set(stack, +* TSIP_STACK_SET_STUN_SERVER("numb.viagenie.ca", 3478), +* TSIP_STACK_SET_NULL()); +* @endcode +* +* @sa @ref TSIP_STACK_SET_STUN_CRED() +*/ +/**@ingroup tsip_stack_group +* @def TSIP_STACK_SET_STUN_CRED +* Sets STUN/TURN credentials. +* @param USR_STR The login. +* @param PASSORD_STR The password +* @code +* int ret = tsip_stack_set(stack, +* TSIP_STACK_SET_STUN_CRED("bob@open-ims.test", "mysecret"), +* TSIP_STACK_SET_NULL()); +* @endcode +* +* @sa @ref TSIP_STACK_SET_STUN_SERVER() +*/ +#define TSIP_STACK_SET_STUN_SERVER(IP_STR, PORT_UINT) tsip_pname_stun_server, (const char*)IP_STR, (unsigned)PORT_UINT +#define TSIP_STACK_SET_STUN_CRED(USR_STR, PASSORD_STR) tsip_pname_stun_cred, (const char*)USR_STR, (const char*)PASSORD_STR + /* === User Data === */ /**@ingroup tsip_stack_group * @def TSIP_STACK_SET_USERDATA @@ -476,6 +508,7 @@ int ret = tsip_stack_set(stack, + /* 3GPP IMS/LTE stack (for internal use). only tsip_stack_handle_t should be visible. */ typedef struct tsip_stack_s { @@ -565,9 +598,21 @@ typedef struct tsip_stack_s /* DNS context */ tnet_dns_ctx_t *dns_ctx; - /* DHCP context */ + /* NAT Traversal context */ + struct { + // STUN + struct{ + char* ip; + tnet_port_t port; + char* login; + char* pwd; + } stun; + // TURN + // ICE + tnet_nat_context_handle_t* ctx; + } natt; - + /* DHCP context */ /* QoS */ diff --git a/trunk/tinySIP/src/dialogs/tsip_dialog_invite.c b/trunk/tinySIP/src/dialogs/tsip_dialog_invite.c index dea4c72d..3f836479 100644 --- a/trunk/tinySIP/src/dialogs/tsip_dialog_invite.c +++ b/trunk/tinySIP/src/dialogs/tsip_dialog_invite.c @@ -387,6 +387,9 @@ int tsip_dialog_invite_process_ro(tsip_dialog_invite_t *self, const tsip_message type = tmedia_type_from_sdp(sdp_ro); } self->msession_mgr = tmedia_session_mgr_create(type, TSIP_DIALOG_GET_STACK(self)->network.local_ip, tsk_false, (sdp_ro == tsk_null)); + if(TSIP_DIALOG_GET_STACK(self)->natt.ctx){ + tmedia_session_mgr_set_natt_ctx(self->msession_mgr, TSIP_DIALOG_GET_STACK(self)->natt.ctx, TSIP_DIALOG_GET_STACK(self)->network.aor.ip); + } } if(sdp_ro){ @@ -399,6 +402,10 @@ int tsip_dialog_invite_process_ro(tsip_dialog_invite_t *self, const tsip_message /* start session manager */ if(!self->msession_mgr->started && (self->msession_mgr->sdp.lo && self->msession_mgr->sdp.ro)){ ret = tmedia_session_mgr_start(self->msession_mgr); + if(ret == 0 && TSIP_DIALOG(self)->state == tsip_early){ + TSIP_DIALOG_INVITE_SIGNAL(self, tsip_m_early_media, + TSIP_RESPONSE_CODE(message), TSIP_RESPONSE_PHRASE(message), message); + } } bail: diff --git a/trunk/tinySIP/src/dialogs/tsip_dialog_invite.client.c b/trunk/tinySIP/src/dialogs/tsip_dialog_invite.client.c index 0eacfa6a..1b6aacc0 100644 --- a/trunk/tinySIP/src/dialogs/tsip_dialog_invite.client.c +++ b/trunk/tinySIP/src/dialogs/tsip_dialog_invite.client.c @@ -118,7 +118,10 @@ int c0000_Started_2_Outgoing_X_oINVITE(va_list *app) /* This is the first FSM transaction when you try to make an audio/video/msrp call */ if(!self->msession_mgr){ self->msession_mgr = tmedia_session_mgr_create(action ? action->media.type : tmedia_all, - TSIP_DIALOG_GET_STACK(self)->network.local_ip, tsk_false, tsk_true); + TSIP_DIALOG_GET_STACK(self)->network.local_ip, tsk_false, tsk_true); + if(TSIP_DIALOG_GET_STACK(self)->natt.ctx){ + tmedia_session_mgr_set_natt_ctx(self->msession_mgr, TSIP_DIALOG_GET_STACK(self)->natt.ctx, TSIP_DIALOG_GET_STACK(self)->network.aor.ip); + } } /* We are the client */ diff --git a/trunk/tinySIP/src/dialogs/tsip_dialog_register.client.c b/trunk/tinySIP/src/dialogs/tsip_dialog_register.client.c index d95a1015..3f5fea2a 100644 --- a/trunk/tinySIP/src/dialogs/tsip_dialog_register.client.c +++ b/trunk/tinySIP/src/dialogs/tsip_dialog_register.client.c @@ -644,6 +644,9 @@ int tsip_dialog_register_Any_2_Terminated_X_Error(va_list *app) tsip_dialog_register_t *self = va_arg(*app, tsip_dialog_register_t *); const tsip_response_t *response = va_arg(*app, const tsip_response_t *); + /* set last error (or info) */ + tsip_dialog_set_lasterror(TSIP_DIALOG(self), TSIP_RESPONSE_PHRASE(response)); + /* Alert the user. */ if(response){ TSIP_DIALOG_REGISTER_SIGNAL(self, self->unregistering ? tsip_ao_unregister : tsip_ao_register, diff --git a/trunk/tinySIP/src/transports/tsip_transport.c b/trunk/tinySIP/src/transports/tsip_transport.c index 01288c35..ea8dccac 100644 --- a/trunk/tinySIP/src/transports/tsip_transport.c +++ b/trunk/tinySIP/src/transports/tsip_transport.c @@ -104,10 +104,8 @@ int tsip_transport_addvia(const tsip_transport_t* self, const char *branch, tsip return 0; } -int tsip_transport_msg_update_aor(const tsip_transport_t* self, tsip_message_t *msg) +int tsip_transport_msg_update_aor(tsip_transport_t* self, tsip_message_t *msg) { - tnet_ip_t ip; - tnet_port_t port; int ret = 0; /* already updtated (e.g. retrans)? */ @@ -116,25 +114,25 @@ int tsip_transport_msg_update_aor(const tsip_transport_t* self, tsip_message_t * } /* retrieves the transport ip address and port */ - if(tsip_transport_get_ip_n_port(self, &ip, &port)){ - return -1; + if(!self->stack->network.aor.ip && !self->stack->network.aor.port){ + tnet_ip_t ip = {0}; + tnet_port_t port = 0; + if((ret = tsip_transport_get_public_ip_n_port(self, &ip, &port))){ + TSK_DEBUG_ERROR("Failed to get public IP"); + return ret; + } + else{ + ((tsip_stack_t*)self->stack)->network.aor.ip = tsk_strdup(ip); + ((tsip_stack_t*)self->stack)->network.aor.port = port; + } } /* === Host and port === */ if(msg->Contact && msg->Contact->uri){ tsk_strupdate(&(msg->Contact->uri->scheme), self->scheme); - if(!tsk_strnullORempty(self->stack->network.aor.ip)){ /* user supplied his own IP address? */ - tsk_strupdate(&(msg->Contact->uri->host), self->stack->network.aor.ip); - } - else{ /* the ip address from the transport */ - tsk_strupdate(&(msg->Contact->uri->host), ip); - } - if(self->stack->network.aor.port){ /* user supplied his own port? */ - msg->Contact->uri->port = self->stack->network.aor.port; - } - else{ /* use port from the transport */ - msg->Contact->uri->port = port; - } + tsk_strupdate(&(msg->Contact->uri->host), self->stack->network.aor.ip); + msg->Contact->uri->port = self->stack->network.aor.port; + msg->Contact->uri->host_type = TNET_SOCKET_TYPE_IS_IPV6(self->type) ? host_ipv6 : host_ipv4; /* for serializer ...who know? */ tsk_params_add_param(&msg->Contact->uri->params, "transport", self->protocol); } @@ -196,6 +194,19 @@ int tsip_transport_set_tlscerts(tsip_transport_t *self, const char* ca, const ch return 0; } +tsk_size_t tsip_transport_send_raw(const tsip_transport_t* self, const void* data, tsk_size_t size) +{ + tsk_size_t ret = 0; + if(TNET_SOCKET_TYPE_IS_DGRAM(self->type)){ + ret = tnet_transport_sendto(self->net_transport, self->connectedFD, (const struct sockaddr *)&self->pcscf_addr, data, size); + } + else{ + ret = tnet_transport_send(self->net_transport, self->connectedFD, data, size); + } + + return ret; +} + /* sends a request * all callers of this function should provide a sigcomp-id */ @@ -210,13 +221,13 @@ tsk_size_t tsip_transport_send(const tsip_transport_t* self, const char *branch, * CANCEL will have the same Via and Contact headers as the request it cancel */ if(TSIP_MESSAGE_IS_REQUEST(msg) && (!TSIP_REQUEST_IS_ACK(msg) || (TSIP_REQUEST_IS_ACK(msg) && !msg->firstVia)) && !TSIP_REQUEST_IS_CANCEL(msg)){ tsip_transport_addvia(self, branch, msg); /* should be done before tsip_transport_msg_update() which could use the Via header */ - tsip_transport_msg_update_aor(self, msg); /* AoR */ + tsip_transport_msg_update_aor((tsip_transport_t*)self, msg); /* AoR */ tsip_transport_msg_update(self, msg); /* IPSec, SigComp, ... */ } else if(TSIP_MESSAGE_IS_RESPONSE(msg)){ /* AoR for responses which have a contact header (e.g. 183/200 INVITE) */ if(msg->Contact){ - tsip_transport_msg_update_aor(self, msg); + tsip_transport_msg_update_aor((tsip_transport_t*)self, msg); } /* RFC 3581 - 4. Server Behavior When a server compliant to this specification (which can be a proxy @@ -281,6 +292,7 @@ tsk_size_t tsip_transport_send(const tsip_transport_t* self, const char *branch, } } else{ + ret = tsip_transport_send_raw(self, buffer->data, buffer->size); /*if(destIP && destPort) { struct sockaddr_storage to; @@ -294,10 +306,10 @@ tsk_size_t tsip_transport_send(const tsip_transport_t* self, const char *branch, } } else*/ - { - if((ret = tnet_transport_send(self->net_transport, self->connectedFD, buffer->data, buffer->size))){ - } - } + //{ + // if((ret = tsip_transport_send_raw(self, buffer->data, buffer->size))){ + // } + //} } //bail: @@ -312,20 +324,20 @@ tsk_size_t tsip_transport_send(const tsip_transport_t* self, const char *branch, tsip_uri_t* tsip_transport_get_uri(const tsip_transport_t *self, tsk_bool_t lr) { if(self){ - tnet_ip_t ip; - tnet_port_t port; + //tnet_ip_t ip; + //tnet_port_t port; tsip_uri_t* uri = tsk_null; - if(!tnet_get_ip_n_port(self->connectedFD, &ip, &port)){ + //if(!tnet_get_ip_n_port(self->connectedFD, &ip, &port)){ char* uristring = tsk_null; int ipv6 = TNET_SOCKET_TYPE_IS_IPV6(self->type); tsk_sprintf(&uristring, "%s:%s%s%s:%d;%s;transport=%s", self->scheme, ipv6 ? "[" : "", - ip, + ((tsip_stack_t*)self->stack)->network.aor.ip, ipv6 ? "]" : "", - port, + ((tsip_stack_t*)self->stack)->network.aor.port, lr ? "lr" : "", self->protocol); if(uristring){ @@ -334,7 +346,7 @@ tsip_uri_t* tsip_transport_get_uri(const tsip_transport_t *self, tsk_bool_t lr) } TSK_FREE(uristring); } - } + //} return uri; } return tsk_null; diff --git a/trunk/tinySIP/src/transports/tsip_transport_layer.c b/trunk/tinySIP/src/transports/tsip_transport_layer.c index 6b0a3258..9729260b 100644 --- a/trunk/tinySIP/src/transports/tsip_transport_layer.c +++ b/trunk/tinySIP/src/transports/tsip_transport_layer.c @@ -127,7 +127,7 @@ static int tsip_transport_layer_stream_cb(const tnet_transport_event_t* e) if(data_size){ if(is_nack){ - tnet_transport_send(transport->net_transport, transport->connectedFD, SigCompBuffer, data_size); + tsip_transport_send_raw(transport, SigCompBuffer, data_size); } else{ // append result @@ -141,7 +141,7 @@ static int tsip_transport_layer_stream_cb(const tnet_transport_event_t* e) // Query for all other chuncks while((next_size = tsip_sigcomp_handler_uncompress_next(transport->stack->sigcomp.handle, comp_id, &nack_data, &is_nack)) || nack_data){ if(is_nack){ - tnet_transport_send(transport->net_transport, transport->connectedFD, nack_data, next_size); + tsip_transport_send_raw(transport, nack_data, next_size); TSK_FREE(nack_data); } else{ @@ -243,7 +243,7 @@ static int tsip_transport_layer_dgram_cb(const tnet_transport_event_t* e) data_ptr = SigCompBuffer; if(data_size){ if(is_nack){ - tnet_transport_send(transport->net_transport, transport->connectedFD, data_ptr, data_size); + tsip_transport_send_raw(transport, data_ptr, data_size); return 0; } } @@ -422,6 +422,10 @@ int tsip_transport_layer_add(tsip_transport_layer_t* self, const char* local_hos if(TNET_SOCKET_TYPE_IS_TLS(type) || self->stack->security.enable_secagree_tls){ tsip_transport_set_tlscerts(transport, self->stack->security.tls.ca, self->stack->security.tls.pbk, self->stack->security.tls.pvk); } + /* Nat Traversal context */ + if(self->stack->natt.ctx){ + tnet_transport_set_natt_ctx(transport->net_transport, self->stack->natt.ctx); + } tsk_list_push_back_data(self->transports, (void**)&transport); return 0; } @@ -575,14 +579,25 @@ int tsip_transport_layer_start(tsip_transport_layer_t* self) transport = item->data; tsip_transport_set_callback(transport, TNET_SOCKET_TYPE_IS_DGRAM(transport->type) ? TNET_TRANSPORT_CB_F(tsip_transport_layer_dgram_cb) : TNET_TRANSPORT_CB_F(tsip_transport_layer_stream_cb), transport); - if((fd = tsip_transport_connectto_2(transport, self->stack->network.proxy_cscf, self->stack->network.proxy_cscf_port)) == TNET_INVALID_FD){ - return -3; - } - if((ret = tnet_sockfd_waitUntilWritable(fd, TNET_CONNECT_TIMEOUT))){ - TSK_DEBUG_ERROR("%d milliseconds elapsed and the socket is still not connected.", TNET_CONNECT_TIMEOUT); - tnet_transport_remove_socket(transport->net_transport, &fd); + if((ret = tnet_sockaddr_init(self->stack->network.proxy_cscf, self->stack->network.proxy_cscf_port, transport->type, &transport->pcscf_addr))){ + TSK_DEBUG_ERROR("[%s:%u] is invalid address", self->stack->network.proxy_cscf, self->stack->network.proxy_cscf_port); return ret; } + + if(TNET_SOCKET_TYPE_IS_STREAM(transport->type)){ + if((fd = tsip_transport_connectto_2(transport, self->stack->network.proxy_cscf, self->stack->network.proxy_cscf_port)) == TNET_INVALID_FD){ + TSK_DEBUG_ERROR("Failed to connect the SIP transport"); + return ret; + } + if((ret = tnet_sockfd_waitUntilWritable(fd, TNET_CONNECT_TIMEOUT))){ + TSK_DEBUG_ERROR("%d milliseconds elapsed and the socket is still not connected.", TNET_CONNECT_TIMEOUT); + tnet_transport_remove_socket(transport->net_transport, &fd); + return ret; + } + } + else{ + transport->connectedFD = tnet_transport_get_master_fd(transport->net_transport); + } } self->running = tsk_true; @@ -598,7 +613,8 @@ int tsip_transport_layer_start(tsip_transport_layer_t* self) int tsip_transport_layer_shutdown(tsip_transport_layer_t* self) { if(self){ - if(self->running){ + if(!TSK_LIST_IS_EMPTY(self->transports)){ + //if(self->running){ /*int ret = 0;*/ tsk_list_item_t *item; while((item = tsk_list_pop_first_item(self->transports))){ diff --git a/trunk/tinySIP/src/tsip.c b/trunk/tinySIP/src/tsip.c index 73add5fa..01e4cd8a 100644 --- a/trunk/tinySIP/src/tsip.c +++ b/trunk/tinySIP/src/tsip.c @@ -303,13 +303,18 @@ int __tsip_stack_set(tsip_stack_t *self, va_list* app) len -= 2; } /* reset old value */ - for(i=0; isecurity.operator_id[i] = 0x00; - } + memset(self->security.operator_id, 0, sizeof(self->security.operator_id)); + /* set new value */ if(len){ /* perhaps there were only 2 chars*/ - for(i = 0, j = 0; (isecurity.operator_id[j]); /*do not use tsk_atox(str), because str should end with '\0'.*/ + for(i = 0, j = 0; (i<(sizeof(operator_id_t) * 2) && isecurity.operator_id[j]); +#else + static unsigned _1bytes; /* do not use neither int8_t nor uint8_t */ + sscanf(&hexstr[i], "%2x", &_1bytes); + self->security.operator_id[j] = (_1bytes & 0xFF); +#endif } } } @@ -349,6 +354,26 @@ int __tsip_stack_set(tsip_stack_t *self, va_list* app) break; } + + /* === Nat Traversal === */ + case tsip_pname_stun_server: + { /* (const char*)IP_STR, (unsigned)PORT_UINT */ + const char* IP_STR = va_arg(*app, const char*); + unsigned PORT_UINT = va_arg(*app, unsigned); + /* do not check, Null==> disable STUN */ + tsk_strupdate(&self->natt.stun.ip, IP_STR); + self->natt.stun.port = PORT_UINT; + break; + } + case tsip_pname_stun_cred: + { /* (const char*)USR_STR, (const char*)PASSORD_STR */ + const char* USR_STR = va_arg(*app, const char*); + const char* PASSORD_STR = va_arg(*app, const char*); + tsk_strupdate(&self->natt.stun.login, USR_STR); + tsk_strupdate(&self->natt.stun.pwd, PASSORD_STR); + break; + } + /* === User Data === */ case tsip_pname_userdata: { /* (const void*)DATA_PTR */ @@ -482,6 +507,7 @@ bail: return stack; } + /**@ingroup tsip_stack_group * Starts a 3GPP IMS/LTE stack. This function MUST be called before you start calling any SIP function (@a tsip_*). * @param self The 3GPP IMS/LTE stack to start. This handle should be created using @ref tsip_stack_create(). @@ -491,6 +517,7 @@ int tsip_stack_start(tsip_stack_handle_t *self) { int ret = -1; tsip_stack_t *stack = self; + const char* stack_error_desc = "Failed to start the stack"; if(!stack){ TSK_DEBUG_ERROR("Invalid parameter"); @@ -573,19 +600,35 @@ int tsip_stack_start(tsip_stack_handle_t *self) /* === Runnable === */ TSK_RUNNABLE(stack)->run = run; if((ret = tsk_runnable_start(TSK_RUNNABLE(stack), tsip_event_def_t))){ - TSK_DEBUG_ERROR("Failed to start timer manager"); + stack_error_desc = "Failed to start timer manager"; + TSK_DEBUG_ERROR("%s", stack_error_desc); goto bail; } + /* === Nat Traversal === */ + // delete previous context + TSK_OBJECT_SAFE_FREE(stack->natt.ctx); + if(stack->natt.stun.ip){ + if(stack->natt.stun.port == 0){ + /* FIXME: for now only UDP(IPv4/IPv6) is supported */ + stack->natt.stun.port = TNET_STUN_TCP_UDP_DEFAULT_PORT; + } + stack->natt.ctx = tnet_nat_context_create(TNET_SOCKET_TYPE_IS_IPV6(stack->network.proxy_cscf_type)? tnet_socket_type_udp_ipv6: tnet_socket_type_udp_ipv4, + stack->natt.stun.login, stack->natt.stun.pwd); + tnet_nat_set_server(stack->natt.ctx, stack->natt.stun.ip, stack->natt.stun.port); + } + /* === Transport Layer === */ /* Adds the default transport to the transport Layer */ if((ret = tsip_transport_layer_add(stack->layer_transport, stack->network.local_ip, stack->network.local_port, stack->network.proxy_cscf_type, "SIP transport"))){ - TSK_DEBUG_ERROR("Failed to add new transport"); + stack_error_desc = "Failed to add new transport"; + TSK_DEBUG_ERROR("%s", stack_error_desc); goto bail; } /* Starts the transport Layer */ if((ret = tsip_transport_layer_start(stack->layer_transport))){ - TSK_DEBUG_ERROR("Failed to start sip transport"); + stack_error_desc = "Failed to start sip transport"; + TSK_DEBUG_ERROR("%s", stack_error_desc); goto bail; } else if(!stack->network.local_ip){ @@ -601,7 +644,8 @@ int tsip_stack_start(tsip_stack_handle_t *self) } } } - + + /* === ALL IS OK === */ if(stack->layer_transac){ /* For transaction layer */ stack->layer_transac->reliable = TNET_SOCKET_TYPE_IS_STREAM(stack->network.proxy_cscf_type); @@ -618,10 +662,10 @@ int tsip_stack_start(tsip_stack_handle_t *self) bail: - TSIP_STACK_SIGNAL(self, tsip_event_code_stack_failed_to_start, "Stack failed to start"); + TSIP_STACK_SIGNAL(self, tsip_event_code_stack_failed_to_start, stack_error_desc); /* stop all running instances */ if(stack->timer_mgr_started){ - if(!(ret = tsk_timer_mgr_global_stop())){ + if((ret = tsk_timer_mgr_global_stop()) == 0){ stack->timer_mgr_started = tsk_false; } } @@ -945,6 +989,12 @@ static tsk_object_t* tsip_stack_dtor(tsk_object_t * self) /* DNS */ TSK_OBJECT_SAFE_FREE(stack->dns_ctx); + /* NAT Traversal context */ + TSK_FREE(stack->natt.stun.ip); + TSK_FREE(stack->natt.stun.login); + TSK_FREE(stack->natt.stun.pwd); + TSK_OBJECT_SAFE_FREE(stack->natt.ctx); + /* DHCP */ /* features */ diff --git a/trunk/website/index.html b/trunk/website/index.html index 009e1561..18e222e6 100644 --- a/trunk/website/index.html +++ b/trunk/website/index.html @@ -46,6 +46,17 @@ memory and low computing power and to be extremely portable.

+

Features

    @@ -85,11 +96,13 @@
  • SDP (RFC 3264)
  • +
  • RTP/RTCP
  • +
  • XCAP (RFC 4825)
  • MSRP (RFC 4975 and 5547)
  • -
  • Audio/Video (AMR, Speex, G.711, H.264, H.263, MPEG4...)
  • +
  • Audio/Video (AMR, Speex, G.711, GSM, H.264, H.263, Theora...)
  • ...and many other features
  • @@ -138,7 +151,7 @@
    • SIP/SigComp
    • SDP
    • -
    • RTP/RTCP (using GStreamer)
    • +
    • RTP/RTCP
    • XCAP (RFC 4825)
    • MSRP/MSRPS (RFC 4975 and 5547)
    • HTTP/HTTPS (RFC 2616 and 2617)
    • @@ -157,11 +170,6 @@ read hundreds of technical specifications. The SOA machine is designed as per RFC 3264 and draft-ietf-sipping-sip-offeranswer-12.

      -

      - The media framework uses GStreamer for audio/video transport. You don't need to - understand how GStreamer works in order to develop your application but it is up - to you to compile it for your target platform. GStreamer is known to work on Windows, - Mac OS X, Android, Symbian (S60) and many other systems.